#pragma once #include // Para SDL_CONTROLLER_BUTTON_B, SDL_CO... #include // Para Uint32 #include // Para string #include // Para vector #include "input.h" // Para InputAction, InputDeviceToUse #include "manage_hiscore_table.h" // Para HiScoreEntry enum class ScreenFilter : int; // lines 8-8 namespace lang { enum class Code : int; } // lines 12-12 // Dificultad del juego enum class GameDifficulty { EASY = 0, NORMAL = 1, HARD = 2, }; // Estructura para las opciones de la ventana struct WindowOptions { int zoom = 1; // Contiene el valor por el que se multiplica el tamaño de la ventana int max_zoom = 1; // Tamaño máximo para que el tamaño de la ventana no sea mayor que el tamaño de la pantalla }; // Estructura con opciones para el video struct VideoOptions { WindowOptions window; // Opciones para la ventana del programa ScreenFilter filter; // Filtro usado para el escalado de la imagen bool fullscreen; // Contiene el valor del modo de pantalla completa bool v_sync; // Indica si se quiere usar vsync o no bool integer_scale; // Indica si se va a usar el escalado entero bool shaders; // Indica si se van a usar shaders para los filtros de video }; // Estructura para las opciones de musica struct MusicOptions { bool enabled; // Indica si la musica suena o no int volume; // Volumen al que suena la música }; // Estructura para las opciones de sonido struct SoundOptions { bool enabled; // Indica si los sonidos suenan o no int volume; // Volumen al que suenan los sonidos }; // Estructura para las opciones de audio struct AudioOptions { MusicOptions music; // Opciones para la música SoundOptions sound; // Opciones para los efectos de sonido bool enabled; // Indica si el audio está activo o no int volume; // Volumen al que suenan el audio }; // Estructura para las opciones del juego struct GameOptions { GameDifficulty difficulty; // Dificultad del juego lang::Code language; // Idioma usado en el juego bool autofire; // Indicador de autofire std::vector hi_score_table; // Tabla de mejores puntuaciones std::vector last_hi_score_entry = {-1, -1}; // Inicialización directa con dos elementos en -1 // Método para reiniciar las últimas entradas de puntuación void clear_last_hi_score_entries() { last_hi_score_entry[0] = -1; last_hi_score_entry[1] = -1; } }; // Estructura para los controles del juego struct GamepadOptions { int index; // Indice en el vector de mandos int player_id; // Jugador asociado al mando InputDeviceToUse type; // Indica si se utilizará teclado o mando o ambos std::string name; // Nombre del dispositivo bool plugged; // Indica si el mando se encuentra conectado std::vector inputs; // Listado de inputs std::vector buttons; // Listado de botones asignados a cada input // 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} {} }; // Estructura con todas las opciones de configuración del programa struct Options { GameOptions game; // Opciones para el propio juego VideoOptions video; // Opciones relativas a la clase screen AudioOptions audio; // Opciones para el audio std::vector controllers; // Opciones con las asignaciones del mando para cada jugador }; // Variables extern Options options; // Inicializa las opciones del programa void initOptions(); // Carga el fichero de configuración bool loadOptionsFile(std::string file_path); // Guarda el fichero de configuración bool saveOptionsFile(std::string file_path); // Convierte valores de 0 a 100 en valores de 0 a 128 int to_JA_volume(int vol); // Asigna el teclado al jugador void setKeyboardToPlayer(int player_id); // Intercambia el teclado de jugador void swapOptionsKeyboard(); // Intercambia los jugadores asignados a los dos primeros mandos void swapOptionsControllers(); // Averigua quien está usando el teclado int getPlayerWhoUsesKeyboard();