From 8fdaadaf12e57cb0ad22b0b68fbf461a9a900b6a Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Fri, 14 Nov 2025 01:25:10 -0500 Subject: [PATCH] Cutscenes are now integrated into the game. LONG LIVE THE RAT KING! --- gui/fsm.cpp | 36 +++++++++++++++++++++--------------- gui/fsm.hpp | 2 ++ storyboard/ui.cpp | 4 ++++ storyboard/ui.hpp | 1 + tools/storyboard.cpp | 4 ++-- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/gui/fsm.cpp b/gui/fsm.cpp index 07c5186..c3a4140 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -213,6 +213,9 @@ namespace gui { void FSM::BOSS_FIGHT(Event ev, std::any data) { dbc::check($boss_fight != nullptr, "$boss_fight not initialized"); + + if($boss_scene->playing()) return; + $boss_fight->mouse_pos = mouse_position(); if(ev == gui::Event::QUIT) { @@ -380,31 +383,31 @@ namespace gui { } void FSM::draw_gui() { - if(in_state(State::BOSS_FIGHT)) { - $boss_fight->render($window); + if($debug_ui.active) { + debug_render(); } else { - if($debug_ui.active) { - debug_render(); - } else { - $main_ui.render(); - } + $main_ui.render(); + } - $status_ui.render($window); - $combat_ui.render($window); - if($loot_ui.active) $loot_ui.render($window); + $status_ui.render($window); + $combat_ui.render($window); + if($loot_ui.active) $loot_ui.render($window); - if(in_state(State::LOOTING)) $dnd_loot.render(); + if(in_state(State::LOOTING)) $dnd_loot.render(); - if($map_open) { - $map_ui.render($window, $main_ui.$compass_dir); - } + if($map_open) { + $map_ui.render($window, $main_ui.$compass_dir); } } void FSM::render() { if(in_state(State::BOSS_FIGHT)) { $window.clear(); - $boss_fight->render($window); + if($boss_scene->playing()) { + $boss_scene->render($window); + } else { + $boss_fight->render($window); + } } else { draw_gui(); } @@ -538,7 +541,10 @@ 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(); + dbc::check($boss_scene->playing(), "boss scene doesn't play"); } else { GameDB::create_level(); $status_ui.update_level(); diff --git a/gui/fsm.hpp b/gui/fsm.hpp index c7fe909..ad628d3 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -12,6 +12,7 @@ #include "events.hpp" #include "gui/event_router.hpp" #include "gui/dnd_loot.hpp" +#include "storyboard/ui.hpp" namespace gui { enum class State { @@ -36,6 +37,7 @@ namespace gui { DebugUI $debug_ui; MainUI $main_ui; std::shared_ptr $boss_fight = nullptr; + std::shared_ptr $boss_scene = nullptr; CombatUI $combat_ui; StatusUI $status_ui; MapViewUI $map_ui; diff --git a/storyboard/ui.cpp b/storyboard/ui.cpp index a3e7186..94571d6 100644 --- a/storyboard/ui.cpp +++ b/storyboard/ui.cpp @@ -47,6 +47,10 @@ namespace storyboard { window.draw($view_sprite); } + bool UI::playing() { + return $audio->getStatus() == sf::SoundSource::Status::Playing; + } + sf::Time parse_time_code(const std::string& time) { std::chrono::seconds out{}; diff --git a/storyboard/ui.hpp b/storyboard/ui.hpp index 601962f..87a7d19 100644 --- a/storyboard/ui.hpp +++ b/storyboard/ui.hpp @@ -26,6 +26,7 @@ namespace storyboard { void zoom(const std::string &cell_name); void reset(); void track_audio(); + bool playing(); }; } diff --git a/tools/storyboard.cpp b/tools/storyboard.cpp index 540cfcd..b32a436 100644 --- a/tools/storyboard.cpp +++ b/tools/storyboard.cpp @@ -29,8 +29,7 @@ int main(int, char*[]) { storyboard::UI main("rat_king"); main.init(); - while(true) { - + while(main.playing()) { while(const auto ev = window.pollEvent()) { auto gui_ev = router.process_event(ev); auto mouse_pos = window.mapPixelToCoords(router.position); @@ -41,6 +40,7 @@ int main(int, char*[]) { main.mouse(mouse_pos.x, mouse_pos.y, guecs::NO_MODS); } } + main.render(window); window.display(); }