A weird game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
turings-tarpit/game_engine.hpp

76 lines
1.5 KiB

#pragma once
#include <string>
#include <map>
#include <array>
#include <sstream>
#include "fsm.hpp"
#include <fmt/core.h>
using std::string;
enum class GameState {
START, IDLE, IN_ROUND, DEAD, SUCCESS, FAILURE
};
enum class GameEvent {
BUILD_START, BUILD_SUCCESS,
BUILD_DONE, BUILD_FAILED, HIT
};
enum class GameBonus {
MORE_HP, FREE_DEATH
};
class GameEngine : DeadSimpleFSM<GameState, GameEvent> {
std::map<string, int> damage_types{
{"error", 4},
{"warning", 1},
{"note", 0},
};
public:
int starting_hp = 0;
int hit_points = 0;
int hits_taken = 0;
int rounds = 0;
int streak = 0;
float hp_bonus = 1.0f;
bool free_death = false;
GameEngine(int hp);
// FOUND BUG: I was accidentally copying this and shouldn't have been
GameEngine(GameEngine &g) = delete;
int determine_damage(string &type);
bool is_dead();
void event(GameEvent ev, string hit_type="") {
switch(_state) {
FSM_STATE(GameState, START, start, ev);
FSM_STATE(GameState, IDLE, idle, ev);
FSM_STATE(GameState, DEAD, dead, ev);
FSM_STATE(GameState, SUCCESS, success, ev);
FSM_STATE(GameState, FAILURE, failure, ev);
case GameState::IN_ROUND:
in_round(ev, hit_type);
break;
}
}
void start(GameEvent ev);
void idle(GameEvent ev);
void in_round(GameEvent ev, string &hit_type);
void dead(GameEvent ev);
void success(GameEvent ev);
void failure(GameEvent ev);
void heal();
bool hit(string &type);
void reset();
void add_bonus(GameBonus bonus);
int max_hp();
};