Files
zfxaction25/DonkeysAndDroids.Godot/SettingsManager.cs
2026-04-19 00:43:27 +02:00

117 lines
3.1 KiB
C#

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";
}