diff --git a/src/game/autowalker.cpp b/src/game/autowalker.cpp index 6b68923..1035ee7 100644 --- a/src/game/autowalker.cpp +++ b/src/game/autowalker.cpp @@ -85,8 +85,7 @@ void Autowalker::handle_window_events() { } void Autowalker::process_combat() { - while(fsm.in_state(gui::State::IN_COMBAT) - || fsm.in_state(gui::State::ATTACKING)) + while(near_enemies() || fsm.in_state(gui::State::ATTACKING)) { if(fsm.in_state(gui::State::ATTACKING)) { send_event(game::Event::TICK); @@ -143,8 +142,7 @@ void Autowalker::rotate_player(Point target) { send_event(dir); - while(fsm.in_state(gui::State::ROTATING) || - fsm.in_state(gui::State::COMBAT_ROTATE)) + while(fsm.in_state(gui::State::ROTATING)) { send_event(game::Event::TICK); } @@ -164,7 +162,7 @@ void Autowalker::update_state(ai::EntityAI& player_ai) { player_ai.set_state("health_good", player_health_good()); player_ai.set_state("in_combat", - fsm.in_state(gui::State::IN_COMBAT) || + near_enemies() || fsm.in_state(gui::State::ATTACKING)); auto inv = player_item_count(); @@ -198,7 +196,7 @@ void Autowalker::handle_player_walk(ai::State& start, ai::State& goal) { } else if(player_ai.wants_to("kill_enemy")) { status(L"KILLING ENEMY"); - if(fsm.in_state(gui::State::IN_COMBAT)) { + if(near_enemies()) { if(face_enemy()) { process_combat(); } @@ -459,3 +457,7 @@ void Autowalker::pickup_item() { } } } + +bool Autowalker::near_enemies() { + return false; +} diff --git a/src/game/autowalker.hpp b/src/game/autowalker.hpp index ee163c9..2fc1893 100644 --- a/src/game/autowalker.hpp +++ b/src/game/autowalker.hpp @@ -51,4 +51,5 @@ struct Autowalker { void pickup_item(); void pocket_potion(GameDB::Level &level); void click_inventory(const std::string& name, guecs::Modifiers mods); + bool near_enemies(); }; diff --git a/src/gui/fsm.cpp b/src/gui/fsm.cpp index cb83bfd..2e8b3ff 100644 --- a/src/gui/fsm.cpp +++ b/src/gui/fsm.cpp @@ -38,8 +38,6 @@ namespace gui { FSM_STATE(State, ATTACKING, ev, data); FSM_STATE(State, ROTATING, ev); FSM_STATE(State, IDLE, ev, data); - FSM_STATE(State, IN_COMBAT, ev); - FSM_STATE(State, COMBAT_ROTATE, ev); FSM_STATE(State, CUT_SCENE_PLAYING, ev, data); FSM_STATE(State, BOSS_FIGHT, ev, data); FSM_STATE(State, LOOTING, ev, data); @@ -77,26 +75,11 @@ namespace gui { } void FSM::ATTACKING(Event ev, std::any data) { - using enum Event; - switch(ev) { - case TICK: { - dbc::log("!!!!!! FIX System::combat(0) doesn't use any weapons, only first"); - $systems.runCombat(0); - run_systems(); - state(State::IN_COMBAT); - } break; - case COMBAT_STOP: - state(State::IDLE); - break; - case ATTACK: { - int attack_id = std::any_cast(data); - $systems.runCombat(attack_id); - run_systems(); - } break; - default: - dbc::log($F("In ATTACKING state, unhandled event {}", (int)ev)); - state(State::IDLE); - } + // if(!$main_ui.hands_playing()) { + // run combat one more time + $systems.runCombat(0); + state(State::IDLE); + // } } void FSM::ROTATING(Event) { @@ -107,14 +90,6 @@ namespace gui { } } - void FSM::COMBAT_ROTATE(Event) { - if(auto aim = $main_ui.play_rotate()) { - auto& player_pos = GameDB::player_position(); - player_pos.aiming_at = *aim; - state(State::IN_COMBAT); - } - } - void FSM::LOOTING(Event ev, std::any data) { using enum Event; @@ -165,12 +140,14 @@ namespace gui { $map_open = !$map_open; break; case ATTACK: + $main_ui.play_hands(); + $main_ui.dirty(); + sound::play("sword_hit_1"); + $systems.runCombat(0); + run_systems(); + $status_ui.update(); state(State::ATTACKING); break; - case COMBAT_START: - $map_open = false; - state(State::IN_COMBAT); - break; case CLOSE: dbc::log("Nothing to close."); break; @@ -228,46 +205,6 @@ namespace gui { dbc::log("this should not run, it's handled in handle_boss_fight_events"); } - void FSM::IN_COMBAT(Event ev) { - using enum Event; - - switch(ev) { - case MOUSE_CLICK: - mouse_action(guecs::NO_MODS); - break; - case MOUSE_MOVE: { - mouse_action({1 << guecs::ModBit::hover}); - } break; - case TICK: - run_systems(); - break; - case ATTACK: - $main_ui.play_hands(); - $main_ui.dirty(); - sound::play("Sword_Hit_1"); - state(State::ATTACKING); - break; - case ROTATE_LEFT: - $main_ui.plan_rotate(-1, DEFAULT_ROTATE); - state(State::COMBAT_ROTATE); - break; - case ROTATE_RIGHT: - $main_ui.plan_rotate(1, DEFAULT_ROTATE); - state(State::COMBAT_ROTATE); - break; - case COMBAT_STOP: - $main_ui.$overlay_ui.close_sprite("top_right"); - state(State::IDLE); - break; - case QUIT: - $window.close(); - state(State::END); - return; - default: - break; - } - } - void FSM::try_move(int dir, bool strafe) { auto& level = GameDB::current_level(); using enum State; @@ -477,7 +414,7 @@ namespace gui { } break; case eGUI::COMBAT_START: - event(Event::COMBAT_START); + // TODO: $main_ui.show_combat(); break; case eGUI::ENTITY_SPAWN: { auto& sprite = world->get(entity); diff --git a/src/gui/fsm.hpp b/src/gui/fsm.hpp index a57a4d0..3f29a95 100644 --- a/src/gui/fsm.hpp +++ b/src/gui/fsm.hpp @@ -20,8 +20,6 @@ namespace gui { enum class State { START=__LINE__, MOVING=__LINE__, - IN_COMBAT=__LINE__, - COMBAT_ROTATE=__LINE__, ATTACKING=__LINE__, ROTATING=__LINE__, BOSS_FIGHT=__LINE__, diff --git a/src/main.cpp b/src/main.cpp index e10f152..07da840 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,8 +42,7 @@ int main(int argc, char* argv[]) { // BUG: need to sort out how to deal with this in the FSM if(main.in_state(gui::State::IDLE) || main.in_state(gui::State::LOOTING) - || main.in_state(gui::State::CUT_SCENE_PLAYING) - || main.in_state(gui::State::IN_COMBAT)) + || main.in_state(gui::State::CUT_SCENE_PLAYING)) { if(main.autowalking) { walker.autowalk();