From e8fc3e728d64f293ea0086cd45555b0e6d500843 Mon Sep 17 00:00:00 2001 From: Mario Liebisch Date: Sun, 2 Sep 2018 18:28:51 +0200 Subject: [PATCH] Initial commit --- .editorconfig | 9 + .gitignore | 2 + CMakeLists.txt | 6 + LICENSE | 7 + assets/CMakeLists.txt | 4 + assets/fonts/CompassPro.md | 1 + assets/fonts/CompassPro.ttf | Bin 0 -> 19836 bytes assets/sounds/drop.wav | Bin 0 -> 40522 bytes assets/sounds/ping0.wav | Bin 0 -> 70014 bytes assets/sounds/ping1.wav | Bin 0 -> 54518 bytes assets/textures/bat0.png | Bin 0 -> 1338 bytes assets/textures/bat1.png | Bin 0 -> 1249 bytes readme.md | 47 ++++ source/CMakeLists.txt | 17 ++ source/game.cpp | 424 ++++++++++++++++++++++++++++++++++++ source/game.hpp | 70 ++++++ source/icon.cpp | 192 ++++++++++++++++ source/icon.ico | Bin 0 -> 2238 bytes source/main.cpp | 27 +++ source/resources.rc | 1 + 20 files changed, 807 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 assets/CMakeLists.txt create mode 100644 assets/fonts/CompassPro.md create mode 100644 assets/fonts/CompassPro.ttf create mode 100644 assets/sounds/drop.wav create mode 100644 assets/sounds/ping0.wav create mode 100644 assets/sounds/ping1.wav create mode 100644 assets/textures/bat0.png create mode 100644 assets/textures/bat1.png create mode 100644 readme.md create mode 100644 source/CMakeLists.txt create mode 100644 source/game.cpp create mode 100644 source/game.hpp create mode 100644 source/icon.cpp create mode 100644 source/icon.ico create mode 100644 source/main.cpp create mode 100644 source/resources.rc diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d4251ed --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +insert_final_newline = true +indent_style = space +indent_size = 4 +charset = utf-8-bom +trim_trailing_whitespace = true +tab_width = 4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b236644 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +release diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..7236cb1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.8) + +project(a-maze-batz) + +add_subdirectory(source) +add_subdirectory(assets) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ac2d8cf --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2018 Mario Liebisch + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/assets/CMakeLists.txt b/assets/CMakeLists.txt new file mode 100644 index 0000000..c44f60f --- /dev/null +++ b/assets/CMakeLists.txt @@ -0,0 +1,4 @@ +install(DIRECTORY fonts DESTINATION assets) +install(DIRECTORY sounds DESTINATION assets) +install(DIRECTORY textures DESTINATION assets) +install(DIRECTORY levels DESTINATION assets) diff --git a/assets/fonts/CompassPro.md b/assets/fonts/CompassPro.md new file mode 100644 index 0000000..9a3029a --- /dev/null +++ b/assets/fonts/CompassPro.md @@ -0,0 +1 @@ +Compass Pro is a free font by [Eeve Somepx](https://somepx.itch.io/humble-fonts-free). diff --git a/assets/fonts/CompassPro.ttf b/assets/fonts/CompassPro.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5432d659a3b4780312ef81d6191c2bb6ea712a20 GIT binary patch literal 19836 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 nfv3Mh-)p^IYhUNx>#eiS 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%0Dj;ia3 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/ping0.wav b/assets/sounds/ping0.wav new file mode 100644 index 0000000000000000000000000000000000000000..b2eb2f995f56d040369ada79d62b712746af50b8 GIT binary patch literal 70014 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/ping1.wav b/assets/sounds/ping1.wav new file mode 100644 index 0000000000000000000000000000000000000000..5263648798a89fe06aae0a013790801de0d64496 GIT binary patch literal 54518 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℞ob5T=Byp0+c>+H-Z^qw@mx`8( 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 P7MRllb6Vj4pBDH(4N_g- literal 0 HcmV?d00001 diff --git a/assets/textures/bat0.png b/assets/textures/bat0.png new file mode 100644 index 0000000000000000000000000000000000000000..736aabe482a310139429f29122b17cc8ed4e0b8a GIT binary patch literal 1338 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 LNkvXXu0mjfmCa?Q literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d933fe2 --- /dev/null +++ b/readme.md @@ -0,0 +1,47 @@ +# A-Maze Batz +*A small casual game entry for the [Game Maker's Toolkit Game Jam 2018](https://itch.io/jam/gmtk-2018).* + +© 2018 Mario Liebisch + +## About the Game + +You're helping **Batz** on his way through dark and deep caverns on the look for the one thing that really matters: **Batsie**. This must be true bat love in some way, although Batsie seems to leave our hero from time to time and he'll have to find her once again. + + There's no real end: Once the last level has been beaten, the game will simply restart from the first one. You can even create your own levels and challenge your friends to find Batsie as fast as possible. + +You can't really lose the game. There are no lives, there's no timer. Some kind of time attack mode was planned, but I was lacking time so far. In its current form, consider this a prototype and proof of concept. + +**This project originalted in a game jam weekend in a total of less than 24 hours.** This code isn't clean and it's clearly not built around best practices and optimization only. If you're curious, have a look, but always keep this in mind. + +## Controls + +The game controls are pretty straight forward: + +* **Cursor Keys** and **W/A/S/D**: Steer Batz through the dark saves. +* **Space**: Use Batz's sonar to identify caverns, tunnels and openings. Batsie will also answer your call, if she can hear you. + +## Building the Game + +To build the game, you'll need a recent version of [CMake](https://cmake.org/) as well as [SFML](https://sfml-dev.org/) and an up-to-date C/C++ toolchain (like GCC, MinGW, Visual Studio, etc.). + +To configure and build the project, just run CMake in the usual way: `cmake path/to/source`. + +You might have to specify to your SFML installation: `cmake -DSFML_DIR=C:/Code/SFML/lib/cmake/SFML path/to/source` (note the sub path pointing inside the installation directory). + +## License + +This game is released under the [MIT License](LICENSE). Feel free to use all or portions of it in your own projects. If you finish some cool project, I'd love to hear about it! + +## Modding and Level Editing + +The game's levels are stored in a very simple and easy to edit way. Open the sub directory `assets/levels`, where you'll find one PNG image per level. + +You can edit existing levels or create new ones, simply creating a new file following the existing numbering pattern. If the last level is `level5.png`, save your own level as `level6.png` to extend the game. There's no need to recompile or rebuild the game in order to test new levels. + +There are a few tiny things to keep in mind here: + +* Your PNG file has to be saved as an 24-bit or 32-bit color PNG image. 8-bit PNGs are not supported. +* Fully black parts (RGB: 0/0/0) are considered solid. You don't have to fill shapes. Even 1 pixel thin lines should count, although sonar pings might pass through thin diagonal lines. +* Make sure that tunnels and choke points are at least 10-12 pixels wide. +* Green pixels (RGB: 0/255/0) are potential starting positions. If there's more than one position available, the actual starting position will be picked at random. +* Red pixels (RGB: 255/0/0) are potential goal positions, i.e. where Batsie may be found. \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..9974020 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,17 @@ +find_package(SFML 2.5 COMPONENTS audio graphics main) + +set(SOURCES main.cpp game.hpp game.cpp icon.cpp) +if (WIN32) +list(APPEND SOURCES resources.rc) +endif() + +add_executable(a-maze-batz ${SOURCES}) + +set_target_properties(a-maze-batz PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}") +target_link_libraries(a-maze-batz sfml-graphics sfml-audio sfml-main) + +if(MSVC) +set_target_properties(a-maze-batz PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") +endif() + +install(TARGETS a-maze-batz DESTINATION .) diff --git a/source/game.cpp b/source/game.cpp new file mode 100644 index 0000000..8e91e12 --- /dev/null +++ b/source/game.cpp @@ -0,0 +1,424 @@ +#include "game.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +extern const char *iconData; + +Game::Game() { + mWindow.create({ 512, 288 }, L"A-Maze Batz – a GMTK Game Jam 2018 entry", sf::Style::Close | sf::Style::Titlebar); + mWindow.setVerticalSyncEnabled(true); + mWindow.setIcon(32, 32, reinterpret_cast(iconData)); + + mPlayer.setTexture(get("assets/textures/bat0.png")); + mPlayer.setTextureRect({ 0, 0, 32, 16 }); + mPlayer.setOrigin(16, 8); + + mGoal.setTexture(get("assets/textures/bat1.png")); + mGoal.setTextureRect({ 0, 0, 32, 16 }); + mGoal.setOrigin(16, 8); + + mSonar.reserve(5000); +} + +Game::~Game() { +} + +int Game::run() { + sf::RenderTexture mScreen; + mScreen.create(256, 144); + sf::Sprite mShow(mScreen.getTexture()); + + sf::View view({ 128, 72 }, { 256, 144 }); + sf::View sview({ 128, 72 }, { 256, 144 }); + mWindow.setView(sview); + + sf::Clock timer; + sf::Time elapsed; + const sf::Time frameTime(sf::seconds(1) / 60.f); + long tick = 0; + + unsigned char movement = None; + Direction dir = Right; + bool lastLeft = false; + + if (!resetLevel()) + throw Exception("Couldn't load the first level!"); + + sf::Sound ping0(get("assets/sounds/ping0.wav")); + sf::Sound ping0e(get("assets/sounds/ping0.wav")); + ping0e.setVolume(25); + sf::Sound ping1(get("assets/sounds/ping1.wav")); + sf::Sound ping1e(get("assets/sounds/ping1.wav")); + ping1e.setVolume(25); + sf::Sound drop(get("assets/sounds/drop.wav")); + sf::Sound drope(get("assets/sounds/drop.wav")); + drope.setVolume(25); + + sf::RectangleShape white({ 256,144 }); + white.setFillColor(sf::Color::White); + + sf::Font &font = get("assets/fonts/CompassPro.ttf"); + const_cast(font.getTexture(16)).setSmooth(false); + + sf::Text intro("Can you help Batz to find love?\n\nUse the cursor keys or [WASD],\n and [Space] to find your way!\n\n [Space] Start game\n [Alt] + [Return] Fullscreen", font, 16); + intro.setPosition(32, 8); + intro.setOutlineThickness(1); + intro.setOutlineColor(sf::Color::Black); + intro.setFillColor(sf::Color::White); + + sf::Text outro("Unfortunately, this was the last level.\n\n Hit [Space] to restart the game\n or use [Esc] to quit the game.", font, 16); + outro.setPosition(8, 8); + outro.setOutlineThickness(1); + outro.setOutlineColor(sf::Color::Black); + outro.setFillColor(sf::Color::White); + + sf::Text caption("Level 1", font, 16); + caption.setPosition(8, 8); + caption.setOutlineThickness(1); + caption.setOutlineColor(sf::Color::Black); + caption.setFillColor(sf::Color::White); + + float fading = 0; + + while (mWindow.isOpen()) { + sf::Event event; + while (mWindow.pollEvent(event)) { + switch (event.type) { + case sf::Event::Closed: + mWindow.close(); + break; + case sf::Event::KeyPressed: + switch (event.key.code) { + case sf::Keyboard::Return: + if (event.key.alt) { + mFullscreen = !mFullscreen; + if (mFullscreen) { + sf::VideoMode vm(sf::VideoMode::getDesktopMode()); + mWindow.create(vm, "A-Maze Batz – a GMTK Game Jam 2018 entry", sf::Style::Close | sf::Style::Fullscreen); + mWindow.setMouseCursorVisible(false); + + const float ar = static_cast(vm.width) / static_cast(vm.height); + const float tar = 16.f / 9.f; + + if (ar < tar) + sview.setViewport({ 0, .5f - ar / tar / 2.f, 1, ar / tar }); + else + sview.setViewport({ .5f - tar / ar / 2.f, 0, tar / ar, 1 }); + } + else { + mWindow.create({ 512, 288 }, "A-Maze Batz – a GMTK Game Jam 2018 entry", sf::Style::Close | sf::Style::Titlebar); + mWindow.setMouseCursorVisible(true); + sview.setViewport({ 0, 0, 1, 1 }); + } + } + break; + case sf::Keyboard::Space: + if (fading < 1) { + + } + if (mIntro) { + mIntro = false; + mLevelTimer.restart(); + break; + } + else if (mEnd) { + mIntro = true; + resetLevel(); + caption.setString("Level " + std::to_string(mLevelNumber)); + break; + } + if (mSonarTimer.getElapsedTime() < sf::seconds(.5f)) + break; + mSonarTimer.restart(); + ping(mPlayer.getPosition(), 0, 2 * PI, 32, sf::Color::White); + ping0.play(); + break; + case sf::Keyboard::A: + case sf::Keyboard::Left: + movement |= Left; + dir = Left; + lastLeft = true; + break; + case sf::Keyboard::D: + case sf::Keyboard::Right: + movement |= Right; + dir = Right; + lastLeft = false; + break; + case sf::Keyboard::W: + case sf::Keyboard::Up: + movement |= Up; + dir = Up; + break; + case sf::Keyboard::S: + case sf::Keyboard::Down: + movement |= Down; + dir = Down; + break; + case sf::Keyboard::Escape: + mWindow.close(); + break; + } + break; + case sf::Event::KeyReleased: + switch (event.key.code) { + case sf::Keyboard::A: + case sf::Keyboard::Left: + movement &= ~Left; + break; + case sf::Keyboard::D: + case sf::Keyboard::Right: + movement &= ~Right; + break; + case sf::Keyboard::W: + case sf::Keyboard::Up: + movement &= ~Up; + break; + case sf::Keyboard::S: + case sf::Keyboard::Down: + movement &= ~Down; + break; + } + break; + } + } + + if (mIntro || mEnd) + fading = 0; + else if (mWon) + fading = std::max(0.f, 1.f - mLevelTimer.getElapsedTime() / sf::seconds(1)); + else + fading = mLevelTimer.getElapsedTime() / sf::seconds(1); + + if (mWon && !mEnd && mLevelTimer.getElapsedTime() > sf::seconds(1)) { + mEnd = !resetLevel(mLevelNumber + 1); + caption.setString("Level " + std::to_string(mLevelNumber)); + if (!mEnd) { + mLevelTimer.restart(); + } + } + + + elapsed += timer.restart(); + + long ticks = 0; + while (elapsed > frameTime) { + elapsed -= frameTime; + ++tick; + + if (++ticks == 10 || mIntro || mEnd || mWon) { // max 10 updates between draws + elapsed = sf::Time::Zero; + break; + } + const sf::Vector2f pos(mPlayer.getPosition()); + + if (!mWon && !mIntro) { + if (movement & Left && !solid(pos - sf::Vector2f(5, 0))) { + mPlayer.move(-1, 0); + } + if (movement & Right && !solid(pos + sf::Vector2f(5, 0))) { + mPlayer.move(1, 0); + } + if (movement & Up && !solid(pos - sf::Vector2f(0, 5))) { + mPlayer.move(0, -1); + } + if (movement & Down && !solid(pos + sf::Vector2f(0, 5))) { + mPlayer.move(0, 1); + } + } + + if (tick % 50 == 0) { + ping(*(mDroppers.begin() + (rand() % mDroppers.size())), .5f * PI, .5f * PI, 1, sf::Color::Cyan, .5f); + } + + unsigned char ga = mGoal.getColor().a; + const sf::FloatRect gr = mGoal.getGlobalBounds(); + for (int i = 0; i < 2; ++i) { + for (auto &ping : mSonar) { + if (ping.texCoords.x != 0 || ping.texCoords.y != 0) { + if (solid(ping.position + ping.texCoords)) { + if (ping.color.a > 64) { + if (ping.color.r == 0 && ping.color.g == 255 && ping.color.b == 255) // Water drops + drop.play(); + } + + ping.color.a /= 2; + if (ping.color.a > 64) { + this->ping(ping.position, 0, 2 * PI, 32, ping.color); + if (ping.color.r == 255 && ping.color.g == 255 && ping.color.b == 255) + ping0e.play(); + else if (ping.color.r == 0 && ping.color.g == 255 && ping.color.b == 255) + drope.play(); + else + ping1e.play(); + } + ping.position += ping.texCoords; + ping.texCoords = { 0, 0 }; + } + else + ping.position += ping.texCoords; + } + ping.color.a -= 1; + if (gr.contains(ping.position) && ping.color.r == 255 && ping.color.g == 255 && ping.color.b == 255) { + ga = static_cast(std::min(255, ga + ping.color.a / 64)); + if (mGoalSonarTimer.getElapsedTime() > sf::seconds(.5f) && ping.color.a > 128) { + mGoalSonarTimer.restart(); + this->ping(mGoal.getPosition(), 0, 2 * PI, 32, { 255, 192, 192, 127 }, .5f); + ping1.play(); + } + } + } + mSonar.erase(std::remove_if(mSonar.begin(), mSonar.end(), [](const sf::Vertex &ping) { return ping.color.a == 0; }), mSonar.end()); + } + + if (mWon) { + + } + else { + + if (ga > 4) + ga -= 4; + else + ga = 0; + + if (ga > 192 && gr.intersects(mPlayer.getGlobalBounds())) { + // Win! + mWon = true; + mGoal.setColor(sf::Color::White); + mLevelTimer.restart(); + } + + mGoal.setColor({ 255, 255, 255, ga }); + } + } + + mPlayer.setTextureRect({ movement & Up ? 64 : (lastLeft ? 0 : 32), 16 * std::abs(-2 + ((tick >> 3) % 6)), 32, 16 }); + mGoal.setTextureRect({ 0, 16 * std::abs(-2 + (((tick >> 3) + 4) % 6)), 32, 16 }); + view.setCenter(mPlayer.getPosition()); + + mScreen.setView(view); + mScreen.clear(); + + mScreen.draw(mGoal); + mScreen.draw(mSonar.data(), mSonar.size(), sf::Points); + mScreen.draw(mPlayer); + + view.setCenter(view.getSize() / 2.f); + mScreen.setView(view); + + if (!mWon) { + if (fading < 2) { + const sf::Uint8 a = static_cast(255 * std::max(0.f, 2.f - fading) / 2.f); + caption.setFillColor({ 255, 255, 255, a }); + caption.setOutlineColor({ 0, 0, 0, a }); + mScreen.draw(caption); + } + } + + if (fading < 1) { + white.setFillColor({ 255, 255, 255, static_cast(255 * (1.f - fading)) }); + mScreen.draw(white); + } + + if (mIntro) + mScreen.draw(intro); + else if (mEnd) + mScreen.draw(outro); + + mScreen.display(); + + mWindow.setView(view); + mWindow.clear(); + mWindow.setView(sview); + mWindow.draw(mShow); + mWindow.display(); + } + return 0; +} + +void Game::ping(const sf::Vector2f &pos, const float from, const float to, const unsigned char count, const sf::Color &color, const float speed) { + /*switch (dir) { + case None: + from = 0; + to = 2 * PI; + break; + case Up: + from = PI; + to = 2 * PI; + break; + case Down: + from = 0; + to = PI; + break; + case Left: + from = .5f * PI; + to = 1.5f * PI; + break; + case Right: + from = -.5f * PI; + to = .5f * PI; + break; + }*/ + + //for (float a = from; a <= to; a += 2.f * PI / count) { + for (unsigned int i = 0; i < count; ++i) { + const float a = from + i * (to - from) / count; + mSonar.push_back({ pos, color, {speed * cos(a), speed * sin(a)} }); + } +} + +bool Game::solid(const sf::Vector2f &pos) const { + if (pos.x < 0 || pos.x >= mWidth || pos.y < 0 || pos.y >= mHeight) + return true; + return mLevel.getPixel(static_cast(pos.x), static_cast(pos.y)) == sf::Color::Black; +} + +bool Game::resetLevel(unsigned int newLevel) { + const std::string file(std::string("assets/levels/level") + std::to_string(newLevel) + ".png"); + if (!mLevel.loadFromFile(file)) { + mEnd = true; + return false; + } + + mLevelNumber = newLevel; + mWon = false; + mEnd = false; + const sf::Vector2i size(mLevel.getSize()); + mWidth = size.x; + mHeight = size.y; + + std::vector starts; + std::vector goals; + for (std::size_t y = 0; y < mHeight; ++y) + for (std::size_t x = 0; x < mWidth; ++x) { + sf::Color pixel = mLevel.getPixel(x, y); + if (pixel == sf::Color(255, 0, 0, 255)) { // goal + goals.push_back({ static_cast(x), static_cast(y) }); + } + else if (pixel == sf::Color(0, 255, 0, 255)) { // start + starts.push_back({ static_cast(x), static_cast(y) }); + } + else if (pixel == sf::Color(0, 0, 255, 255)) { // water dripping + mDroppers.push_back({ static_cast(x), static_cast(y) }); + } + } + + if (starts.empty()) + throw Exception("The level doesn't contain valid start pixels"); + if (goals.empty()) + throw Exception("The level doesn't contain valid goal pixels"); + + mGoal.setPosition(*(goals.begin() + (rand() % goals.size()))); + mPlayer.setPosition(*(starts.begin() + (rand() % starts.size()))); + + mLevelTimer.restart(); + mSonarTimer.restart(); + mSonar.clear(); + return true; +} diff --git a/source/game.hpp b/source/game.hpp new file mode 100644 index 0000000..7505b6b --- /dev/null +++ b/source/game.hpp @@ -0,0 +1,70 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +constexpr float PI = 3.1415f; + +enum Direction { + None = 0, + Left = 1, + Right = 2, + Up = 4, + Down = 8 +}; + +class Exception : public std::exception { +public: + Exception(const std::string &what) : mWhat(what) { } + const char *what() const noexcept { return mWhat.c_str(); } +private: + std::string mWhat; +}; + +class Game { +public: + Game(); + ~Game(); + int run(); +private: + sf::RenderWindow mWindow; + std::vector mSonar; + std::vector mDroppers; + sf::Sprite mPlayer; + sf::Sprite mGoal; + sf::Clock mSonarTimer; + sf::Clock mGoalSonarTimer; + sf::Image mLevel; + std::size_t mLevelNumber = 0; + std::size_t mWidth; + std::size_t mHeight; + bool mWon = false; + bool mIntro = true; + bool mEnd = false; + bool mFullscreen = false; + sf::Clock mLevelTimer; + + template T& get(const std::string &file) const { + static std::map> mCache; + auto &entry = mCache[file]; + if (!entry) { + entry.reset(new T()); + if (!entry->loadFromFile(file)) + throw Exception("Failed to load file '" + file + "'!"); + } + return *entry; + } + + void ping(const sf::Vector2f &pos, const float from, const float to, const unsigned char count, const sf::Color &color, const float speed = 1.f); + bool solid(const sf::Vector2f &pos) const; + bool resetLevel(unsigned int newLevel = 1); +}; diff --git a/source/icon.cpp b/source/icon.cpp new file mode 100644 index 0000000..dab5004 --- /dev/null +++ b/source/icon.cpp @@ -0,0 +1,192 @@ +const char *iconData = "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\377\377\377" + "\000\377\377\377\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\000\000\000\377\377\377\377\377\377\377\377\377\000\000\000\377" + "\000\000\000\377\377\377\377\377\377\000\000\377\000\000\000\377\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\000\000\000\377\377\377\377\377\377\000\000\377\377\000\000\377\377\377" + "\377\377\377\000\000\377\177\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\000\000\000\377\377\377\377\377\377\000\000\377\377\000\000\377\377\000\000\377" + "\377\000\000\377\177\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\000\000\000\377\377\000\000\377\377\000\000\377\377\000\000\377\177\000\000\377" + "\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\000\000\000\377\377\000\000\377\177\000\000\377\000\000\000\377\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000\000\377" + "\240\240\240\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000" + "\377\240\240\240\377\000\000\000\377\000\000\000\377\000\000\000\377\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\000\000\000\377\000\000\000\377\240\240\240\377\240\240\240\377\240\240\240\377\300" + "\300\300\377\240\240\240\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\240\240\240\377" + "\300\300\300\377\240\240\240\377\240\240\240\377\240\240\240\377\000\000\000\377" + "\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\240" + "\240\240\377\240\240\240\377\300\300\300\377\300\300\300\377\240\240\240" + "\377\377\377\377\377\300\300\300\377\240\240\240\377\000\000\000\377\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\240\240\240\377\300" + "\300\300\377\377\377\377\377\240\240\240\377\300\300\300\377\300\300\300" + "\377\240\240\240\377\240\240\240\377\000\000\000\377\000\000\000\377\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\240\240\240" + "\377\240\240\240\377\300\300\300\377\300\300\300\377\377\377\377\377\240" + "\240\240\377\377\377\377\377\377\377\377\377\240\240\240\377\300\300\300" + "\377\240\240\240\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\240\240\240" + "\377\300\300\300\377\240\240\240\377\377\377\377\377\377\377\377\377\240" + "\240\240\377\377\377\377\377\300\300\300\377\300\300\300\377\240\240\240" + "\377\240\240\240\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000" + "\000\000\000\377\240\240\240\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\240\240" + "\240\377\377\377\377\377\377\377\377\377\377\377\377\377\240\240\240\377" + "\377\377\377\377\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\000\000\000\377\377\377\377\377\240\240\240\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\240\240\240\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\240\240\240\377\000\000\000\377\377\377\377\000\377\377\377\000\000" + "\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\000\000\000\377\000\000\000\377\377\377\377\377\240\240\240\377\377\377\377\377\000" + "\000\000\377\377\377\377\377\000\000\000\377\240\240\240\377\000\000\000\377\377\377\377" + "\377\240\240\240\377\000\000\000\377\377\377\377\377\240\240\240\377\377\377\377" + "\377\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\000\000\000\377\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\000\000\000\377\377\377\377\377\377\377\377\377\000\000\000\377\377" + "\377\377\377\000\000\000\377\300\300\300\377\000\000\000\377\300\300\300\377\240\240" + "\240\377\000\000\000\377\377\377\377\377\377\377\377\377\000\000\000\377\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000\000\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\300\300\300\377\240" + "\240\240\377\000\000\000\377\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\377\377" + "\377\377\300\300\300\377\300\300\300\377\300\300\300\377\240\240\240\377" + "\240\240\240\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\000\000\000\377\240\240\240\377\240\240\240\377\240\240\240\377\240" + "\240\240\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000\000\377\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377\000\000\000\377\000\000" + "\000\377\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377" + "\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377" + "\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377" + "\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000\377\377\377\000" + "\377\377\377\000\377\377\377\000"; diff --git a/source/icon.ico b/source/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6cc70ee57441acbfbd79ffd48d80fc38954f2162 GIT binary patch literal 2238 zcmeHJF-`+95Zs(?C0#n&q~sOAw~&w$iGPrk`~p)^@`Xrw0Ffw2B*-vp`+SFDN1~xX zw~6ib&g^>ZJKdegh`;$<*iYnfB61-jmuw8l4V%V;r6Epo50M2MuwJj>y@wjnp$%s+ z+ynpo9&mqZ`pl^=n6L_^pV;?PxmY&WFRl{P3dylX&dJWH)N1l6wG_$vN}zLMX!X^_ zS!=6=bZ*xCJixXbM{#0>xO&ml4L*CLI6?h)Q4P@y`AVQE%t?r9fTFF{mGacd-ys{07#LP_0tg0&#Q9vT@cEm@G%PV%UNNJ&Eu|IX<&74xJSWfcX2G|f4J zIO1mrio3J8UYDk>Anv~)tR4z4`?mYM2DUH2>Hyqb0q?KC+Xrx5M26z~8L*oI-r#9D m`g#z#UGfvd^D1wQAMeMT*>SpC;Q1cGG`F9px!Mk^0Dl7=`Fh6y literal 0 HcmV?d00001 diff --git a/source/main.cpp b/source/main.cpp new file mode 100644 index 0000000..99a6aa0 --- /dev/null +++ b/source/main.cpp @@ -0,0 +1,27 @@ +#include "game.hpp" +#include +#ifdef WIN32 +#define WIN32_EXTRA_LEAN +#include +#else +#include +#endif + +int main(int argc, char **argv) { +#ifdef NDEBUG + try { +#endif + Game game; + return game.run(); +#ifdef NDEBUG + } + catch (const Exception &exception) { +#ifdef WIN32 + MessageBoxA(0, exception.what(), "An unhandled exception appeared in A-Maze Batz!", MB_ICONSTOP | MB_OK); +#else + std::cerr << "An unhandled exception appeared in A-Maze Batz!\n\nException: " << exception.what() << std::endl; +#endif + return 1; + } +#endif +} diff --git a/source/resources.rc b/source/resources.rc new file mode 100644 index 0000000..1c302d4 --- /dev/null +++ b/source/resources.rc @@ -0,0 +1 @@ +100 ICON "icon.ico" \ No newline at end of file