-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOptionsMenu.cs
More file actions
135 lines (111 loc) · 3.43 KB
/
OptionsMenu.cs
File metadata and controls
135 lines (111 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using FunkEngine;
using Godot;
public partial class OptionsMenu : CanvasLayer, IFocusableMenu
{
public static readonly string LoadPath = "res://Scenes/UI/Options/OptionsMenu.tscn";
public IFocusableMenu Prev { get; set; }
[Export]
private Control _focused;
private ProcessModeEnum _previousProcessMode;
[Export]
private HSlider _volumeSlider;
[Export]
private Button _closeButton;
[Export]
private Button _controlsButton;
[Export]
private CheckBox _highContrastToggle;
[Export]
private Button _howToPlayButton;
private const float MinVolumeVal = 0f;
public override void _Ready()
{
_volumeSlider.MinValue = MinVolumeVal;
_volumeSlider.Value = Mathf.DbToLinear(
AudioServer.GetBusVolumeDb(AudioServer.GetBusIndex("Master"))
);
_highContrastToggle.ButtonPressed = SaveSystem
.GetConfigValue(SaveSystem.ConfigSettings.HighContrast)
.AsBool();
_volumeSlider.DragEnded += VolumeChanged;
_volumeSlider.ValueChanged += ChangeVolume;
_closeButton.Pressed += ReturnToPrev;
_controlsButton.Pressed += OpenControls;
_highContrastToggle.Toggled += HighContrastChanged;
_howToPlayButton.Pressed += OpenHowToPlay;
}
public override void _Input(InputEvent @event)
{
if (!GetWindow().HasFocus())
{
GetViewport().SetInputAsHandled();
return;
}
if (@event.IsActionPressed("ui_cancel"))
{
ReturnToPrev();
GetViewport().SetInputAsHandled();
}
}
public void ResumeFocus()
{
ProcessMode = _previousProcessMode;
_focused.GrabFocus();
}
public void PauseFocus()
{
_focused = GetViewport().GuiGetFocusOwner();
_previousProcessMode = ProcessMode;
ProcessMode = ProcessModeEnum.Disabled;
}
public void OpenMenu(IFocusableMenu prev)
{
Prev = prev;
Prev.PauseFocus();
_focused.GrabFocus();
}
public void ReturnToPrev()
{
Prev.ResumeFocus();
QueueFree();
}
private void OpenControls()
{
ControlSettings controlSettings = GD.Load<PackedScene>(ControlSettings.LoadPath)
.Instantiate<ControlSettings>();
AddChild(controlSettings);
controlSettings.OpenMenu(this);
}
private void VolumeChanged(bool valueChanged)
{
if (!valueChanged)
return;
ChangeVolume((float)_volumeSlider.Value);
SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.Volume, _volumeSlider.Value);
}
public static void ChangeVolume(double value)
{
AudioServer.SetBusVolumeDb(
AudioServer.GetBusIndex("Master"),
(float)Mathf.LinearToDb(value)
);
}
private void HighContrastChanged(bool toggled)
{
StageProducer.ContrastFilter.Visible = toggled;
SaveSystem.UpdateConfig(SaveSystem.ConfigSettings.HighContrast, toggled);
}
private void OpenHowToPlay()
{
HowToPlay howtoPlay = GD.Load<PackedScene>(HowToPlay.LoadPath).Instantiate<HowToPlay>();
AddChild(howtoPlay);
howtoPlay.OpenMenu(this);
}
private void OpenCredits()
{
CreditsMenu creditsMenu = GD.Load<PackedScene>(CreditsMenu.LoadPath)
.Instantiate<CreditsMenu>();
AddChild(creditsMenu);
creditsMenu.OpenMenu(this);
}
}