#pragma once #include #include // Para string, basic_string #include #include // Para vector /** * @brief Tracker global de puertas abiertas (singleton) * * Mantiene un registro por habitación de las posiciones de las puertas que * ya han sido abiertas, de modo que al volver a entrar a una habitación las * puertas ya abiertas se reconstruyen directamente en estado OPENED. * Mismo patrón que ItemTracker. */ class DoorTracker { public: // Gestión singleton static void init(); // Inicialización static void destroy(); // Destrucción static auto get() -> DoorTracker*; // Acceso al singleton // Gestión de puertas abiertas auto hasBeenOpened(const std::string& name, SDL_FPoint pos) -> bool; // Comprueba si la puerta ya está abierta void addDoor(const std::string& name, SDL_FPoint pos); // Marca la puerta como abierta void clear(); // Vacía el tracker (reset de partida) private: // Tipos anidados privados struct Data { std::string name; // Nombre de la habitación std::vector pos; // Lista de posiciones de puertas abiertas // Constructor para facilitar creación con posición inicial Data(std::string name, const SDL_FPoint& position) : name(std::move(name)) { pos.push_back(position); } }; // Constantes privadas static constexpr int NOT_FOUND = -1; // Valor de retorno cuando no se encuentra un elemento // Constantes singleton static DoorTracker* door_tracker; // [SINGLETON] Objeto privado // Métodos privados auto findByName(const std::string& name) -> int; // Busca una entrada en la lista por nombre auto findByPos(int index, SDL_FPoint pos) -> int; // Busca una entrada en la lista por posición // Constructor y destructor privados [SINGLETON] DoorTracker() = default; ~DoorTracker() = default; // Variables miembro std::vector doors_; // Lista de puertas abiertas por habitación };