// 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 GestorEscenes { // Context de transició entre escenes // Conté l'escena destinació i opcions específiques per aquella escena class ContextEscenes { public: // Tipus d'escena del joc enum class Escena { LOGO, // Pantalla d'inici (logo JAILGAMES) TITOL, // Pantalla de títol amb menú JOC, // Joc principal (Asteroids) EIXIR // Sortir del programa }; // Opcions específiques per a cada escena enum class Opcio { NONE, // Sense opcions especials (comportament per defecte) JUMP_TO_TITLE_MAIN, // TITOL: Saltar directament a MAIN (starfield instantani) // MODE_DEMO, // JOC: Mode demostració amb IA (futur) }; // Constructor inicial amb escena LOGO i sense opcions ContextEscenes() : escena_desti_(Escena::LOGO), opcio_(Opcio::NONE) {} // Canviar escena amb opció específica void canviar_escena(Escena nova_escena, Opcio opcio = Opcio::NONE) { escena_desti_ = nova_escena; opcio_ = opcio; } // Consultar escena destinació [[nodiscard]] auto escena_desti() const -> Escena { return escena_desti_; } // Consultar opció actual [[nodiscard]] auto opcio() const -> Opcio { return opcio_; } // Consumir opció (retorna valor i reseteja a NONE) // Utilitzar quan l'escena processa l'opció [[nodiscard]] auto consumir_opcio() -> Opcio { Opcio valor = opcio_; opcio_ = Opcio::NONE; return valor; } // Reset opció a NONE (sense retornar valor) void reset_opcio() { opcio_ = Opcio::NONE; } // Configurar partida abans de transicionar a JOC void set_config_partida(const GameConfig::ConfigPartida& config) { config_partida_ = config; } // Obtenir configuració de partida (consumit per EscenaJoc) [[nodiscard]] const GameConfig::ConfigPartida& get_config_partida() const { return config_partida_; } private: Escena escena_desti_; // Escena a la qual transicionar Opcio opcio_; // Opció específica per l'escena GameConfig::ConfigPartida config_partida_; // Configuració de partida (jugadors actius, mode) }; // Variable global inline per gestionar l'escena actual (backward compatibility) // Sincronitzada amb context.escena_desti() pel Director inline ContextEscenes::Escena actual = ContextEscenes::Escena::LOGO; } // namespace GestorEscenes