Boss fight is now working. Turned out to be something really dumb.

This commit is contained in:
Zed A. Shaw 2025-12-19 12:04:51 -05:00
parent 4958f24c1d
commit 4b4f9b3916
8 changed files with 154 additions and 127 deletions

View file

@ -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<storyboard::UI>("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();