#ifndef GAME_H_7D2B65AE #define GAME_H_7D2B65AE #include #include #include #include #include "map.h" #include "muxer.h" #include "timer.h" #include "animation.h" #include "interpolation.h" #include "consts.h" constexpr int TilesetIndex(int x, int y) { return x + y * 24; } 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; int renderId = -1; bool dirtyRender = true; }; class Game { public: Game(std::mt19937& rng, Muxer& muxer); void update(size_t dt); std::mt19937& rng; Muxer& muxer; bool quit = false; LoseState losing = LoseState::None; Map map; std::list kickups; int litSpots = 0; bool dirtyLighting = true; bool dirtyRender = true; size_t numLamps = 0; size_t numDust = 0; int player_x = 0; int player_y = 0; int player_oldx = 0; int player_oldy = 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; Input keystate; bool firstInput = false; Input lastInput; bool alreadyBumped = false; Timer bumpCooldown = {500}; Interpolation moveProgress; bool moving = false; bool queueDash = false; Timer dustTimer = {40}; Timer inputTimer = {50}; Timer losePopLampTimer = {800}; Timer losePopPlayerTimer = {3000}; Timer zoomTimer = {62}; private: void tick( int x1, int y1, int x2, int y2, bool invert = false, bool onlyDark = false); void tick(bool onlyDark = false); bool movePlayer(int x, int y); void recalculateLighting(); void recalculateRender(); bool processKeys(const Input& keystate); void kickUpDust(int x, int y, size_t chain); void popLamp(int x, int y, size_t chain); void processKickup(); void growMap(size_t zoom); void setZoom(size_t zoom); void performDash(); }; #endif /* end of include guard: GAME_H_7D2B65AE */