diff --git a/.gitignore b/.gitignore index 55ad898..70d6510 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.cache/ .vscode/ *data/config/config.yaml *stats.txt diff --git a/source/game/defaults.hpp b/source/game/defaults.hpp index 1c4ea2c..2ad72ef 100644 --- a/source/game/defaults.hpp +++ b/source/game/defaults.hpp @@ -88,4 +88,11 @@ constexpr int GAMEPAD_BUTTON_RIGHT = SDL_GAMEPAD_BUTTON_DPAD_RIGHT; // Botón d constexpr int GAMEPAD_BUTTON_JUMP = SDL_GAMEPAD_BUTTON_WEST; // Botón salto por defecto } // namespace Controls +// --- KIOSK --- +namespace Kiosk { +constexpr bool ENABLED = false; // Modo kiosko desactivado por defecto +constexpr const char* TEXT = ""; // Texto del modo kiosko por defecto +constexpr bool INFINITE_LIVES = false; // Vidas infinitas en modo kiosko desactivadas por defecto +} // namespace Kiosk + } // namespace Defaults diff --git a/source/game/options.cpp b/source/game/options.cpp index d5f4fcc..7d34da0 100644 --- a/source/game/options.cpp +++ b/source/game/options.cpp @@ -454,6 +454,37 @@ void loadGamepadControlsFromYaml(const fkyaml::node& yaml) { } } +// Carga configuración del modo kiosko desde YAML +void loadKioskConfigFromYaml(const fkyaml::node& yaml) { + if (yaml.contains("kiosk")) { + const auto& k = yaml["kiosk"]; + + if (k.contains("enabled")) { + try { + kiosk.enabled = k["enabled"].get_value(); + } catch (...) { + kiosk.enabled = Defaults::Kiosk::ENABLED; + } + } + + if (k.contains("text")) { + try { + kiosk.text = k["text"].get_value(); + } catch (...) { + kiosk.text = Defaults::Kiosk::TEXT; + } + } + + if (k.contains("infinite_lives")) { + try { + kiosk.infinite_lives = k["infinite_lives"].get_value(); + } catch (...) { + kiosk.infinite_lives = Defaults::Kiosk::INFINITE_LIVES; + } + } + } +} + // Crea e inicializa las opciones del programa void init() { #ifdef _DEBUG @@ -516,6 +547,7 @@ auto loadFromFile() -> bool { loadVideoConfigFromYaml(yaml); loadKeyboardControlsFromYaml(yaml); loadGamepadControlsFromYaml(yaml); + loadKioskConfigFromYaml(yaml); if (console) { std::cout << "Config file loaded successfully\n\n"; @@ -598,6 +630,14 @@ auto saveToFile() -> bool { file << " button_right: " << gamepadButtonToString(gamepad_controls.button_right) << "\n"; file << " button_jump: " << gamepadButtonToString(gamepad_controls.button_jump) << "\n"; + // KIOSK + file << "\n"; + file << "# KIOSK MODE\n"; + file << "kiosk:\n"; + file << " enabled: " << (kiosk.enabled ? "true" : "false") << "\n"; + file << " text: \"" << kiosk.text << "\"\n"; + file << " infinite_lives: " << (kiosk.infinite_lives ? "true" : "false") << "\n"; + file.close(); if (console) { diff --git a/source/game/options.hpp b/source/game/options.hpp index e522a3d..894af94 100644 --- a/source/game/options.hpp +++ b/source/game/options.hpp @@ -53,6 +53,13 @@ struct Stats { std::string worst_nightmare{Defaults::Stats::WORST_NIGHTMARE}; // Habitación con más muertes acumuladas }; +// Estructura para el modo kiosko +struct Kiosk { + bool enabled{Defaults::Kiosk::ENABLED}; // Indica si el modo kiosko está activo + std::string text{Defaults::Kiosk::TEXT}; // Texto a mostrar en el modo kiosko + bool infinite_lives{Defaults::Kiosk::INFINITE_LIVES}; // Indica si el jugador tiene vidas infinitas en modo kiosko +}; + // Estructura con opciones de la ventana struct Window { std::string caption{Texts::WINDOW_CAPTION}; // Texto que aparece en la barra de título de la ventana @@ -117,6 +124,7 @@ inline Window window{}; // Opciones relativas a la ventana inline Audio audio{}; // Opciones relativas al audio inline KeyboardControls keyboard_controls{}; // Teclas usadas para jugar inline GamepadControls gamepad_controls{}; // Botones del gamepad usados para jugar +inline Kiosk kiosk{}; // Opciones del modo kiosko // Ruta completa del fichero de configuración (establecida mediante setConfigFile) inline std::string config_file_path{};