diff --git a/Scenes/HUD/OptionsMenu.tscn b/Scenes/HUD/OptionsMenu.tscn index aeee29bc..9e69c2cf 100644 --- a/Scenes/HUD/OptionsMenu.tscn +++ b/Scenes/HUD/OptionsMenu.tscn @@ -31,9 +31,15 @@ layout_mode = 2 layout_mode = 2 size_flags_vertical = 4 theme = ExtResource("1_il8fq") -text = "Back" +text = "Save" icon = ExtResource("2_4kao5") +[node name="Reset" type="Button" parent="HBoxContainer"] +layout_mode = 2 +size_flags_vertical = 4 +theme = ExtResource("1_il8fq") +text = "Discard" + [node name="MusicRoomName" type="Label" parent="HBoxContainer"] layout_mode = 2 text = "Options" @@ -59,7 +65,7 @@ theme = ExtResource("1_il8fq") [node name="Label" type="Label" parent="ScrollContainer/HBoxContainer/HFlowContainer"] layout_mode = 2 -text = "Note: The options currently do nothing" +text = "Note: The options currently do something" [node name="Resolution" type="VBoxContainer" parent="ScrollContainer/HBoxContainer/HFlowContainer"] visible = false @@ -130,3 +136,4 @@ layout_mode = 2 AudioBusName = &"Effects" [connection signal="pressed" from="HBoxContainer/BackButton" to="." method="_on_back_button_pressed"] +[connection signal="pressed" from="HBoxContainer/Reset" to="." method="_on_discard_button_pressed"] diff --git a/Scripts/UI/AudioSlider.cs b/Scripts/UI/AudioSlider.cs index 3b42d12a..2014926d 100644 --- a/Scripts/UI/AudioSlider.cs +++ b/Scripts/UI/AudioSlider.cs @@ -11,6 +11,12 @@ public partial class AudioSlider : HSlider public override void _Ready() { _audioBusIndex = AudioServer.GetBusIndex(AudioBusName); + + CallDeferred(MethodName.InitializeDeferred); + } + + private void InitializeDeferred() + { this.Value = AudioServer.GetBusVolumeLinear(_audioBusIndex); this.ValueChanged += MusicVolumeSliderOnValueChanged; diff --git a/Scripts/UI/IntroLogos.cs b/Scripts/UI/IntroLogos.cs index 2f8c253c..193acd42 100644 --- a/Scripts/UI/IntroLogos.cs +++ b/Scripts/UI/IntroLogos.cs @@ -15,6 +15,7 @@ public partial class IntroLogos : CanvasLayer public override void _Ready() { + OptionsMenu.LoadSettings(); _ = AutoTransition(); } diff --git a/Scripts/UI/MenuBase.cs b/Scripts/UI/MenuBase.cs index c9af4e42..ae310182 100644 --- a/Scripts/UI/MenuBase.cs +++ b/Scripts/UI/MenuBase.cs @@ -10,7 +10,7 @@ public partial class MenuBase : Control [Signal] public delegate void MenuClosedEventHandler(); - protected void _on_back_button_pressed() + protected virtual void _on_back_button_pressed() { this.QueueFree(); diff --git a/Scripts/UI/OptionsMenu.cs b/Scripts/UI/OptionsMenu.cs index 9f96ab6c..e10f3753 100644 --- a/Scripts/UI/OptionsMenu.cs +++ b/Scripts/UI/OptionsMenu.cs @@ -21,9 +21,23 @@ public partial class OptionsMenu : MenuBase [Export] public CheckBox FullScreenToggle { get; private set; } //[Export] public HSlider MusicVolumeSlider { get; private set; } + + protected override void _on_back_button_pressed() + { + SaveSettings(); + + base._on_back_button_pressed(); + } + + protected void _on_discard_button_pressed() + { + LoadSettings(); + base._on_back_button_pressed(); + } public override void _Ready() { + LoadSettings(); foreach (var resolution in Resolutions) { ResolutionsList.AddItem($"{resolution.X}x{resolution.Y}"); @@ -70,4 +84,41 @@ public partial class OptionsMenu : MenuBase GD.Print($"Selected index: {index} {Resolutions[(int)index]}"); DisplayServer.WindowSetSize(Resolutions[(int)index]); } + + private void SaveSettings() + { + var config = new ConfigFile(); + + config.SetValue("Screen","FullScreenMode", (int)DisplayServer.WindowGetMode()); + config.SetValue("Screen", "VSyncMode", (int)DisplayServer.WindowGetVsyncMode()); + + config.SetValue("Audio", "Master", AudioServer.GetBusVolumeLinear(AudioServer.GetBusIndex("Master"))); + config.SetValue("Audio", "Music", AudioServer.GetBusVolumeLinear(AudioServer.GetBusIndex("Music"))); + config.SetValue("Audio", "Effects", AudioServer.GetBusVolumeLinear(AudioServer.GetBusIndex("Effects"))); + + config.Save("user://Settings.cfg"); + } + + public static void LoadSettings() + { + var config = new ConfigFile(); + Error err = config.Load("user://Settings.cfg"); + +// If the file didn't load, ignore it. + if (err != Error.Ok) + { + GD.PrintErr($"Error loading settings: {err}"); + return; + } + + DisplayServer.WindowSetMode((DisplayServer.WindowMode) config.GetValue("Screen", "FullScreenMode", (int)DisplayServer.WindowGetMode()).AsInt32()); + + DisplayServer.WindowSetVsyncMode((DisplayServer.VSyncMode)config.GetValue("Screen", "VSyncMode", (int)DisplayServer.WindowGetVsyncMode()).AsInt32()); + + AudioServer.SetBusVolumeLinear(AudioServer.GetBusIndex("Master"), config.GetValue("Audio", "Master", AudioServer.GetBusVolumeLinear(AudioServer.GetBusIndex("Master"))).AsSingle()); + + AudioServer.SetBusVolumeLinear(AudioServer.GetBusIndex("Effects"), config.GetValue("Audio", "Effects", AudioServer.GetBusVolumeLinear(AudioServer.GetBusIndex("Effects"))).AsSingle()); + + AudioServer.SetBusVolumeLinear(AudioServer.GetBusIndex("Music"), config.GetValue("Audio", "Music", AudioServer.GetBusVolumeLinear(AudioServer.GetBusIndex("Music"))).AsSingle()); + } } \ No newline at end of file