diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 9d0a9c6..edc951c 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -466,16 +466,6 @@ void Director::processMenuInput() { void Director::switchSceneIfRequested() { if (!current_scene_) { return; } - // Prioritat al menú: si un item del ServiceMenu ha encuat una - // transició (típicament "Reiniciar" → LOGO amb reset), s'aplica - // primer. Substitueix l'`ExitRequest` que pugui haver publicat - // l'escena en aquest mateix frame — l'usuari ha cancel·lat l'estat - // de joc explícitament i no ens interessa mantenir-ne la sortida. - if (auto menu_req = ServiceMenu::get().takePendingSceneRequest(); menu_req.has_value()) { - Log::info("Director", "scene transition (menu) → {}", toString(menu_req->next)); - current_scene_ = buildScene(menu_req->next, menu_req->params); - return; - } // L'escena ha publicat un `ExitRequest` dins de `exit_request_`. // Director el desempaqueta i construeix la nova escena via // `buildScene`. Si la `std::any_cast` falla (tipus inesperat), el @@ -498,10 +488,8 @@ auto Director::buildScene(SceneId id, const SceneParams& params) -> std::unique_ // ctors antics no l'utilitzen directament. Quan totes estiguen // migrades a `ExitRequest`, aquestes lambdes desapareixeran. switch (id) { - case SceneId::LOGO: { - const auto& p = std::get(params); - return std::make_unique(logo_full_surface_, p.reset); - } + case SceneId::LOGO: + return std::make_unique(logo_full_surface_); case SceneId::TITLE: return std::make_unique(placeholder_text_, copyright_text_, title_bg_surface_, game_logo_surface_, mini_logo_surface_); case SceneId::INTRO: { diff --git a/source/game/scenes/logo_scene.cpp b/source/game/scenes/logo_scene.cpp index 904c898..bf10dcd 100644 --- a/source/game/scenes/logo_scene.cpp +++ b/source/game/scenes/logo_scene.cpp @@ -26,15 +26,9 @@ namespace { } // namespace -LogoScene::LogoScene(std::shared_ptr logo, bool reset) +LogoScene::LogoScene(std::shared_ptr logo) : logo_(std::move(logo)) { - Log::info("scene", "{} start{}", SCENE_NAME, reset ? " (reset)" : ""); - if (reset) { - if (auto* audio = Audio::get(); audio != nullptr) { - audio->stopMusic(); - audio->stopAllSounds(); - } - } + Log::info("scene", "{} start", SCENE_NAME); // Arrenquem en BLACK_INTRO: ni so ni efecte. El glitch sound i el // begin() de scan_ es disparen quan entrem a SCAN. } diff --git a/source/game/scenes/logo_scene.hpp b/source/game/scenes/logo_scene.hpp index 380e7f4..0e0a053 100644 --- a/source/game/scenes/logo_scene.hpp +++ b/source/game/scenes/logo_scene.hpp @@ -29,13 +29,9 @@ class Surface; // Skip: qualsevol tecla no reservada salta directament a la transició // (sense fade-out) — el TitleScene té el seu propi `intro.fade_in_ms`, // així que la transició queda visualment continua igualment. -// -// Si arriba amb `reset=true` (acció "Reiniciar" del menú de servei), -// atura música i tots els sons al constructor — el següent LOGO arrenca -// silenciós encara que veníssem del joc en marxa. class LogoScene : public Scene { public: - LogoScene(std::shared_ptr logo, bool reset); + explicit LogoScene(std::shared_ptr logo); ~LogoScene() override; void update(int delta_ms) override; diff --git a/source/game/scenes/scene_flow.hpp b/source/game/scenes/scene_flow.hpp index 46facd5..e43212c 100644 --- a/source/game/scenes/scene_flow.hpp +++ b/source/game/scenes/scene_flow.hpp @@ -30,15 +30,7 @@ enum class SceneId : std::uint8_t { // rep cap dada de l'anterior; en cas contrari, només els camps que // fluixen pel canal de transició (els recursos, defaults i config // interna els resol Director quan construeix). -struct LogoParams { - // Quan val `true`, indica que aquesta entrada al LOGO és una reinicialització - // completa (acció "Reiniciar" del menú de servei): l'escena haurà d'aturar - // música i sons abans de mostrar-se. En el flux normal LOGO→TITLE→… es - // queda a `false` perquè qualsevol música prèvia (p. ex. la pista de - // TITLE durant l'attract-out) continui sonant fins que la nova escena la - // substituïsca. - bool reset{false}; -}; +struct LogoParams {}; struct TitleParams {}; struct IntroParams { DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH}; diff --git a/source/game/ui/service_menu.hpp b/source/game/ui/service_menu.hpp index 6be6118..84b66fe 100644 --- a/source/game/ui/service_menu.hpp +++ b/source/game/ui/service_menu.hpp @@ -6,13 +6,11 @@ #include #include #include -#include #include #include #include "core/input/define_buttons.hpp" #include "core/rendering/surface.hpp" // Palette -#include "game/scenes/scene_flow.hpp" class Text; @@ -75,19 +73,6 @@ class ServiceMenu { // `define_buttons_->enable(...)` de coffee_crisis_arcade_edition. void startDefineButtons(SDL_Gamepad* pad, const std::string& name, const std::string& path); - // Bústia de transició d'escena des del menú: alguns items (p.ex. - // "Reiniciar" a Sistema) no es poden expressar com a `ExitRequest` de - // l'escena actual perquè el menú és global i no té handle a l'escena. - // Director consulta `takePendingSceneRequest()` cada frame i, si hi ha - // valor, força la transició — el mateix camí que per a `ExitRequest` - // d'una escena, però el dispara el menú directament. - void requestSceneTransition(ExitRequest req) { pending_request_ = req; } - [[nodiscard]] auto takePendingSceneRequest() -> std::optional { - auto out = pending_request_; - pending_request_.reset(); - return out; - } - private: // --- Struct d'un item d'una pàgina --- // @@ -306,9 +291,4 @@ class ServiceMenu { // persisteix la nova configuració via `GamepadBindings`. Replica el // patró `define_buttons_` de coffee_crisis_arcade_edition. DefineButtons define_buttons_; - - // Sol·licitud de canvi d'escena pendent (vore `requestSceneTransition`). - // La consumeix Director al final del frame; si l'item no força la - // transició, queda buida. - std::optional pending_request_; };