using Godot; public partial class SettingsManager : Node { public override void _EnterTree() { if (Instance != null && Instance != this) { QueueFree(); return; } Instance = this; } public override void _Ready() { LoadSettings(); ApplyVolumes(); } private void LoadSettings() { var config = new ConfigFile(); var err = config.Load(c_ConfigPath); if (err == Error.Ok) { MasterVolumeDb = (float)config.GetValue(c_SectionAudio, "master_db", c_DefaultMasterVolume); MusicVolumeDb = (float)config.GetValue(c_SectionAudio, "music_db", c_DefaultMusicVolume); SfxVolumeDb = (float)config.GetValue(c_SectionAudio, "sfx_db", c_DefaultSfxVolume); GameSpeed = (float)config.GetValue(c_SectionGame, "speed", c_DefaultGameSpeed); } else { MasterVolumeDb = c_DefaultMasterVolume; MusicVolumeDb = c_DefaultMusicVolume; SfxVolumeDb = c_DefaultSfxVolume; GameSpeed = c_DefaultGameSpeed; SaveSettings(); } } private void SaveSettings() { var config = new ConfigFile(); config.SetValue(c_SectionAudio, "master_db", MasterVolumeDb); config.SetValue(c_SectionAudio, "music_db", MusicVolumeDb); config.SetValue(c_SectionAudio, "sfx_db", SfxVolumeDb); config.SetValue(c_SectionGame, "speed", GameSpeed); config.Save(c_ConfigPath); } public void SetMasterVolume(float db) { MasterVolumeDb = db; ApplyVolumes(); SaveSettings(); } public void SetMusicVolume(float db) { MusicVolumeDb = db; ApplyVolumes(); SaveSettings(); } public void SetSfxVolume(float db) { SfxVolumeDb = db; ApplyVolumes(); SaveSettings(); } public void SetGameSpeed(float gameSpeed) { GameSpeed = gameSpeed; SaveSettings(); } private void ApplyVolumes() { var masterBus = AudioServer.GetBusIndex("Master"); var musicBus = AudioServer.GetBusIndex("Music"); var sfxBus = AudioServer.GetBusIndex("Sfx"); if (masterBus != -1) AudioServer.SetBusVolumeDb(masterBus, MasterVolumeDb); if (musicBus != -1) AudioServer.SetBusVolumeDb(musicBus, MusicVolumeDb); if (sfxBus != -1) AudioServer.SetBusVolumeDb(sfxBus, SfxVolumeDb); } public static SettingsManager Instance { get; private set; } public float MasterVolumeDb { get; private set; } public float MusicVolumeDb { get; private set; } public float SfxVolumeDb { get; private set; } public float GameSpeed { get; private set; } private const float c_DefaultMusicVolume = -16.0f; private const float c_DefaultSfxVolume = 0.0f; private const float c_DefaultMasterVolume = 0.0f; private const float c_DefaultGameSpeed = 1.0f; private const string c_ConfigPath = "user://settings.cfg"; private const string c_SectionAudio = "audio"; private const string c_SectionGame = "game"; }