about summary refs log tree commit diff stats
path: root/util/generate_gamedata.rb
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2024-05-30 13:25:13 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2024-05-30 13:25:13 -0400
commite973aead7d1e495f80ddc321ee634a91753cb03f (patch)
treee42d9381e08e7796a6ae6796bc9ea2089a2e54d6 /util/generate_gamedata.rb
parent2b0fcdde3144213676324163d721150a8641d610 (diff)
downloadlingo-archipelago-e973aead7d1e495f80ddc321ee634a91753cb03f.tar.gz
lingo-archipelago-e973aead7d1e495f80ddc321ee634a91753cb03f.tar.bz2
lingo-archipelago-e973aead7d1e495f80ddc321ee634a91753cb03f.zip
Bump version v3.0.2
Diffstat (limited to 'util/generate_gamedata.rb')
0 files changed, 0 insertions, 0 deletions
'>143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
#ifndef GAME_H_7D2B65AE
#define GAME_H_7D2B65AE

#include <tuple>
#include <set>
#include <random>
#include <list>
#include "map.h"
#include "muxer.h"
#include "timer.h"
#include "animation.h"
#include "interpolation.h"
#include "consts.h"
#include "sign.h"
#include "menu.h"

class Renderer;

constexpr int TilesetIndex(int x, int y) {
  return x + y * 25;
}

enum class LoseState {
  NewGame,
  None,
  PoppingLamps,
  PoppingPlayer,
  Outro,
  Done
};

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);
  }
};

struct Kickup {
  int x;
  int y;
  size_t cur;
  size_t radius;
  size_t chain;
  std::set<coord> done;
  std::set<coord> front;
};

class Game {
public:

  Game(std::mt19937& rng, Muxer& muxer, Renderer& render);

  void update(size_t dt);

  std::mt19937& rng;
  Muxer& muxer;
  Renderer& renderer;

  bool quit = false;
  bool quitting = false; // <- whether we will quit after losing, vs starting a new game
  LoseState losing = LoseState::NewGame;

  Interpolation initialFade;
  bool startedMusic = false;

  Map map;
  std::list<Kickup> kickups;
  int litSpots = 0;
  bool dirtyLighting = true;
  bool dirtyRender = true;
  size_t numLamps = 0;
  size_t numDust = 0;
  std::vector<Tile> mapDoubleBuffer;
  int ticksNeeded = 0;
  Timer gradualTickTimer = {100};

  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 oldZoom = INIT_ZOOM;
  bool zooming = false;
  Interpolation zoomProgress;

  double getZoomBasis() const { return zooming ? std::max(curZoom, oldZoom) : curZoom; }

  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};

  std::vector<std::string> signTexts;
  int nextSignIndex = 0;
  SignInstructionState signInstructionState = SignInstructionState::Hidden;
  Interpolation signFade;
  Sign sign;

  Menu menu;

private:

  void tickDirty(bool onlyDark);

  void tickOuter(bool onlyDark = false);

  void tick(
    int x1,
    int y1,
    int x2,
    int y2,
    bool invert = false,
    bool onlyDark = false);

  void tick(bool onlyDark = false);

  bool isInitialCaveBigEnough() const;

  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 loadMap();

  void setZoom(size_t zoom);

  void performDash();

  void updatePlaying(size_t frameTime);

};

#endif /* end of include guard: GAME_H_7D2B65AE */