#ifndef GAME_H_7D2B65AE #define GAME_H_7D2B65AE #include #include #include #include #include "map.h" #include "muxer.h" #include "timer.h" #include "animation.h" const int GAME_WIDTH = 640*2; const int GAME_HEIGHT = 480*2; const int TILE_WIDTH = 8*2; const int TILE_HEIGHT = TILE_WIDTH; const int INIT_ZOOM = 10; const int ZOOM_X_FACTOR = 8; const int ZOOM_Y_FACTOR = 6; const int RADIUS = 8; enum class Tile { Floor, Wall, Dust, Lamp }; enum class Source { None, Dust, Lamp, Player }; enum class LoseState { None, PoppingLamps, PoppingPlayer, Outro }; struct Input { bool left = false; bool right = false; bool up = false; bool down = false; bool operator==(const Input& rhs) const { return std::tie(left, right, up, down) == std::tie(rhs.left, rhs.right, rhs.up, rhs.down); } bool operator!=(const Input& rhs) const { return !(*this == rhs); } }; using coord = std::tuple; struct Kickup { int x; int y; size_t cur; size_t radius; size_t chain; std::set done; std::set front; }; struct MapData { Tile tile = Tile::Floor; bool lit = false; bool wasLit = false; size_t dustLife = 0; Source lightType = Source::None; int lightRadius = 0; std::set litTiles; }; class Game { public: Game(std::mt19937& rng) : rng(rng), map( -INIT_ZOOM * ZOOM_X_FACTOR / 2, -INIT_ZOOM * ZOOM_Y_FACTOR / 2, INIT_ZOOM * ZOOM_X_FACTOR, INIT_ZOOM * ZOOM_Y_FACTOR) { } std::mt19937& rng; Muxer muxer; Map map; std::list kickups; int litSpots = 0; bool dirtyLighting = true; size_t numLamps = 0; size_t numDust = 0; int player_x = 0; int player_y = 0; bool renderPlayer = true; Animation playerAnim {"../res/player_anim.txt"}; int maxZoom = INIT_ZOOM; int curZoom = INIT_ZOOM; int curBoundX = map.getLeft(); int curBoundY = map.getTop(); bool zooming = false; int zoomProgress = 0; int zoomLength; int lastZoomTop; int lastZoomLeft; int lastZoomWidth; int lastZoomHeight; bool firstInput = false; Input lastInput; bool alreadyBumped = false; Timer bumpCooldown = {500}; }; #endif /* end of include guard: GAME_H_7D2B65AE */