#pragma once #include #include #include #include "core/scene/scene.hpp" #include "game/entities/entity_manager.hpp" #include "game/map/paint_layer.hpp" #include "game/map/tilemap.hpp" #ifdef _DEBUG #include "game/editor/editor.hpp" #endif class Hud; class Player; class Text; class GameScene : public Scene { public: // Conjunt de rutes que defineixen una piràmide concreta (mapa + tilemap // + sprites del jugador + música). Cada piràmide serà un Config distint; // `defaultConfig()` retorna la primera (Defaults::Pyramid). struct Config { std::string map_yaml; std::string player_sprite; std::string player_yaml; std::string music_track; }; [[nodiscard]] static auto defaultConfig() -> Config; explicit GameScene(Config config = defaultConfig()); ~GameScene() override; void update(int delta_ms) override; void render() override; private: // Consumeix events d'aquest frame (F11 del KeyConfig "pause" o botó // START del gamepad primari) per alternar l'estat de pausa. Quan // s'activa, pausa la música; en reprendre, la reprén. void handlePauseInput(); Config config_; Tilemap tilemap_; // Gestor d'entitats del nivell (sarcòfags, porta, momia, antorxa, // etc.). Viu aquí perquè la seua vida coincideix amb la de la escena; // cada entitat del nivell es carrega al ctor via loadFromLevel. EntityManager entity_manager_; // Vector des del principi: AEE suportarà multijugador local; cada Player // té els seus propis Controls i entra al vector amb una crida extra. std::vector> players_; // Capa de "pintat" del terra. Escolta `on_tile_entered` al bus, // filtra pintabilitat (sòl transitable) i re-publica `tile_painted` // per als sarcòfags. `unique_ptr` per controlar l'ordre de // construcció/destrucció: es crea al ctor un cop `entity_manager_` i // `tilemap_` estan llestos, i es destrueix abans que `entity_manager_` // (on viu el bus al qual està subscrit). Declarat després d'aquests // dos membres per garantir l'ordre invers a la destrucció. std::unique_ptr paint_layer_; // Marcador de la franja superior (24 px). `unique_ptr` per controlar // l'ordre de construcció/destrucció igual que `paint_layer_`: es crea // al ctor un cop `entity_manager_` ja té el bus, i es destrueix abans // que `entity_manager_` (on viu el bus al qual està subscrit). // Declarat després d'`entity_manager_` per garantir l'ordre invers a // la destrucció. std::unique_ptr hud_; // Pausa de gameplay. Quan `paused_` és true, l'update de jugadors i // entitats es salta (el món es congela); l'input d'UI (GlobalInputs, // Notifier, RenderInfo) continua per no perdre hotkeys ni l'overlay de // debug. La font s'instancia des del Surface ja cachejat al Director // (cap altra escena l'allibera, així que l'accés és segur). std::shared_ptr pause_font_; bool paused_{false}; #ifdef _DEBUG // Editor modal del tilemap. Mútuament excloent amb la pausa: si `paused_` // la tecla de toggle de l'editor s'ignora, i viceversa. Quan // `editor_.active()` és true, saltem entitats i jugador (update i // render) i deixem el tilemap visible perquè es pugui editar. Editor editor_; #endif };