From 4b4f9b39169a40f3b363022906e414f0fb27c42a Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Fri, 19 Dec 2025 12:04:51 -0500 Subject: [PATCH] Boss fight is now working. Turned out to be something really dumb. --- assets/sounds/test_story.ogg | Bin 79678 -> 5577 bytes assets/stories.json | 24 +++++------ boss/fight.cpp | 81 ++++++++++++++++++++--------------- boss/fight.hpp | 32 ++++++++------ gui/fsm.cpp | 65 +++++++++++++++++----------- gui/fsm.hpp | 23 +++++----- main.cpp | 32 ++++++++------ tools/arena.cpp | 24 +++-------- 8 files changed, 154 insertions(+), 127 deletions(-) diff --git a/assets/sounds/test_story.ogg b/assets/sounds/test_story.ogg index 688b5af831b91e9f1beabbc2d2a26e14508ad2c7..f9fb660457675f21d32bba0fd9bc4ec0cebf9691 100644 GIT binary patch literal 5577 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 diff --git a/assets/stories.json b/assets/stories.json index 8d14de0..c058343 100644 --- a/assets/stories.json +++ b/assets/stories.json @@ -10,18 +10,18 @@ ], "beats": [ ["00:00", "a","pan"], - ["00:06", "a","pan"], - ["00:13", "b","pan"], - ["00:19", "g","pan"], - ["00:25", "h","pan"], - ["00:29", "h","bounce"], - ["00:31", "c1","pan"], - ["00:34", "c2","pan"], - ["00:39", "d","bounce"], - ["00:44", "e","shake"], - ["00:48", "i","pan"], - ["00:53", "i","shake"], - ["00:55", "i","bounce"] + ["00:01", "a","pan"], + ["00:02", "b","pan"], + ["00:03", "g","pan"], + ["00:04", "h","pan"], + ["00:05", "h","bounce"], + ["00:06", "c1","pan"], + ["00:07", "c2","pan"], + ["00:08", "d","bounce"], + ["00:09", "e","shake"], + ["00:10", "i","pan"], + ["00:11", "i","shake"], + ["00:12", "i","bounce"] ] } } diff --git a/boss/fight.cpp b/boss/fight.cpp index 2840ed6..9dd67e8 100644 --- a/boss/fight.cpp +++ b/boss/fight.cpp @@ -4,8 +4,11 @@ #include "game_level.hpp" #include #include "rand.hpp" +#include "events.hpp" namespace boss { + using namespace DinkyECS; + Fight::Fight(shared_ptr world, Entity boss_id, Entity player_id) : $world(world), $boss_id(boss_id), @@ -19,9 +22,10 @@ namespace boss { $ui.init(); } - bool Fight::event(game::Event ev, std::any data) { + void Fight::event(game::Event ev, std::any data) { + // if the mouse event is handled the done, this may be wrong later - if(handle_mouse(ev)) return in_state(State::END); + if(handle_mouse(ev)) return; switch($state) { FSM_STATE(State, START, ev, data); @@ -30,10 +34,6 @@ namespace boss { FSM_STATE(State, EXEC_PLAN, ev, data); FSM_STATE(State, END, ev, data); } - - run_systems(); - - return in_state(State::END); } void Fight::START(game::Event ev, std::any) { @@ -41,10 +41,8 @@ namespace boss { switch(ev) { // this is only if using the debug X key to skip it - case BOSS_START: - state(State::END); - break; case TICK: + case BOSS_START: $ui.status(L"PLAYER REQUESTS"); $battle.ap_refresh(); state(State::PLAYER_REQUESTS); @@ -169,7 +167,6 @@ namespace boss { } void Fight::render(sf::RenderWindow& window) { - window.clear(); $ui.play_animations(); $ui.render(window); } @@ -179,10 +176,10 @@ namespace boss { switch(ev) { case MOUSE_CLICK: { - $ui.mouse(mouse_pos.x, mouse_pos.y, guecs::NO_MODS); + $ui.mouse($router.position.x, $router.position.y, guecs::NO_MODS); } break; case MOUSE_MOVE: { - $ui.mouse(mouse_pos.x, mouse_pos.y, {1 << guecs::ModBit::hover}); + $ui.mouse($router.position.x, $router.position.y, {1 << guecs::ModBit::hover}); } break; case MOUSE_DRAG: dbc::log("mouse drag"); @@ -210,33 +207,47 @@ namespace boss { run_systems(); } - void Fight::handle_world_events() { - fmt::println(">>>>>>>>>>>>>>>>> BOSS FIGHT EVENTS"); - dbc::check($world->has_event(), "World doesn't have GUI events."); + void Fight::set_window(sf::RenderWindow* window) { + $window = window; + } - while($world->has_event()) { - auto [evt, entity, data] = $world->recv(); - fmt::println("boss fight received event", int(evt)); + bool Fight::handle_keyboard_mouse() { + dbc::check($window != nullptr, "you didn't set_window"); - switch(evt) { - case game::Event::ATTACK: - fmt::println("sending attack"); - event(game::Event::ATTACK, data); - break; - case game::Event::COMBAT_START: - fmt::println("sending combat start {}", data.type().name()); - event(game::Event::COMBAT_START, data); - break; - case game::Event::COMBAT: - fmt::println("sending combat {}", data.type().name()); - event(game::Event::COMBAT, data); - break; - default: - fmt::println("GUI EVENT: {} entity={}", int(evt), entity); + while(const auto ev = $window->pollEvent()) { + auto gui_ev = $router.process_event(ev); + + if(gui_ev == game::Event::KEY_PRESS) { + using KEY = sf::Keyboard::Scan; + + switch($router.scancode) { + // REALLY? just go to state end or use another event + case KEY::X: + event(game::Event::BOSS_START, {}); + break; + default: + fmt::println("key press!"); + } + } else if(gui_ev == game::Event::QUIT) { + return true; + } else { + event(gui_ev, {}); } } - dbc::check(!$world->has_event(), "World still has events!"); - fmt::println("<<<<<<<<<<<<<<<< BOSS FIGHT EVENTS"); + return in_state(State::END); + } + + bool Fight::handle_world_events() { + if($world->has_event()) { + while($world->has_event()) { + auto [evt, entity, data] = $world->recv(); + + event(game::Event(evt), data); + run_systems(); + } + } + + return in_state(State::END); } } diff --git a/boss/fight.hpp b/boss/fight.hpp index decc67e..b291c5e 100644 --- a/boss/fight.hpp +++ b/boss/fight.hpp @@ -5,35 +5,39 @@ #include "boss/ui.hpp" #include "events.hpp" #include "battle.hpp" +#include "gui/event_router.hpp" #include #include namespace boss { - using namespace DinkyECS; using std::shared_ptr; enum class State { - START=0, - PLAYER_REQUESTS=1, - PLAN_BATTLE=2, - EXEC_PLAN=3, - END=4 + START=__LINE__, + PLAYER_REQUESTS=__LINE__, + PLAN_BATTLE=__LINE__, + EXEC_PLAN=__LINE__, + END=__LINE__ }; class Fight : public DeadSimpleFSM { public: - shared_ptr $world = nullptr; - DinkyECS::Entity $boss_id = NONE; + sf::RenderWindow* $window = nullptr; + shared_ptr $world = nullptr; + DinkyECS::Entity $boss_id = DinkyECS::NONE; combat::BattleEngine $battle; boss::UI $ui; - sf::Vector2f mouse_pos{0,0}; - Entity $host = NONE; + DinkyECS::Entity $host = DinkyECS::NONE; components::Combat* $host_combat = nullptr; + gui::routing::Router $router; - Fight(shared_ptr world, Entity boss_id, Entity player_id); + Fight(shared_ptr world, + DinkyECS::Entity boss_id, + DinkyECS::Entity player_id); + void set_window(sf::RenderWindow* window); bool handle_mouse(game::Event ev); - bool event(game::Event ev, std::any data); + void event(game::Event ev, std::any data); void START(game::Event ev, std::any data); void PLAYER_REQUESTS(game::Event ev, std::any data); @@ -42,12 +46,14 @@ namespace boss { void END(game::Event ev, std::any data); void render(sf::RenderWindow& window); - void handle_world_events(); + bool handle_world_events(); void run_systems(); bool player_dead(); void init_fight(); void do_combat(std::any data); void next_combat_dumb_name(); + sf::Vector2f mouse_position(); + bool handle_keyboard_mouse(); }; } diff --git a/gui/fsm.cpp b/gui/fsm.cpp index d7271dd..48d755e 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -39,6 +39,7 @@ namespace gui { 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); FSM_STATE(State, END, ev); @@ -175,7 +176,7 @@ namespace gui { case BOSS_START: sound::stop("ambient"); next_level(true); - state(State::BOSS_FIGHT); + state(State::CUT_SCENE_PLAYING); break; case LOOT_ITEM: $dnd_loot.event(Event::LOOT_ITEM); @@ -211,26 +212,20 @@ namespace gui { } } - void FSM::BOSS_FIGHT(Event ev, std::any data) { - dbc::check($boss_fight != nullptr, "$boss_fight not initialized"); - + void FSM::CUT_SCENE_PLAYING(Event ev, std::any data) { if($boss_scene->playing()) { if(ev == game::Event::MOUSE_CLICK) { + dbc::log("exiting cut scene"); $boss_scene->mouse(0,0, 0); + state(State::BOSS_FIGHT); } - return; + } else { + state(State::BOSS_FIGHT); } + } - $boss_fight->mouse_pos = mouse_position(); - - if(ev == game::Event::QUIT) { - // just epsilon straight to the exit - IDLE(ev, data); - } if($boss_fight->event(ev, data)) { - sound::play("ambient"); - next_level(false); - state(State::IDLE); - } + void FSM::BOSS_FIGHT(Event ev, std::any data) { + dbc::log("this should not run, it's handled in handle_boss_fight_events"); } void FSM::IN_COMBAT(Event ev) { @@ -406,18 +401,20 @@ namespace gui { } void FSM::render() { + $window.clear(); + if(in_state(State::BOSS_FIGHT)) { - $window.clear(); - if($boss_scene->playing()) { - $boss_scene->render($window); - } else { - $boss_fight->render($window); - } + $boss_fight->render($window); + // this clears any attack animations, like fire + System::clear_attack(); + } else if(in_state(State::CUT_SCENE_PLAYING)) { + $boss_scene->render($window); } else { + // this clears any attack animations, like fire + System::clear_attack(); draw_gui(); } - System::clear_attack(); $window.display(); } @@ -435,7 +432,20 @@ namespace gui { return !in_state(State::END); } - void FSM::handle_world_events() { + void FSM::handle_boss_fight_events() { + dbc::check($boss_fight != nullptr, "$boss_fight not initialized"); + + // true means State::END in $boss_fight + if($boss_fight->handle_world_events() || $boss_fight->handle_keyboard_mouse()) { + dbc::log("boss fight ended, transition to IDLE"); + // fight is over, go back to regular game + sound::play("ambient"); + next_level(false); + state(State::IDLE); + } + } + + void FSM::handle_world_events() { using eGUI = game::Event; auto world = GameDB::current_world(); @@ -529,7 +539,9 @@ namespace gui { } } break; default: - $map_ui.log(fmt::format(L"INVALID EVENT! {},{}", evt, entity)); + dbc::log(fmt::format("Unhandled event: evt={}; enemy={}; data={}", + evt, entity, data.type().name())); + event(game::Event(evt), data); } } } @@ -547,8 +559,11 @@ namespace gui { void FSM::next_level(bool bossfight) { if(bossfight) { $boss_scene = std::make_shared("rat_king"); - $boss_fight = boss::System::create_bossfight(); $boss_scene->init(); + + $boss_fight = boss::System::create_bossfight(); + $boss_fight->set_window(&$window); + dbc::check($boss_scene->playing(), "boss scene doesn't play"); } else { GameDB::create_level(); diff --git a/gui/fsm.hpp b/gui/fsm.hpp index 2e45049..0e6fab7 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -17,16 +17,17 @@ namespace gui { enum class State { - START=0, - MOVING=1, - IN_COMBAT=2, - COMBAT_ROTATE=3, - ATTACKING=4, - ROTATING=5, - BOSS_FIGHT=6, - LOOTING=7, - IDLE=8, - END=9 + START=__LINE__, + MOVING=__LINE__, + IN_COMBAT=__LINE__, + COMBAT_ROTATE=__LINE__, + ATTACKING=__LINE__, + ROTATING=__LINE__, + BOSS_FIGHT=__LINE__, + LOOTING=__LINE__, + IDLE=__LINE__, + CUT_SCENE_PLAYING=__LINE__, + END=__LINE__, }; class FSM : public DeadSimpleFSM { @@ -63,6 +64,7 @@ namespace gui { void COMBAT_ROTATE(game::Event ev); void BOSS_FIGHT(game::Event ev, std::any data); void LOOTING(game::Event ev, std::any data); + void CUT_SCENE_PLAYING(game::Event ev, std::any data); void END(game::Event ev); void try_move(int dir, bool strafe); @@ -74,6 +76,7 @@ namespace gui { bool active(); void run_systems(); void handle_world_events(); + void handle_boss_fight_events(); void next_level(bool bossfight); void debug_render(); void take_screenshot(); diff --git a/main.cpp b/main.cpp index 9329823..40664ba 100644 --- a/main.cpp +++ b/main.cpp @@ -35,22 +35,26 @@ int main(int argc, char* argv[]) { while(main.active()) { main.render(); - // 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::BOSS_FIGHT) - || main.in_state(gui::State::LOOTING) - || main.in_state(gui::State::IN_COMBAT)) - { - if(main.autowalking) { - walker.autowalk(); - } else { - main.handle_keyboard_mouse(); + if(main.in_state(gui::State::BOSS_FIGHT)) { + main.handle_boss_fight_events(); + } else { + // 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)) + { + if(main.autowalking) { + walker.autowalk(); + } else { + main.handle_keyboard_mouse(); + } + } else{ + main.event(game::Event::TICK); } - } else{ - main.event(game::Event::TICK); - } - main.handle_world_events(); + main.handle_world_events(); + } } return 0; diff --git a/tools/arena.cpp b/tools/arena.cpp index fc7439f..ae6d0c1 100644 --- a/tools/arena.cpp +++ b/tools/arena.cpp @@ -1,4 +1,3 @@ -#include "gui/fsm.hpp" #include "textures.hpp" #include "sound.hpp" #include "autowalker.hpp" @@ -36,8 +35,6 @@ int main(int, char*[]) { if(FRAME_LIMIT) window.setFramerateLimit(FRAME_LIMIT); window.setPosition({0,0}); - gui::routing::Router router; - sound::mute(true); sound::play("ambient_1", true); @@ -45,25 +42,16 @@ int main(int, char*[]) { craft_weapon(); auto main = boss::System::create_bossfight(); + main->set_window(&window); + auto world = GameDB::current_world(); dbc::check(main->$world == world, "GameDB::current_world doesn't match boss fight world."); while(!main->in_state(boss::State::END)) { - main->mouse_pos = window.mapPixelToCoords(router.position); - - while(const auto ev = window.pollEvent()) { - auto gui_ev = router.process_event(ev); - - if(gui_ev == game::Event::QUIT || main->event(gui_ev, {})) { - return 0; - } else { - main->event(game::Event::TICK, {}); - } - } - - if(main->$world->has_event()) { - main->handle_world_events(); - dbc::check(!main->$world->has_event(), "You didn't eat all the events."); + if(main->handle_keyboard_mouse() || + main->handle_world_events()) + { + return 0; } main->render(window);