GameEngine is now a state machine so I can push its design further and keep it solid.

This commit is contained in:
Zed A. Shaw 2024-09-12 00:34:41 -04:00
parent 1c89afaee2
commit 9e6c05eccd
5 changed files with 56 additions and 56 deletions

View file

@ -4,6 +4,7 @@
#include <fmt/core.h>
#include <fmt/color.h>
#include "game_engine.hpp"
#include <cassert>
const auto ERROR = fmt::emphasis::bold | fg(fmt::color::red);
@ -23,18 +24,6 @@ int GameEngine::determine_damage(string &type) {
}
}
void GameEngine::start_round() {
hits_taken = 0;
}
void GameEngine::end_round() {
++rounds;
if(hits_taken == 0) {
++streak;
heal();
}
}
void GameEngine::reset() {
rounds = 0;
streak = 0;
@ -46,8 +35,6 @@ bool GameEngine::hit(string &type) {
int damage = determine_damage(type);
hit_points -= damage;
++hits_taken;
streak = 0;
return is_dead();
}
@ -62,20 +49,52 @@ bool GameEngine::is_dead() {
void GameEngine::start(GameEvent ev) {
state(GameState::IDLE);
idle(ev);
}
void GameEngine::idle(GameEvent ev) {
state(GameState::IDLE);
if(ev == GameEvent::BUILD_START) {
hits_taken = 0;
state(GameState::IN_ROUND);
} else {
state(GameState::IDLE);
}
}
void GameEngine::in_round(GameEvent ev) {
state(GameState::IN_ROUND);
if(ev == GameEvent::HIT) {
string er_type = "error";
hit(er_type); // FIXME: bring back error type
if(is_dead()) {
state(GameState::DEAD);
} else {
state(GameState::IN_ROUND);
}
} else if(ev == GameEvent::BUILD_SUCCESS) {
state(GameState::SUCCESS);
} else if(ev == GameEvent::BUILD_FAILED) {
state(GameState::FAILURE);
} else {
state(GameState::IN_ROUND);
}
}
void GameEngine::dead(GameEvent ev) {
state(GameState::DEAD);
reset();
state(GameState::IDLE);
}
void GameEngine::alive(GameEvent ev) {
state(GameState::ALIVE);
void GameEngine::success(GameEvent ev) {
assert(ev == GameEvent::BUILD_DONE && "success state expected BUILD_DONE");
++rounds;
++streak;
heal();
state(GameState::IDLE);
}
void GameEngine::failure(GameEvent ev) {
assert(ev == GameEvent::BUILD_DONE && "failure state expected BUILD_DONE");
++rounds;
streak = 0;
state(GameState::IDLE);
}