117 lines
3.1 KiB
C#
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";
|
|
} |