#pragma once #include #include #include "game/debug_config.hpp" // Sistema centralitzat de transicions entre escenes. Cada escena, en lloc // de construir directament la següent, declara una `ExitRequest` amb un // identificador i els paràmetres que la nova escena necessite per // arrencar; `Director::buildScene` és l'únic punt que sap com instanciar // cada tipus i té tots els recursos a mà. // // Afegir una escena nova: // 1. Una entrada al `enum SceneId`. // 2. Si necessita paràmetres, un struct `*Params` i afegir-lo al variant. // 3. Un cas a `Director::buildScene` que el construïsca. // // Una escena només pot demanar transicionar a un altre `SceneId` que // haja estat enregistrat al variant — el compilador ja descarta noms // erronis. enum class SceneId : std::uint8_t { LOGO, TITLE, INTRO, GAME, }; // Estructures de paràmetres per escena. Buides quan la nova escena no // 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 TitleParams {}; struct IntroParams { DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH}; }; struct GameParams { DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH}; }; using SceneParams = std::variant; struct ExitRequest { SceneId next; SceneParams params; }; // Helper per a logs / debug. Implementat inline per evitar un .cpp per a // una funció de tres línies. [[nodiscard]] inline auto toString(SceneId id) -> const char* { switch (id) { case SceneId::LOGO: return "LOGO"; case SceneId::TITLE: return "TITLE"; case SceneId::INTRO: return "INTRO"; case SceneId::GAME: return "GAME"; } return "?"; }