#pragma once #include #include // Para string, basic_string #include #include // Para vector /** * @brief Tracker global de llaves recogidas (singleton) * * Mantiene un registro por habitación de las posiciones de las llaves recogidas, * de modo que al volver a entrar a una habitación las llaves ya cogidas no * vuelvan a aparecer. Mismo patrón que ItemTracker. */ class KeyTracker { public: // Gestión singleton static void init(); // Inicialización static void destroy(); // Destrucción static auto get() -> KeyTracker*; // Acceso al singleton // Gestión de llaves recogidas auto hasBeenPicked(const std::string& name, SDL_FPoint pos) -> bool; // Comprueba si la llave ya ha sido cogida void addKey(const std::string& name, SDL_FPoint pos); // Añade la llave a la lista 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 llaves cogidas // 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 KeyTracker* key_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] KeyTracker() = default; ~KeyTracker() = default; // Variables miembro std::vector keys_; // Lista de llaves recogidas por habitación };