refactor(servei): elimina infra del fake reset

This commit is contained in:
JailDesigner committed 2026-05-25 17:34:32 +02:00
1 parent a8ccb3fae1
commit 0c6bebe8dc
5 files changed
+6 -56

No files matched your search

+2 -14
View File
@@ -466,16 +466,6 @@ void Director::processMenuInput() {
void Director::switchSceneIfRequested() { void Director::switchSceneIfRequested() {
if (!current_scene_) { return; } 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_`. // L'escena ha publicat un `ExitRequest` dins de `exit_request_`.
// Director el desempaqueta i construeix la nova escena via // Director el desempaqueta i construeix la nova escena via
// `buildScene`. Si la `std::any_cast` falla (tipus inesperat), el // `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 // ctors antics no l'utilitzen directament. Quan totes estiguen
// migrades a `ExitRequest`, aquestes lambdes desapareixeran. // migrades a `ExitRequest`, aquestes lambdes desapareixeran.
switch (id) { switch (id) {
case SceneId::LOGO: { case SceneId::LOGO:
const auto& p = std::get<LogoParams>(params); return std::make_unique<LogoScene>(logo_full_surface_);
return std::make_unique<LogoScene>(logo_full_surface_, p.reset);
}
case SceneId::TITLE: case SceneId::TITLE:
return std::make_unique<TitleScene>(placeholder_text_, copyright_text_, title_bg_surface_, game_logo_surface_, mini_logo_surface_); return std::make_unique<TitleScene>(placeholder_text_, copyright_text_, title_bg_surface_, game_logo_surface_, mini_logo_surface_);
case SceneId::INTRO: { case SceneId::INTRO: {
+2 -8
View File
@@ -26,15 +26,9 @@ namespace {
} // namespace } // namespace
LogoScene::LogoScene(std::shared_ptr<Surface> logo, bool reset) LogoScene::LogoScene(std::shared_ptr<Surface> logo)
: logo_(std::move(logo)) { : logo_(std::move(logo)) {
Log::info("scene", "{} start{}", SCENE_NAME, reset ? " (reset)" : ""); Log::info("scene", "{} start", SCENE_NAME);
if (reset) {
if (auto* audio = Audio::get(); audio != nullptr) {
audio->stopMusic();
audio->stopAllSounds();
}
}
// Arrenquem en BLACK_INTRO: ni so ni efecte. El glitch sound i el // Arrenquem en BLACK_INTRO: ni so ni efecte. El glitch sound i el
// begin() de scan_ es disparen quan entrem a SCAN. // begin() de scan_ es disparen quan entrem a SCAN.
} }
+1 -5
View File
@@ -29,13 +29,9 @@ class Surface;
// Skip: qualsevol tecla no reservada salta directament a la transició // Skip: qualsevol tecla no reservada salta directament a la transició
// (sense fade-out) — el TitleScene té el seu propi `intro.fade_in_ms`, // (sense fade-out) — el TitleScene té el seu propi `intro.fade_in_ms`,
// així que la transició queda visualment continua igualment. // 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 { class LogoScene : public Scene {
public: public:
LogoScene(std::shared_ptr<Surface> logo, bool reset); explicit LogoScene(std::shared_ptr<Surface> logo);
~LogoScene() override; ~LogoScene() override;
void update(int delta_ms) override; void update(int delta_ms) override;
+1 -9
View File
@@ -30,15 +30,7 @@ enum class SceneId : std::uint8_t {
// rep cap dada de l'anterior; en cas contrari, només els camps que // rep cap dada de l'anterior; en cas contrari, només els camps que
// fluixen pel canal de transició (els recursos, defaults i config // fluixen pel canal de transició (els recursos, defaults i config
// interna els resol Director quan construeix). // interna els resol Director quan construeix).
struct LogoParams { 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 TitleParams {}; struct TitleParams {};
struct IntroParams { struct IntroParams {
DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH}; DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH};
-20
View File
@@ -6,13 +6,11 @@
#include <cstdint> #include <cstdint>
#include <functional> #include <functional>
#include <memory> #include <memory>
#include <optional>
#include <string> #include <string>
#include <vector> #include <vector>
#include "core/input/define_buttons.hpp" #include "core/input/define_buttons.hpp"
#include "core/rendering/surface.hpp" // Palette #include "core/rendering/surface.hpp" // Palette
#include "game/scenes/scene_flow.hpp"
class Text; class Text;
@@ -75,19 +73,6 @@ class ServiceMenu {
// `define_buttons_->enable(...)` de coffee_crisis_arcade_edition. // `define_buttons_->enable(...)` de coffee_crisis_arcade_edition.
void startDefineButtons(SDL_Gamepad* pad, const std::string& name, const std::string& path); 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<ExitRequest> {
auto out = pending_request_;
pending_request_.reset();
return out;
}
private: private:
// --- Struct d'un item d'una pàgina --- // --- Struct d'un item d'una pàgina ---
// //
@@ -306,9 +291,4 @@ class ServiceMenu {
// persisteix la nova configuració via `GamepadBindings`. Replica el // persisteix la nova configuració via `GamepadBindings`. Replica el
// patró `define_buttons_` de coffee_crisis_arcade_edition. // patró `define_buttons_` de coffee_crisis_arcade_edition.
DefineButtons define_buttons_; 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<ExitRequest> pending_request_;
}; };