#include "boss/fight.hpp" #include "boss/system.hpp" #include "animation.hpp" namespace boss { Fight::Fight(shared_ptr world, Entity boss_id) : $world(world), $boss_id(boss_id), $ui(world, boss_id) { $ui.init(); } bool Fight::event(gui::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); switch($state) { FSM_STATE(State, START, ev, data); FSM_STATE(State, BOSS_TURN, ev, data); FSM_STATE(State, PLAYER_TURN, ev, data); FSM_STATE(State, END, ev, data); } run_systems(); return in_state(State::END); } bool Fight::handle_mouse(gui::Event ev) { using enum gui::Event; switch(ev) { case MOUSE_CLICK: { $ui.mouse(mouse_pos.x, mouse_pos.y, guecs::NO_MODS); } break; case MOUSE_MOVE: { $ui.mouse(mouse_pos.x, mouse_pos.y, {1 << guecs::ModBit::hover}); } break; case MOUSE_DRAG: dbc::log("mouse drag"); break; case MOUSE_DRAG_START: dbc::log("mouse START drag"); break; case MOUSE_DROP: dbc::log("mouse DROP"); break; default: return false; } // switch/default didn't happen so handled it. return true; } void Fight::START(gui::Event ev, std::any data) { (void)data; using enum gui::Event; switch(ev) { // this is only if using the debug X key to skip it case BOSS_START: state(State::END); break; case ATTACK: $ui.status(L"PLAYER TURN"); state(State::PLAYER_TURN); break; default: fmt::println("BOSS_FIGHT unknown event {}", (int)ev); } } void Fight::BOSS_TURN(gui::Event ev, std::any data) { using enum gui::Event; switch(ev) { // this is only if using the debug X key to skip it case BOSS_START: state(State::END); break; case ATTACK: { $ui.status(L"PLAYER TURN"); $ui.move_player(run % 10 < 5 ? "player1" : "player2"); int attack_id = std::any_cast(data); boss::System::combat(attack_id); state(State::PLAYER_TURN); } break; case TICK: $ui.play_animations(); break; default: break; // skip it } } void Fight::PLAYER_TURN(gui::Event ev, std::any data) { using enum gui::Event; switch(ev) { // this is only if using the debug X key to skip it case BOSS_START: state(State::END); break; case ATTACK: { $ui.status(L"BOSS TURN"); $ui.move_boss(run % 10 < 5 ? "boss1" : "boss3"); $ui.$boss_anim.play(); int attack_id = std::any_cast(data); boss::System::combat(attack_id); state(State::BOSS_TURN); } break; case TICK: $ui.play_animations(); break; default: // skip it break; } } void Fight::END(gui::Event ev, std::any data) { // We need to clean up that world I think, but not sure how (void)ev; (void)data; } void Fight::run_systems() { run++; } void Fight::render(sf::RenderWindow& window) { $ui.render(window); } }