#pragma once #include #include #include #include // KeyConfig: font única de veritat per a les tecles d'UI/sistema. // // Llegeix els valors per defecte des de `data/input/keys.yaml` (recurs read-only) // i opcionalment aplica overrides des d'un fitxer de l'usuari (per a remapejos // fets des del menú de servei). Els callers consulten per `id` (ex. "menu_toggle"). // // Les tecles de moviment del jugador NO viuen ací — es queden a Options::keys_game. struct KeyEntry { std::string id; std::string code; // nom SDL del scancode tal com apareix al YAML std::string desc; SDL_Scancode scancode{SDL_SCANCODE_UNKNOWN}; SDL_Scancode default_scancode{SDL_SCANCODE_UNKNOWN}; }; namespace KeyConfig { // Inicialitza KeyConfig llegint defaults des d'un recurs (via ResourceHelper) // i opcionalment sobreposant overrides des d'un fitxer de disc. void init(const std::string& defaults_resource_path, const std::string& user_overrides_disk_path); void destroy(); // Consulta el scancode actual associat a un id. Torna SDL_SCANCODE_UNKNOWN si no existix. [[nodiscard]] auto scancode(const std::string& id) -> SDL_Scancode; // Punter estable al scancode d'un id — útil per a Menu::ItemKind::KeyBind. // Torna nullptr si l'id no existix. [[nodiscard]] auto scancodePtr(const std::string& id) -> SDL_Scancode*; // Estableix el scancode d'un id. No persistix per si sol — cal cridar saveOverrides(). void setScancode(const std::string& id, SDL_Scancode sc); // True si el scancode coincidix amb alguna tecla d'UI registrada. // Usat pel Director per a evitar que tecles d'UI activen `key_pressed_` al joc. [[nodiscard]] auto isGuiKey(SDL_Scancode sc) -> bool; // Llistat complet de les entrades (per a HELP / debug / iteració). [[nodiscard]] auto entries() -> const std::vector&; // Persistix al fitxer d'overrides les entrades que difereixen del default. // Si no s'ha proporcionat user_overrides_disk_path al init, és no-op. auto saveOverrides() -> bool; } // namespace KeyConfig