Boss fight is now working. Turned out to be something really dumb.
This commit is contained in:
parent
4958f24c1d
commit
4b4f9b3916
8 changed files with 154 additions and 127 deletions
65
gui/fsm.cpp
65
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<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();
|
||||
|
|
|
|||
23
gui/fsm.hpp
23
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<State, game::Event> {
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue