// context_escenes.hpp - Sistema de gestió d'escenes i context de transicions // © 2025 Port a C++20 #pragma once #include "core/system/game_config.hpp" namespace SceneManager { // Context de transició entre escenes // Conté l'escena destinació i opcions específiques per aquella escena class SceneContext { public: // Tipus d'escena del joc enum class SceneType { LOGO, // Pantalla d'inici (logo JAILGAMES) TITLE, // Pantalla de títol amb menú GAME, // Joc principal (Asteroids) EXIT // Sortir del programa }; // Opcions específiques per a cada escena enum class Option { NONE, // Sense opcions especials (comportament per defecte) JUMP_TO_TITLE_MAIN, // TITLE: Saltar directament a MAIN (starfield instantani) // MODE_DEMO, // GAME: Mode demostració amb IA (futur) }; // Constructor inicial amb escena LOGO i sense opcions SceneContext() = default; // Canviar escena amb opció específica void setNextScene(SceneType next_scene, Option option = Option::NONE) { next_scene_ = next_scene; option_ = option; } // Consultar escena destinació [[nodiscard]] auto nextScene() const -> SceneType { return next_scene_; } // Consultar opció actual [[nodiscard]] auto option() const -> Option { return option_; } // Consumir opció (retorna valor i reseteja a NONE) // Utilitzar quan l'escena processa l'opció [[nodiscard]] auto consumeOption() -> Option { Option valor = option_; option_ = Option::NONE; return valor; } // Reset opció a NONE (sense retornar valor) void resetOption() { option_ = Option::NONE; } // Configurar match abans de transicionar a GAME void setMatchConfig(const GameConfig::MatchConfig& config) { match_config_ = config; } // Obtenir configuració de match (consumit per GameScene) [[nodiscard]] const GameConfig::MatchConfig& getMatchConfig() const { return match_config_; } private: SceneType next_scene_{SceneType::LOGO}; // SceneType a la qual transicionar Option option_{Option::NONE}; // Opció específica per l'escena GameConfig::MatchConfig match_config_; // Configuració de match (jugadors active, mode) }; // Variable global inline per gestionar l'escena actual (backward compatibility) // Sincronitzada amb context.nextScene() pel Director inline SceneContext::SceneType actual = SceneContext::SceneType::LOGO; } // namespace SceneManager