From 439f5fdb3805058200db590247803645facd8d36 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 27 Jun 2025 09:36:36 +0200 Subject: [PATCH] style: Options --- source/options.cpp | 28 ---------- source/options.h | 129 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 97 insertions(+), 60 deletions(-) diff --git a/source/options.cpp b/source/options.cpp index e96891e..b2def12 100644 --- a/source/options.cpp +++ b/source/options.cpp @@ -31,34 +31,6 @@ namespace Options // Inicializa las opciones del programa void init() { - // Opciones de ventana - window.caption = "Coffee Crisis Arcade Edition"; - window.size = 2; - - // Opciones de video - video.fullscreen = false; - video.scale_mode = SDL_ScaleMode::SDL_SCALEMODE_NEAREST; - video.v_sync = true; - video.integer_scale = true; - video.shaders = false; - - // Opciones de audio - audio.enabled = true; - audio.volume = 100; - audio.music.enabled = true; - audio.music.volume = 100; - audio.sound.enabled = true; - audio.sound.volume = 50; - - // Opciones de configuracion - settings.difficulty = DifficultyCode::NORMAL; - settings.language = Lang::Code::VALENCIAN; - settings.autofire = true; - settings.shutdown_enabled = false; - settings.is_y_axis_inverted = false; - settings.clearLastHiScoreEntries(); - settings.config_file = Asset::get()->get("config.txt"); - // Opciones de control controllers.clear(); controllers.resize(2); diff --git a/source/options.h b/source/options.h index c79ab71..c413db3 100644 --- a/source/options.h +++ b/source/options.h @@ -6,6 +6,9 @@ #include // Para std::vector #include "input.h" // Para InputAction, InputDeviceToUse #include "manage_hiscore_table.h" // Para HiScoreEntry +#include "asset.h" + +static constexpr int INVALID_INDEX = -1; namespace Lang { @@ -32,12 +35,18 @@ namespace Options : code(c), name(n) {} }; - // --- Opciones de la ventana --- + // --- Opciones de ventana --- struct WindowOptions { std::string caption; // Texto que aparece en la barra de título de la ventana - int size = 1; // Valor por el que se multiplica el tamaño de la ventana - int max_size = 1; // Tamaño máximo para que la ventana no sea mayor que la pantalla + int size; // Valor por el que se multiplica el tamaño de la ventana + int max_size; // Tamaño máximo para que la ventana no sea mayor que la pantalla + + // Constructor por defecto con valores iniciales + WindowOptions() + : caption("Coffee Crisis Arcade Edition"), + size(2), + max_size(2) {} }; // --- Opciones de vídeo --- @@ -49,6 +58,15 @@ namespace Options bool integer_scale; // Indica si se usa escalado entero bool shaders; // Indica si se usan shaders para los filtros de vídeo std::string info; // Información sobre el modo de vídeo + + // Constructor por defecto con valores iniciales + VideoOptions() + : scale_mode(SDL_ScaleMode::SDL_SCALEMODE_NEAREST), + fullscreen(false), + v_sync(true), + integer_scale(true), + shaders(false), + info() {} }; // --- Opciones de música --- @@ -56,6 +74,11 @@ namespace Options { bool enabled; // Indica si la música suena o no int volume; // Volumen de la música + + // Constructor por defecto + MusicOptions() + : enabled(true), + volume(100) {} }; // --- Opciones de sonido --- @@ -63,6 +86,11 @@ namespace Options { bool enabled; // Indica si los sonidos suenan o no int volume; // Volumen de los sonidos + + // Constructor por defecto + SoundOptions() + : enabled(true), + volume(100) {} }; // --- Opciones de audio --- @@ -72,25 +100,42 @@ namespace Options SoundOptions sound; // Opciones para los efectos de sonido bool enabled; // Indica si el audio está activo o no int volume; // Volumen general del audio + + // Constructor por defecto + AudioOptions() + : music(), + sound(), + enabled(true), + volume(100) {} }; - // --- Opciones de configuracion --- + // --- Opciones de configuración --- struct SettingsOptions { - DifficultyCode difficulty; // Dificultad del juego - Lang::Code language; // Idioma usado en el juego - bool autofire; // Indicador de autofire - bool shutdown_enabled; // Especifica si se puede apagar el sistema - bool is_y_axis_inverted; // Indica si hay que invertir el eje Y de los controles - std::vector hi_score_table; // Tabla de mejores puntuaciones - std::vector last_hi_score_entry = {-1, -1}; // Últimas posiciones de entrada en la tabla - std::string config_file; // Ruta al fichero donde guardar la configuracion y las opciones del juego + DifficultyCode difficulty; // Dificultad del juego + Lang::Code language; // Idioma usado en el juego + bool autofire; // Indicador de autofire + bool shutdown_enabled; // Especifica si se puede apagar el sistema + bool is_y_axis_inverted; // Indica si hay que invertir el eje Y de los controles + std::vector hi_score_table; // Tabla de mejores puntuaciones + std::vector last_hi_score_entry; // Últimas posiciones de entrada en la tabla + std::string config_file; // Ruta al fichero donde guardar la configuración y las opciones del juego + + // Constructor por defecto con valores iniciales + SettingsOptions() + : difficulty(DifficultyCode::NORMAL), + language(Lang::Code::VALENCIAN), + autofire(true), + shutdown_enabled(false), + is_y_axis_inverted(false), + last_hi_score_entry({INVALID_INDEX, INVALID_INDEX}), + config_file(Asset::get()->get("config.txt")) {} // Reinicia las últimas entradas de puntuación void clearLastHiScoreEntries() { - last_hi_score_entry[0] = -1; - last_hi_score_entry[1] = -1; + last_hi_score_entry[0] = INVALID_INDEX; + last_hi_score_entry[1] = INVALID_INDEX; } }; @@ -107,17 +152,37 @@ namespace Options // Constructor por defecto GamepadOptions() - : index(-1), player_id(-1), type(InputDeviceToUse::CONTROLLER), name(""), plugged(false), - inputs{InputAction::FIRE_LEFT, InputAction::FIRE_CENTER, InputAction::FIRE_RIGHT, InputAction::START, InputAction::SERVICE}, - buttons{SDL_GAMEPAD_BUTTON_WEST, SDL_GAMEPAD_BUTTON_NORTH, SDL_GAMEPAD_BUTTON_EAST, SDL_GAMEPAD_BUTTON_START, SDL_GAMEPAD_BUTTON_BACK} {} + : index(INVALID_INDEX), + player_id(INVALID_INDEX), + type(InputDeviceToUse::CONTROLLER), + name(), + plugged(false), + inputs{ + InputAction::FIRE_LEFT, + InputAction::FIRE_CENTER, + InputAction::FIRE_RIGHT, + InputAction::START, + InputAction::SERVICE}, + buttons{ + SDL_GAMEPAD_BUTTON_WEST, + SDL_GAMEPAD_BUTTON_NORTH, + SDL_GAMEPAD_BUTTON_EAST, + SDL_GAMEPAD_BUTTON_START, + SDL_GAMEPAD_BUTTON_BACK} {} }; // --- Opciones pendientes de aplicar --- struct PendingChanges { - Lang::Code new_language; // Idioma en espera de aplicar - DifficultyCode new_difficulty; // Dificultad en espera de aplicar - bool has_pending_changes = false; // Indica si hay cambios pendientes + Lang::Code new_language; // Idioma en espera de aplicar + DifficultyCode new_difficulty; // Dificultad en espera de aplicar + bool has_pending_changes; // Indica si hay cambios pendientes + + // Constructor por defecto con valores iniciales + PendingChanges() + : new_language(Lang::Code::VALENCIAN), + new_difficulty(DifficultyCode::NORMAL), + has_pending_changes(false) {} }; // --- Variables globales --- @@ -127,18 +192,18 @@ namespace Options extern AudioOptions audio; // Opciones de audio extern std::vector controllers; // Opciones de mando para cada jugador extern PendingChanges pending_changes; // Opciones que se aplican al cerrar - extern std::vector difficulties; + extern std::vector difficulties; // Lista de los diferentes tipos de dificultad // --- Funciones de configuración --- - void init(); // Inicializa las opciones del programa - bool loadFromFile(); // Carga el fichero de configuración - bool saveToFile(); // Guarda el fichero de configuración - void setKeyboardToPlayer(int player_id); // Asigna el teclado al jugador - void swapKeyboard(); // Intercambia el teclado de jugador - void swapControllers(); // Intercambia los jugadores asignados a los dos primeros mandos - int getPlayerWhoUsesKeyboard(); // Averigua quién está usando el teclado - void applyPendingChanges(); // Aplica los cambios pendientes copiando los valores a sus variables - void checkPendingChanges(); - DifficultyCode getDifficultyCodeFromName(const std::string &name); - std::string getDifficultyNameFromCode(DifficultyCode code); + void init(); // Inicializa las opciones del programa + bool loadFromFile(); // Carga el fichero de configuración + bool saveToFile(); // Guarda el fichero de configuración + void setKeyboardToPlayer(int player_id); // Asigna el teclado al jugador + void swapKeyboard(); // Intercambia el teclado de jugador + void swapControllers(); // Intercambia los jugadores asignados a los dos primeros mandos + int getPlayerWhoUsesKeyboard(); // Averigua quién está usando el teclado + void applyPendingChanges(); // Aplica los cambios pendientes copiando los valores a sus variables + void checkPendingChanges(); // Verifica si hay cambios pendientes + DifficultyCode getDifficultyCodeFromName(const std::string &name); // Obtiene el código de dificultad a partir del nombre + std::string getDifficultyNameFromCode(DifficultyCode code); // Obtiene el nombre de la dificultad a partir del código } // namespace Options \ No newline at end of file