Combat is now unlocked.

This commit is contained in:
Zed A. Shaw 2026-05-25 12:18:55 -04:00
parent 3d8572117c
commit 2e0cc11555
5 changed files with 22 additions and 85 deletions

View file

@ -85,8 +85,7 @@ void Autowalker::handle_window_events() {
} }
void Autowalker::process_combat() { void Autowalker::process_combat() {
while(fsm.in_state(gui::State::IN_COMBAT) while(near_enemies() || fsm.in_state(gui::State::ATTACKING))
|| fsm.in_state(gui::State::ATTACKING))
{ {
if(fsm.in_state(gui::State::ATTACKING)) { if(fsm.in_state(gui::State::ATTACKING)) {
send_event(game::Event::TICK); send_event(game::Event::TICK);
@ -143,8 +142,7 @@ void Autowalker::rotate_player(Point target) {
send_event(dir); send_event(dir);
while(fsm.in_state(gui::State::ROTATING) || while(fsm.in_state(gui::State::ROTATING))
fsm.in_state(gui::State::COMBAT_ROTATE))
{ {
send_event(game::Event::TICK); 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("health_good", player_health_good());
player_ai.set_state("in_combat", player_ai.set_state("in_combat",
fsm.in_state(gui::State::IN_COMBAT) || near_enemies() ||
fsm.in_state(gui::State::ATTACKING)); fsm.in_state(gui::State::ATTACKING));
auto inv = player_item_count(); 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")) { } else if(player_ai.wants_to("kill_enemy")) {
status(L"KILLING ENEMY"); status(L"KILLING ENEMY");
if(fsm.in_state(gui::State::IN_COMBAT)) { if(near_enemies()) {
if(face_enemy()) { if(face_enemy()) {
process_combat(); process_combat();
} }
@ -459,3 +457,7 @@ void Autowalker::pickup_item() {
} }
} }
} }
bool Autowalker::near_enemies() {
return false;
}

View file

@ -51,4 +51,5 @@ struct Autowalker {
void pickup_item(); void pickup_item();
void pocket_potion(GameDB::Level &level); void pocket_potion(GameDB::Level &level);
void click_inventory(const std::string& name, guecs::Modifiers mods); void click_inventory(const std::string& name, guecs::Modifiers mods);
bool near_enemies();
}; };

View file

@ -38,8 +38,6 @@ namespace gui {
FSM_STATE(State, ATTACKING, ev, data); FSM_STATE(State, ATTACKING, ev, data);
FSM_STATE(State, ROTATING, ev); FSM_STATE(State, ROTATING, ev);
FSM_STATE(State, IDLE, ev, data); 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, CUT_SCENE_PLAYING, ev, data);
FSM_STATE(State, BOSS_FIGHT, ev, data); FSM_STATE(State, BOSS_FIGHT, ev, data);
FSM_STATE(State, LOOTING, ev, data); FSM_STATE(State, LOOTING, ev, data);
@ -77,26 +75,11 @@ namespace gui {
} }
void FSM::ATTACKING(Event ev, std::any data) { void FSM::ATTACKING(Event ev, std::any data) {
using enum Event; // if(!$main_ui.hands_playing()) {
switch(ev) { // run combat one more time
case TICK: {
dbc::log("!!!!!! FIX System::combat(0) doesn't use any weapons, only first");
$systems.runCombat(0); $systems.runCombat(0);
run_systems();
state(State::IN_COMBAT);
} break;
case COMBAT_STOP:
state(State::IDLE); state(State::IDLE);
break; // }
case ATTACK: {
int attack_id = std::any_cast<int>(data);
$systems.runCombat(attack_id);
run_systems();
} break;
default:
dbc::log($F("In ATTACKING state, unhandled event {}", (int)ev));
state(State::IDLE);
}
} }
void FSM::ROTATING(Event) { 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) { void FSM::LOOTING(Event ev, std::any data) {
using enum Event; using enum Event;
@ -165,12 +140,14 @@ namespace gui {
$map_open = !$map_open; $map_open = !$map_open;
break; break;
case ATTACK: 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); state(State::ATTACKING);
break; break;
case COMBAT_START:
$map_open = false;
state(State::IN_COMBAT);
break;
case CLOSE: case CLOSE:
dbc::log("Nothing to close."); dbc::log("Nothing to close.");
break; break;
@ -228,46 +205,6 @@ namespace gui {
dbc::log("this should not run, it's handled in handle_boss_fight_events"); 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) { void FSM::try_move(int dir, bool strafe) {
auto& level = GameDB::current_level(); auto& level = GameDB::current_level();
using enum State; using enum State;
@ -477,7 +414,7 @@ namespace gui {
} }
break; break;
case eGUI::COMBAT_START: case eGUI::COMBAT_START:
event(Event::COMBAT_START); // TODO: $main_ui.show_combat();
break; break;
case eGUI::ENTITY_SPAWN: { case eGUI::ENTITY_SPAWN: {
auto& sprite = world->get<components::Sprite>(entity); auto& sprite = world->get<components::Sprite>(entity);

View file

@ -20,8 +20,6 @@ namespace gui {
enum class State { enum class State {
START=__LINE__, START=__LINE__,
MOVING=__LINE__, MOVING=__LINE__,
IN_COMBAT=__LINE__,
COMBAT_ROTATE=__LINE__,
ATTACKING=__LINE__, ATTACKING=__LINE__,
ROTATING=__LINE__, ROTATING=__LINE__,
BOSS_FIGHT=__LINE__, BOSS_FIGHT=__LINE__,

View file

@ -42,8 +42,7 @@ int main(int argc, char* argv[]) {
// BUG: need to sort out how to deal with this in the FSM // BUG: need to sort out how to deal with this in the FSM
if(main.in_state(gui::State::IDLE) if(main.in_state(gui::State::IDLE)
|| main.in_state(gui::State::LOOTING) || main.in_state(gui::State::LOOTING)
|| main.in_state(gui::State::CUT_SCENE_PLAYING) || main.in_state(gui::State::CUT_SCENE_PLAYING))
|| main.in_state(gui::State::IN_COMBAT))
{ {
if(main.autowalking) { if(main.autowalking) {
walker.autowalk(); walker.autowalk();