diff --git a/builder.cpp b/builder.cpp index fcb3e06..f4ba922 100644 --- a/builder.cpp +++ b/builder.cpp @@ -91,7 +91,7 @@ void Builder::building(BuildEvent ev) { if(m.match) { gui.output(format("HIT WITH {} @ {}:{}:{} {}", m.type, m.file_name, m.lnumber, m.col, m.message)); - game.event(GameEvent::HIT); + game.event(GameEvent::HIT, m.type); } state(READING); } diff --git a/game_engine.cpp b/game_engine.cpp index bcffb65..3614526 100644 --- a/game_engine.cpp +++ b/game_engine.cpp @@ -61,21 +61,24 @@ void GameEngine::idle(GameEvent ev) { } } -void GameEngine::in_round(GameEvent ev) { - if(ev == GameEvent::HIT) { - string er_type = "error"; - hit(er_type); // FIXME: bring back error type - if(is_dead()) { - state(GameState::DEAD); - } else { +void GameEngine::in_round(GameEvent ev, string &hit_type) { + switch(ev) { + case GameEvent::HIT: + hit(hit_type); // FIXME: bring back error type + if(is_dead()) { + state(GameState::DEAD); + } else { + state(GameState::IN_ROUND); + } + break; + case GameEvent::BUILD_SUCCESS: + state(GameState::SUCCESS); + break; + case GameEvent::BUILD_FAILED: + state(GameState::FAILURE); + break; + default: 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); } } diff --git a/game_engine.hpp b/game_engine.hpp index 717431c..2dc342e 100644 --- a/game_engine.hpp +++ b/game_engine.hpp @@ -5,6 +5,7 @@ #include #include #include "fsm.hpp" +#include using std::string; @@ -41,21 +42,35 @@ class GameEngine : DeadSimpleFSM { 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) { switch(_state) { FSM_STATE(GameState::START, start, ev); FSM_STATE(GameState::IDLE, idle, ev); - FSM_STATE(GameState::IN_ROUND, in_round, ev); FSM_STATE(GameState::DEAD, dead, ev); FSM_STATE(GameState::SUCCESS, success, ev); FSM_STATE(GameState::FAILURE, failure, ev); + case GameState::IN_ROUND: { + string hit_type = ""; + in_round(ev, hit_type); + } + break; } } // FSM to replace the others void start(GameEvent ev); void idle(GameEvent ev); - void in_round(GameEvent ev); + void in_round(GameEvent ev, string &hit_type); void dead(GameEvent ev); void success(GameEvent ev); void failure(GameEvent ev);