#pragma once #include // Para string #include // Para vector #include "game/gameplay/zone.hpp" // Para Zone::Data /** * @brief Singleton que carga y gestiona el catálogo de zonas * * Carga data/zones/zones.yaml en init() y permite consultar zonas por nombre. * El loader usa Resource::Helper::loadFile, que soporta tanto el resource pack * como el filesystem (modo desarrollo). Por eso ZoneManager no depende del * Resource::Cache y puede inicializarse en cualquier momento antes de * RoomFormat::loadYAML. */ class ZoneManager { public: // Gestión singleton static void init(); // Carga zones.yaml y crea el singleton static void destroy(); // Destruye el singleton static auto get() -> ZoneManager*; // Acceso al singleton /** * @brief Devuelve la zona con el nombre indicado, o nullptr si no existe */ [[nodiscard]] auto getZone(const std::string& name) const -> const Zone::Data*; /** * @brief Devuelve la zona por defecto (primera del fichero), o nullptr si no hay zonas * * Se usa como fallback cuando una room.yaml no especifica zone o especifica * una zona desconocida. */ [[nodiscard]] auto getDefaultZone() const -> const Zone::Data*; /** * @brief Devuelve la lista de nombres de todas las zonas (para validación en editor) */ [[nodiscard]] auto getZoneNames() const -> std::vector; private: // Constantes singleton static ZoneManager* zone_manager; // [SINGLETON] Objeto privado // Constructor y destructor privados [SINGLETON] ZoneManager() = default; ~ZoneManager() = default; // Carga el yaml y rellena zones_ void loadFromFile(const std::string& file_path); // Variables miembro std::vector zones_; // Catálogo de zonas };