Files
projecte_2026/source/game/gameplay/zone_manager.hpp
2026-04-10 13:58:59 +02:00

56 lines
1.8 KiB
C++

#pragma once
#include <string> // Para string
#include <vector> // 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
* RoomLoader::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<std::string>;
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<Zone::Data> zones_; // Catálogo de zonas
};