#pragma once #include // Para SDL_Scancode #include namespace Options { // Estructures de configuració struct Window { int width{640}; int height{480}; bool fullscreen{false}; float zoom_factor{1.0F}; // Zoom level (0.5x to max_zoom) }; struct Physics { float rotation_speed{3.14F}; // rad/s float acceleration{400.0F}; // px/s² float max_velocity{120.0F}; // px/s float friction{20.0F}; // px/s² float enemy_speed{2.0F}; // unitats/frame float bullet_speed{6.0F}; // unitats/frame }; struct Gameplay { int max_enemies{15}; int max_bullets{3}; }; struct Rendering { int vsync{1}; // 0=disabled, 1=enabled }; struct Music { bool enabled{true}; float volume{0.8F}; }; struct Sound { bool enabled{true}; float volume{1.0F}; }; struct Audio { Music music{}; Sound sound{}; bool enabled{true}; float volume{1.0F}; }; // Controles de jugadors struct KeyboardControls { SDL_Scancode key_left{SDL_SCANCODE_LEFT}; SDL_Scancode key_right{SDL_SCANCODE_RIGHT}; SDL_Scancode key_thrust{SDL_SCANCODE_UP}; SDL_Scancode key_shoot{SDL_SCANCODE_SPACE}; SDL_Scancode key_start{SDL_SCANCODE_1}; }; struct GamepadControls { int button_left{SDL_GAMEPAD_BUTTON_DPAD_LEFT}; int button_right{SDL_GAMEPAD_BUTTON_DPAD_RIGHT}; int button_thrust{SDL_GAMEPAD_BUTTON_WEST}; // X button int button_shoot{SDL_GAMEPAD_BUTTON_SOUTH}; // A button }; struct PlayerControls { KeyboardControls keyboard{}; GamepadControls gamepad{}; std::string gamepad_name{""}; // Buit = auto-assignar per índex }; // Variables globals (inline per evitar ODR violations) inline std::string version{}; // Versió del config per validació inline bool console{false}; // Eixida de debug inline Window window{}; inline Physics physics{}; inline Gameplay gameplay{}; inline Rendering rendering{}; inline Audio audio{}; // Controles per jugador inline PlayerControls player1{ .keyboard = {.key_left = SDL_SCANCODE_LEFT, .key_right = SDL_SCANCODE_RIGHT, .key_thrust = SDL_SCANCODE_UP, .key_shoot = SDL_SCANCODE_SPACE, .key_start = SDL_SCANCODE_1}, .gamepad_name = "" // Primer gamepad disponible }; inline PlayerControls player2{ .keyboard = {.key_left = SDL_SCANCODE_A, .key_right = SDL_SCANCODE_D, .key_thrust = SDL_SCANCODE_W, .key_shoot = SDL_SCANCODE_LSHIFT, .key_start = SDL_SCANCODE_2}, .gamepad_name = "" // Segon gamepad disponible }; // Per compatibilitat amb pollo (no utilitzat en orni, però necessari per Input) inline KeyboardControls keyboard_controls{}; inline GamepadControls gamepad_controls{}; inline std::string config_file_path{}; // Establert per setConfigFile() // Funcions públiques void init(); // Inicialitzar amb valors per defecte void setConfigFile( const std::string& path); // Establir ruta del fitxer de config auto loadFromFile() -> bool; // Carregar config YAML auto saveToFile() -> bool; // Guardar config YAML } // namespace Options