// scene_context.hpp - Sistema de gestió de escenes i context de transiciones // © 2025 Port a C++20 #pragma once #include "core/system/game_config.hpp" namespace SceneManager { // Context de transición entre escenes // Conté l'escena destinació i opciones específiques per aquella escena class SceneContext { public: // Tipo de escena del juego enum class SceneType { LOGO, // Pantalla de start (logo JAILGAMES) TITLE, // Pantalla de título con menú GAME, // Juego principal (Asteroids) EXIT // Salir del programa }; // Opciones específiques para cada escena enum class Option { NONE, // Sin opciones especials (comportament per defecte) JUMP_TO_TITLE_MAIN, // TITLE: Saltar directament a MAIN (starfield instantani) // MODE_DEMO, // GAME: Mode demostració con IA (futur) }; // Constructor inicial con escena LOGO i sin opciones SceneContext() = default; // Canviar escena con opción 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ón actual [[nodiscard]] auto option() const -> Option { return option_; } // Consumir opción (retorna value i reseteja a NONE) // Utilitzar cuando l'escena processa l'opción [[nodiscard]] auto consumeOption() -> Option { Option value = option_; option_ = Option::NONE; return value; } // Reset opción a NONE (sin retornar value) void resetOption() { option_ = Option::NONE; } // Configurar match antes de transicionar a GAME void setMatchConfig(const GameConfig::MatchConfig& config) { match_config_ = config; } // Obtenir configuración 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ón específica per l'escena GameConfig::MatchConfig match_config_; // Configuración de match (jugadors active, mode) }; // Variable global inline per gestionar l'escena actual (backward compatibility) // Sincronitzada con context.nextScene() por el Director inline SceneContext::SceneType actual = SceneContext::SceneType::LOGO; } // namespace SceneManager