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.
93 lines
1.9 KiB
93 lines
1.9 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) {
|
|
case GameState::IN_ROUND:
|
|
in_round(ev, hit_type);
|
|
break;
|
|
default:
|
|
event(ev);
|
|
}
|
|
}
|
|
|
|
void event(GameEvent ev, const char *hit_type) {
|
|
string ht{hit_type};
|
|
event(ev, ht);
|
|
}
|
|
|
|
void event(GameEvent ev) {
|
|
switch(_state) {
|
|
FSM_STATE_LOG(GameState, START, start, ev);
|
|
FSM_STATE_LOG(GameState, IDLE, idle, ev);
|
|
FSM_STATE_LOG(GameState, DEAD, dead, ev);
|
|
FSM_STATE_LOG(GameState, SUCCESS, success, ev);
|
|
FSM_STATE_LOG(GameState, FAILURE, failure, ev);
|
|
case GameState::IN_ROUND: {
|
|
string hit_type = "";
|
|
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();
|
|
};
|
|
|