56 lines
1.8 KiB
C++
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
|
|
};
|