#pragma once #include // Para SDL_GamepadButton, SDL_ScaleMode #include // Para string, basic_string #include #include // Para vector #include "input.h" // Para InputAction, InputDevice #include "lang.h" // Para Code #include "manage_hiscore_table.h" // Para HiScoreEntry static constexpr int INVALID_INDEX = -1; namespace Options { // --- Dificultad del juego --- enum class DifficultyCode { EASY = 0, NORMAL = 1, HARD = 2, }; // --- Estructura que representa un nivel de dificultad struct Difficulty { DifficultyCode code; // Código que identifica la dificultad std::string name; // Nombre que identifica la dificultad Difficulty(DifficultyCode c, std::string n) : code(c), name(std::move(n)) {} }; // --- Opciones de ventana --- struct WindowOptions { std::string caption; // Texto que aparece en la barra de título de la ventana int size{2}; // Valor por el que se multiplica el tamaño de la ventana int max_size{2}; // 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") {} }; // --- Opciones de vídeo --- struct VideoOptions { SDL_ScaleMode scale_mode{SDL_ScaleMode::SDL_SCALEMODE_NEAREST}; // Filtro usado para el escalado de la imagen bool fullscreen{false}; // Indica si se usa pantalla completa bool v_sync{true}; // Indica si se usa vsync bool integer_scale{true}; // Indica si se usa escalado entero bool shaders{false}; // 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() : info() {} }; // --- Opciones de música --- struct MusicOptions { bool enabled{true}; // Indica si la música suena o no int volume{100}; // Volumen de la música // Constructor por defecto MusicOptions() {} }; // --- Opciones de sonido --- struct SoundOptions { bool enabled{true}; // Indica si los sonidos suenan o no int volume{100}; // Volumen de los sonidos // Constructor por defecto SoundOptions() {} }; // --- Opciones de audio --- struct AudioOptions { MusicOptions music; // Opciones para la música SoundOptions sound; // Opciones para los efectos de sonido bool enabled{true}; // Indica si el audio está activo o no int volume{100}; // Volumen general del audio // Constructor por defecto AudioOptions() : music(), sound() {} }; // --- Opciones de configuración --- struct SettingsOptions { DifficultyCode difficulty{DifficultyCode::NORMAL}; // Dificultad del juego Lang::Code language{Lang::Code::VALENCIAN}; // Idioma usado en el juego bool autofire{true}; // Indicador de autofire bool shutdown_enabled{false}; // Especifica si se puede apagar el sistema 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() : last_hi_score_entry({INVALID_INDEX, INVALID_INDEX}), config_file() {} // Reinicia las últimas entradas de puntuación void clearLastHiScoreEntries() { last_hi_score_entry[0] = INVALID_INDEX; last_hi_score_entry[1] = INVALID_INDEX; } }; // --- Opciones de mando --- struct GamepadOptions { int index; // Índice en el vector de mandos int player_id; // Jugador asociado al mando InputDevice type{InputDevice::CONTROLLER}; // Indica si se usará teclado, mando o ambos std::string name; // Nombre del dispositivo bool plugged{false}; // Indica si el mando está conectado std::vector inputs; // Listado de acciones asignadas std::vector buttons; // Listado de botones asignados a cada acción // Constructor por defecto GamepadOptions() : index(INVALID_INDEX), player_id(INVALID_INDEX), name(), 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{Lang::Code::VALENCIAN}; // Idioma en espera de aplicar DifficultyCode new_difficulty{DifficultyCode::NORMAL}; // Dificultad en espera de aplicar bool has_pending_changes{false}; // Indica si hay cambios pendientes // Constructor por defecto con valores iniciales PendingChanges() {} }; // --- Variables globales --- extern WindowOptions window; // Opciones de la ventana extern SettingsOptions settings; // Opciones del juego extern VideoOptions video; // Opciones de vídeo 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; // Lista de los diferentes tipos de dificultad // --- Funciones de configuración --- void init(); // Inicializa las opciones del programa auto loadFromFile() -> bool; // Carga el fichero de configuración auto saveToFile() -> bool; // 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 auto getPlayerWhoUsesKeyboard() -> int; // 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 auto getDifficultyCodeFromName(const std::string &name) -> DifficultyCode; // Obtiene el código de dificultad a partir del nombre auto getDifficultyNameFromCode(DifficultyCode code) -> std::string; // Obtiene el nombre de la dificultad a partir del código } // namespace Options