From 8c48a9a7722925cc95b115f9542021c9e227f43f Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 24 May 2026 18:40:33 +0200 Subject: [PATCH] =?UTF-8?q?feat(config):=20persist=C3=A8ncia=20de=20les=20?= =?UTF-8?q?opcions=20d'=C3=A0udio=20al=20config.yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/core/config/engine_config.hpp | 10 +++++++ source/core/system/director.cpp | 13 +++++---- source/core/system/service_menu.cpp | 12 +++++++++ source/game/config_yaml.cpp | 40 ++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 7 deletions(-) diff --git a/source/core/config/engine_config.hpp b/source/core/config/engine_config.hpp index e871703..a9a3f7d 100644 --- a/source/core/config/engine_config.hpp +++ b/source/core/config/engine_config.hpp @@ -56,9 +56,19 @@ namespace Config { std::string gamepad_name; // Empty = auto-assign by index }; + struct AudioConfig { + bool enabled{true}; + float volume{1.0F}; // Master 0..1 + bool music_enabled{true}; + float music_volume{1.0F}; + bool sound_enabled{true}; + float sound_volume{0.25F}; + }; + struct EngineConfig { WindowConfig window{}; RenderingConfig rendering{}; + AudioConfig audio{}; PlayerBindings player1{}; PlayerBindings player2{}; KeyboardBindings keyboard_controls{}; // Defaults globals per Input diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 0422a14..f85aa3c 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -11,7 +11,6 @@ #include "core/audio/audio.hpp" #include "core/audio/audio_adapter.hpp" -#include "core/defaults/audio.hpp" #include "core/defaults/window.hpp" #include "core/input/input.hpp" #include "core/input/mouse.hpp" @@ -138,12 +137,12 @@ Director::Director(int argc, char* argv[]) } const Audio::Config AUDIO_CONFIG{ - .enabled = Defaults::Audio::ENABLED, - .volume = Defaults::Audio::VOLUME, - .music_enabled = Defaults::Audio::MUSIC_ENABLED, - .music_volume = Defaults::Audio::MUSIC_VOLUME, - .sound_enabled = Defaults::Audio::SOUND_ENABLED, - .sound_volume = Defaults::Audio::SOUND_VOLUME, + .enabled = cfg_->audio.enabled, + .volume = cfg_->audio.volume, + .music_enabled = cfg_->audio.music_enabled, + .music_volume = cfg_->audio.music_volume, + .sound_enabled = cfg_->audio.sound_enabled, + .sound_volume = cfg_->audio.sound_volume, }; Audio::init(AUDIO_CONFIG); Audio::get()->applySettings(AUDIO_CONFIG); diff --git a/source/core/system/service_menu.cpp b/source/core/system/service_menu.cpp index 67b026f..6960e29 100644 --- a/source/core/system/service_menu.cpp +++ b/source/core/system/service_menu.cpp @@ -299,6 +299,8 @@ namespace System { .on_change = [](int) { if (auto* a = Audio::get(); a != nullptr) { a->toggleEnabled(); + ConfigYaml::engine_config.audio.enabled = a->isEnabled(); + ConfigYaml::saveToFile(); } }, }, // VOLUM GENERAL (master) @@ -315,6 +317,8 @@ namespace System { .on_change = [step_volume](int dir) { if (auto* a = Audio::get(); a != nullptr) { a->setMasterVolume(step_volume(a->getMasterVolume(), dir)); + ConfigYaml::engine_config.audio.volume = a->getMasterVolume(); + ConfigYaml::saveToFile(); } }, }, // MUSICA ON/OFF @@ -330,6 +334,8 @@ namespace System { .on_change = [](int) { if (auto* a = Audio::get(); a != nullptr) { a->toggleMusic(); + ConfigYaml::engine_config.audio.music_enabled = a->isMusicEnabled(); + ConfigYaml::saveToFile(); } }, }, // VOLUM MUSICA @@ -346,6 +352,8 @@ namespace System { .on_change = [step_volume](int dir) { if (auto* a = Audio::get(); a != nullptr) { a->setMusicVolume(step_volume(a->getMusicVolume(), dir)); + ConfigYaml::engine_config.audio.music_volume = a->getMusicVolume(); + ConfigYaml::saveToFile(); } }, }, // SONS ON/OFF @@ -361,6 +369,8 @@ namespace System { .on_change = [](int) { if (auto* a = Audio::get(); a != nullptr) { a->toggleSound(); + ConfigYaml::engine_config.audio.sound_enabled = a->isSoundEnabled(); + ConfigYaml::saveToFile(); } }, }, // VOLUM SONS @@ -377,6 +387,8 @@ namespace System { .on_change = [step_volume](int dir) { if (auto* a = Audio::get(); a != nullptr) { a->setSoundVolume(step_volume(a->getSoundVolume(), dir)); + ConfigYaml::engine_config.audio.sound_volume = a->getSoundVolume(); + ConfigYaml::saveToFile(); } }, }, }; diff --git a/source/game/config_yaml.cpp b/source/game/config_yaml.cpp index 1527912..4c1d9ce 100644 --- a/source/game/config_yaml.cpp +++ b/source/game/config_yaml.cpp @@ -5,6 +5,7 @@ #include #include +#include "core/defaults/audio.hpp" #include "core/defaults/rendering.hpp" #include "core/defaults/window.hpp" #include "external/fkyaml_node.hpp" @@ -17,6 +18,7 @@ namespace ConfigYaml { // Permeten escriure window.width en lloc d'engine_config.window.width. Config::WindowConfig& window = engine_config.window; Config::RenderingConfig& rendering = engine_config.rendering; + Config::AudioConfig& audio = engine_config.audio; Config::PlayerBindings& player1 = engine_config.player1; Config::PlayerBindings& player2 = engine_config.player2; bool& console = engine_config.console; @@ -209,6 +211,14 @@ namespace ConfigYaml { rendering.render_width = Defaults::Rendering::RENDER_WIDTH_DEFAULT; rendering.render_height = Defaults::Rendering::RENDER_HEIGHT_DEFAULT; + // Audio + audio.enabled = Defaults::Audio::ENABLED; + audio.volume = Defaults::Audio::VOLUME; + audio.music_enabled = Defaults::Audio::MUSIC_ENABLED; + audio.music_volume = Defaults::Audio::MUSIC_VOLUME; + audio.sound_enabled = Defaults::Audio::SOUND_ENABLED; + audio.sound_volume = Defaults::Audio::SOUND_VOLUME; + // Idioma locale = "ca"; @@ -307,6 +317,22 @@ namespace ConfigYaml { } } + static void loadAudioConfigFromYaml(const fkyaml::node& yaml) { + if (!yaml.contains("audio")) { + return; + } + const auto& aud = yaml["audio"]; + + auto in_unit_range = [](float v) { return v >= 0.0F && v <= 1.0F; }; + + readField(aud, "enabled", audio.enabled, Defaults::Audio::ENABLED); + readField(aud, "volume", audio.volume, Defaults::Audio::VOLUME, in_unit_range); + readField(aud, "music_enabled", audio.music_enabled, Defaults::Audio::MUSIC_ENABLED); + readField(aud, "music_volume", audio.music_volume, Defaults::Audio::MUSIC_VOLUME, in_unit_range); + readField(aud, "sound_enabled", audio.sound_enabled, Defaults::Audio::SOUND_ENABLED); + readField(aud, "sound_volume", audio.sound_volume, Defaults::Audio::SOUND_VOLUME, in_unit_range); + } + // Carregar controls del player 1 desde YAML static void loadPlayer1ControlsFromYaml(const fkyaml::node& yaml) { if (!yaml.contains("player1")) { @@ -447,6 +473,7 @@ namespace ConfigYaml { // Carregar seccions loadWindowConfigFromYaml(yaml); loadRenderingConfigFromYaml(yaml); + loadAudioConfigFromYaml(yaml); loadPlayer1ControlsFromYaml(yaml); loadPlayer2ControlsFromYaml(yaml); @@ -479,6 +506,17 @@ namespace ConfigYaml { } } + static void saveAudioConfigToYaml(std::ofstream& file) { + file << "# AUDIO\n"; + file << "audio:\n"; + file << " enabled: " << (audio.enabled ? "true" : "false") << " # ON/OFF general\n"; + file << " volume: " << audio.volume << " # Master 0.0-1.0\n"; + file << " music_enabled: " << (audio.music_enabled ? "true" : "false") << "\n"; + file << " music_volume: " << audio.music_volume << " # 0.0-1.0\n"; + file << " sound_enabled: " << (audio.sound_enabled ? "true" : "false") << "\n"; + file << " sound_volume: " << audio.sound_volume << " # 0.0-1.0\n\n"; + } + // Guardar controls del player 1 a YAML static void savePlayer1ControlsToYaml(std::ofstream& file) { file << "# CONTROLS JUGADOR 1\n"; @@ -549,6 +587,8 @@ namespace ConfigYaml { file << "# IDIOMA\n"; file << "locale: " << locale << " # ca | en\n\n"; + saveAudioConfigToYaml(file); + // Guardar controls de jugadors savePlayer1ControlsToYaml(file); savePlayer2ControlsToYaml(file);