diff --git a/events.hpp b/events.hpp index 38f0d5e..880c549 100644 --- a/events.hpp +++ b/events.hpp @@ -2,7 +2,8 @@ namespace Events { enum GUI { - START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP + START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP, + COMBAT_START }; struct Combat { diff --git a/gui.cpp b/gui.cpp index ba184ca..9667ebc 100644 --- a/gui.cpp +++ b/gui.cpp @@ -8,7 +8,6 @@ #include "systems.hpp" #include "events.hpp" - namespace gui { using namespace components; @@ -39,6 +38,8 @@ namespace gui { FSM_STATE(State, MAPPING, ev); FSM_STATE(State, ROTATING, ev); FSM_STATE(State, IDLE, ev); + FSM_STATE(State, IN_COMBAT, ev); + FSM_STATE(State, COMBAT_ROTATE, ev); FSM_STATE(State, END, ev); } } @@ -101,7 +102,7 @@ namespace gui { } break; default: - state(State::IDLE); + dbc::log(fmt::format("In ATTACKING state, unhandled event {}", (int)ev)); } } @@ -111,6 +112,12 @@ namespace gui { } } + void FSM::COMBAT_ROTATE(Event ) { + if($camera.play_rotate($rayview)) { + state(State::IN_COMBAT); + } + } + void FSM::IDLE(Event ev) { using enum Event; @@ -145,9 +152,10 @@ namespace gui { state(State::MAPPING); break; case ATTACK: - $status_view.log("You attack!"); - $rotation = -30.0f; - state(State::ATTACKING); + fmt::println("ATTACK IGNORED"); + break; + case START_COMBAT: + state(State::IN_COMBAT); break; case CLOSE: dbc::log("Nothing to close."); @@ -157,6 +165,28 @@ namespace gui { } } + void FSM::IN_COMBAT(Event ev) { + using enum Event; + + switch(ev) { + case ATTACK: + $status_view.log("You attack!"); + $rotation = -30.0f; + state(State::ATTACKING); + break; + case ROTATE_LEFT: + $camera.plan_rotate($rayview, 1); + state(State::COMBAT_ROTATE); + break; + case ROTATE_RIGHT: + $camera.plan_rotate($rayview, -1); + state(State::COMBAT_ROTATE); + break; + default: + break; + } + } + void FSM::try_move(int dir, bool strafe) { using enum State; // prevent moving into occupied space @@ -333,7 +363,6 @@ namespace gui { System::motion($level); System::lighting($level); System::death($level); - handle_world_events(); } bool FSM::active() { @@ -366,6 +395,9 @@ namespace gui { } } break; + case eGUI::COMBAT_START: { + event(Event::START_COMBAT); + } break; case eGUI::LOOT: { // auto &item = std::any_cast(data); // $status_view.log(fmt::format("You picked up a {}.", diff --git a/gui.hpp b/gui.hpp index 58d0ade..bc9d686 100644 --- a/gui.hpp +++ b/gui.hpp @@ -14,6 +14,8 @@ namespace gui { enum class State { START, MOVING, + IN_COMBAT, + COMBAT_ROTATE, ATTACKING, MAPPING, ROTATING, @@ -33,6 +35,7 @@ namespace gui { ROTATE_LEFT, ROTATE_RIGHT, ATTACK, + START_COMBAT, QUIT }; @@ -67,6 +70,8 @@ namespace gui { void MAPPING(Event); void ROTATING(Event ); void IDLE(Event ev); + void IN_COMBAT(Event ev); + void COMBAT_ROTATE(Event ev); void END(Event ev); void try_move(int dir, bool strafe); diff --git a/main.cpp b/main.cpp index 3416bca..cf80bb6 100644 --- a/main.cpp +++ b/main.cpp @@ -8,14 +8,16 @@ int main() { main.render(); // ZED: need to sort out how to deal with this in the FSM - if(main.in_state(gui::State::IDLE)) { - main.keyboard(); - } else if(main.in_state(gui::State::MAPPING)) { + if(main.in_state(gui::State::IDLE) + || main.in_state(gui::State::MAPPING) + || main.in_state(gui::State::IN_COMBAT)) + { main.keyboard(); } else{ main.event(gui::Event::TICK); } + main.handle_world_events(); main.mouse(); } diff --git a/systems.cpp b/systems.cpp index d4280e2..d178e52 100644 --- a/systems.cpp +++ b/systems.cpp @@ -144,14 +144,7 @@ void System::collision(GameLevel &level) { if(found) { for(auto entity : nearby) { if(world.has(entity)) { - auto& enemy_combat = world.get(entity); - - Events::Combat result { - player_combat.attack(enemy_combat), - enemy_combat.attack(player_combat) - }; - - world.send(Events::GUI::COMBAT, entity, result); + world.send(Events::GUI::COMBAT_START, entity, entity); } else if(world.has(entity)) { auto item = world.get(entity); auto& item_pos = world.get(entity);