Skip to content

Commit 60c9ef6

Browse files
Decouple Framework from Scenes/Options
1 parent f92e46e commit 60c9ef6

15 files changed

Lines changed: 130 additions & 75 deletions

Template/Framework/Managers/AudioManager.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public class AudioManager : IDisposable, IAudioService
1313
private const float RandomPitchThreshold = 0.1f; // Minimum difference in pitch between repeated sounds.
1414
private const int MutedVolume = -80; // dB value representing mute.
1515
private const int MutedVolumeNormalized = -40; // Normalized muted volume for volume mapping.
16+
private const float DefaultMusicVolume = 100f;
17+
private const float DefaultSfxVolume = 100f;
1618

1719
// Variables
1820
private readonly RandomNumberGenerator _randomNumberGenerator = new();
@@ -39,7 +41,7 @@ public AudioManager(AutoloadsFramework autoloads, OptionsManager optionsManager)
3941
/// </summary>
4042
public void PlayMusic(AudioStream song, bool instant = true, double fadeOut = 1.5, double fadeIn = 0.5)
4143
{
42-
float musicVolume = _optionsManager.Settings.MusicVolume;
44+
float musicVolume = _optionsManager.Settings.GetFloat(FrameworkOptionsSaveKeys.MusicVolume, DefaultMusicVolume);
4345

4446
if (!instant && _musicPlayer.Playing)
4547
{
@@ -58,7 +60,7 @@ public void PlayMusic(AudioStream song, bool instant = true, double fadeOut = 1.
5860
/// </summary>
5961
public void PlaySFX(AudioStream sound, Vector2 position, float minPitch = MinDefaultRandomPitch, float maxPitch = MaxDefaultRandomPitch)
6062
{
61-
float sfxVolume = _optionsManager.Settings.SFXVolume;
63+
float sfxVolume = _optionsManager.Settings.GetFloat(FrameworkOptionsSaveKeys.SfxVolume, DefaultSfxVolume);
6264
AudioStreamPlayer2D sfxPlayer = _sfxPool.Acquire();
6365

6466
sfxPlayer.GlobalPosition = position;
@@ -91,15 +93,15 @@ public void FadeOutSFX(double fadeTime = 1)
9193
/// </summary>
9294
public void SetMusicVolume(float volume)
9395
{
94-
_optionsManager.Settings.MusicVolume = volume;
96+
_optionsManager.Settings.SetFloat(FrameworkOptionsSaveKeys.MusicVolume, volume);
9597
}
9698

9799
/// <summary>
98100
/// Sets the SFX volume for all active sound effect players. Volume is in config scale (0-100).
99101
/// </summary>
100102
public void SetSFXVolume(float volume)
101103
{
102-
_optionsManager.Settings.SFXVolume = volume;
104+
_optionsManager.Settings.SetFloat(FrameworkOptionsSaveKeys.SfxVolume, volume);
103105
}
104106

105107
internal void ApplyMusicVolumeFromSettings(float volume)

Template/Framework/Scenes/Options/Core/Components/OptionsAudioSettingsComponent.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void SetMusicVolume(float volume)
2020
if (_autoloads.AudioManager is not null)
2121
_autoloads.AudioManager.ApplyMusicVolumeFromSettings(clamped);
2222

23-
_valueStore.SetFloat(OptionsSaveKeys.MusicVolume, clamped);
23+
_valueStore.SetFloat(FrameworkOptionsSaveKeys.MusicVolume, clamped);
2424
}
2525

2626
public void SetSfxVolume(float volume)
@@ -30,6 +30,6 @@ public void SetSfxVolume(float volume)
3030
if (_autoloads.AudioManager is not null)
3131
_autoloads.AudioManager.ApplySfxVolumeFromSettings(clamped);
3232

33-
_valueStore.SetFloat(OptionsSaveKeys.SfxVolume, clamped);
33+
_valueStore.SetFloat(FrameworkOptionsSaveKeys.SfxVolume, clamped);
3434
}
3535
}

Template/Framework/Scenes/Options/Core/Components/OptionsDisplaySettingsComponent.cs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ public void ApplyStartupSettings()
3838
_visualSettings.ApplyStartupSettings();
3939
}
4040

41-
public void SetLanguage(Language language) => _visualSettings.SetLanguage(language);
42-
public void SetQualityPreset(QualityPreset qualityPreset) => _visualSettings.SetQualityPreset(qualityPreset);
41+
public void SetLanguage(int language) => _visualSettings.SetLanguage(language);
42+
public void SetQualityPreset(int qualityPreset) => _visualSettings.SetQualityPreset(qualityPreset);
4343
public void SetAntialiasing(int antialiasing) => _visualSettings.SetAntialiasing(antialiasing);
4444

4545
public void ToggleFullscreen()
@@ -53,7 +53,7 @@ public void ToggleFullscreen()
5353
public void SetWindowMode(WindowMode windowMode)
5454
{
5555
WindowMode clamped = CoerceWindowMode((int)windowMode);
56-
_valueStore.SetInt(OptionsSaveKeys.WindowMode, (int)clamped);
56+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowMode, (int)clamped);
5757
ApplyWindowMode();
5858

5959
if (clamped == WindowMode.Windowed)
@@ -64,8 +64,8 @@ public void SetWindowMode(WindowMode windowMode)
6464

6565
public void SetWindowSize(int width, int height)
6666
{
67-
_valueStore.SetInt(OptionsSaveKeys.WindowWidth, Math.Max(0, width));
68-
_valueStore.SetInt(OptionsSaveKeys.WindowHeight, Math.Max(0, height));
67+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowWidth, Math.Max(0, width));
68+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowHeight, Math.Max(0, height));
6969

7070
if (DisplayServer.WindowGetMode() == DisplayServer.WindowMode.Windowed)
7171
ApplyWindowSize();
@@ -74,14 +74,14 @@ public void SetWindowSize(int width, int height)
7474
public void SetVSyncMode(VSyncMode vsyncMode)
7575
{
7676
VSyncMode clamped = CoerceVSyncMode((int)vsyncMode);
77-
_valueStore.SetInt(OptionsSaveKeys.VSyncMode, (int)clamped);
77+
_valueStore.SetInt(FrameworkOptionsSaveKeys.VSyncMode, (int)clamped);
7878
ApplyVSyncMode();
7979
ApplyMaxFps();
8080
}
8181

8282
public void SetMaxFps(int maxFps)
8383
{
84-
_valueStore.SetInt(OptionsSaveKeys.MaxFps, Math.Max(0, maxFps));
84+
_valueStore.SetInt(FrameworkOptionsSaveKeys.MaxFps, Math.Max(0, maxFps));
8585
ApplyMaxFps();
8686
}
8787

@@ -91,8 +91,8 @@ public void PersistWindowSizeFromRuntime()
9191
return;
9292

9393
Vector2I size = DisplayServer.WindowGetSize();
94-
_valueStore.SetInt(OptionsSaveKeys.WindowWidth, Math.Max(0, size.X));
95-
_valueStore.SetInt(OptionsSaveKeys.WindowHeight, Math.Max(0, size.Y));
94+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowWidth, Math.Max(0, size.X));
95+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowHeight, Math.Max(0, size.Y));
9696
}
9797

9898
private void ApplyWindowMode()
@@ -140,36 +140,36 @@ private void ApplyMaxFps()
140140

141141
private WindowMode GetWindowMode()
142142
{
143-
WindowMode windowMode = CoerceWindowMode(_valueStore.GetInt(OptionsSaveKeys.WindowMode, DefaultWindowMode));
144-
_valueStore.SetInt(OptionsSaveKeys.WindowMode, (int)windowMode);
143+
WindowMode windowMode = CoerceWindowMode(_valueStore.GetInt(FrameworkOptionsSaveKeys.WindowMode, DefaultWindowMode));
144+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowMode, (int)windowMode);
145145
return windowMode;
146146
}
147147

148148
private VSyncMode GetVSyncMode()
149149
{
150-
VSyncMode mode = CoerceVSyncMode(_valueStore.GetInt(OptionsSaveKeys.VSyncMode, DefaultVSyncMode));
151-
_valueStore.SetInt(OptionsSaveKeys.VSyncMode, (int)mode);
150+
VSyncMode mode = CoerceVSyncMode(_valueStore.GetInt(FrameworkOptionsSaveKeys.VSyncMode, DefaultVSyncMode));
151+
_valueStore.SetInt(FrameworkOptionsSaveKeys.VSyncMode, (int)mode);
152152
return mode;
153153
}
154154

155155
private int GetWindowWidth()
156156
{
157-
int width = Math.Max(0, _valueStore.GetInt(OptionsSaveKeys.WindowWidth, DefaultWindowWidth));
158-
_valueStore.SetInt(OptionsSaveKeys.WindowWidth, width);
157+
int width = Math.Max(0, _valueStore.GetInt(FrameworkOptionsSaveKeys.WindowWidth, DefaultWindowWidth));
158+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowWidth, width);
159159
return width;
160160
}
161161

162162
private int GetWindowHeight()
163163
{
164-
int height = Math.Max(0, _valueStore.GetInt(OptionsSaveKeys.WindowHeight, DefaultWindowHeight));
165-
_valueStore.SetInt(OptionsSaveKeys.WindowHeight, height);
164+
int height = Math.Max(0, _valueStore.GetInt(FrameworkOptionsSaveKeys.WindowHeight, DefaultWindowHeight));
165+
_valueStore.SetInt(FrameworkOptionsSaveKeys.WindowHeight, height);
166166
return height;
167167
}
168168

169169
private int GetMaxFps()
170170
{
171-
int fps = Math.Max(0, _valueStore.GetInt(OptionsSaveKeys.MaxFps, DefaultMaxFps));
172-
_valueStore.SetInt(OptionsSaveKeys.MaxFps, fps);
171+
int fps = Math.Max(0, _valueStore.GetInt(FrameworkOptionsSaveKeys.MaxFps, DefaultMaxFps));
172+
_valueStore.SetInt(FrameworkOptionsSaveKeys.MaxFps, fps);
173173
return fps;
174174
}
175175

Template/Framework/Scenes/Options/Core/Components/OptionsSettingDispatcherComponent.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,25 @@ public void SetIntSetting(string key, int value)
3131
{
3232
switch (key)
3333
{
34-
case OptionsSaveKeys.Language:
35-
_displaySettings.SetLanguage((Language)value);
34+
case FrameworkOptionsSaveKeys.Language:
35+
_displaySettings.SetLanguage(value);
3636
return;
37-
case OptionsSaveKeys.QualityPreset:
38-
_displaySettings.SetQualityPreset((QualityPreset)value);
37+
case FrameworkOptionsSaveKeys.QualityPreset:
38+
_displaySettings.SetQualityPreset(value);
3939
return;
40-
case OptionsSaveKeys.Antialiasing:
40+
case FrameworkOptionsSaveKeys.Antialiasing:
4141
_displaySettings.SetAntialiasing(value);
4242
return;
43-
case OptionsSaveKeys.WindowMode:
43+
case FrameworkOptionsSaveKeys.WindowMode:
4444
_displaySettings.SetWindowMode((WindowMode)value);
4545
return;
46-
case OptionsSaveKeys.WindowWidth:
47-
_displaySettings.SetWindowSize(value, ReadOptionInt(OptionsSaveKeys.WindowHeight, DefaultWindowHeight));
46+
case FrameworkOptionsSaveKeys.WindowWidth:
47+
_displaySettings.SetWindowSize(value, ReadOptionInt(FrameworkOptionsSaveKeys.WindowHeight, DefaultWindowHeight));
4848
return;
49-
case OptionsSaveKeys.WindowHeight:
50-
_displaySettings.SetWindowSize(ReadOptionInt(OptionsSaveKeys.WindowWidth, DefaultWindowWidth), value);
49+
case FrameworkOptionsSaveKeys.WindowHeight:
50+
_displaySettings.SetWindowSize(ReadOptionInt(FrameworkOptionsSaveKeys.WindowWidth, DefaultWindowWidth), value);
5151
return;
52-
case OptionsSaveKeys.VSyncMode:
52+
case FrameworkOptionsSaveKeys.VSyncMode:
5353
_displaySettings.SetVSyncMode((VSyncMode)value);
5454
return;
5555
default:
@@ -62,13 +62,13 @@ public void SetFloatSetting(string key, float value)
6262
{
6363
switch (key)
6464
{
65-
case OptionsSaveKeys.MusicVolume:
65+
case FrameworkOptionsSaveKeys.MusicVolume:
6666
_audioSettings.SetMusicVolume(value);
6767
return;
68-
case OptionsSaveKeys.SfxVolume:
68+
case FrameworkOptionsSaveKeys.SfxVolume:
6969
_audioSettings.SetSfxVolume(value);
7070
return;
71-
case OptionsSaveKeys.MaxFps:
71+
case FrameworkOptionsSaveKeys.MaxFps:
7272
_displaySettings.SetMaxFps((int)value);
7373
return;
7474
default:

Template/Framework/Scenes/Options/Core/Components/OptionsVisualSettingsComponent.cs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@ namespace __TEMPLATE__.Ui;
55

66
internal sealed class OptionsVisualSettingsComponent
77
{
8-
private const int DefaultLanguage = (int)Language.English;
8+
private const int DefaultLanguage = 0;
9+
private const int MinLanguage = 0;
10+
private const int MaxLanguage = 2;
11+
private const int MinQualityPreset = 0;
12+
private const int MaxQualityPreset = 2;
913
private const int DefaultAntialiasing = 3;
1014

15+
private static readonly string[] SupportedLocales = ["en", "fr", "ja"];
16+
1117
private readonly OptionsValueStoreComponent _valueStore;
1218

1319
public OptionsVisualSettingsComponent(OptionsValueStoreComponent valueStore)
@@ -21,29 +27,30 @@ public void ApplyStartupSettings()
2127
ApplyAntialiasing();
2228
}
2329

24-
public void SetLanguage(Language language)
30+
public void SetLanguage(int language)
2531
{
26-
Language clamped = CoerceLanguage((int)language);
27-
_valueStore.SetInt(OptionsSaveKeys.Language, (int)clamped);
32+
int clamped = CoerceLanguage(language);
33+
_valueStore.SetInt(FrameworkOptionsSaveKeys.Language, clamped);
2834
ApplyLanguage();
2935
}
3036

31-
public void SetQualityPreset(QualityPreset qualityPreset)
37+
public void SetQualityPreset(int qualityPreset)
3238
{
33-
int clamped = Math.Clamp((int)qualityPreset, (int)QualityPreset.Low, (int)QualityPreset.High);
34-
_valueStore.SetInt(OptionsSaveKeys.QualityPreset, clamped);
39+
int clamped = Math.Clamp(qualityPreset, MinQualityPreset, MaxQualityPreset);
40+
_valueStore.SetInt(FrameworkOptionsSaveKeys.QualityPreset, clamped);
3541
}
3642

3743
public void SetAntialiasing(int antialiasing)
3844
{
39-
_valueStore.SetInt(OptionsSaveKeys.Antialiasing, Math.Clamp(antialiasing, 0, 3));
45+
_valueStore.SetInt(FrameworkOptionsSaveKeys.Antialiasing, Math.Clamp(antialiasing, 0, 3));
4046
ApplyAntialiasing();
4147
}
4248

4349
private void ApplyLanguage()
4450
{
45-
Language language = GetLanguage();
46-
TranslationServer.SetLocale(language.ToString()[..2].ToLower());
51+
int language = GetLanguage();
52+
int localeIndex = Math.Clamp(language, 0, SupportedLocales.Length - 1);
53+
TranslationServer.SetLocale(SupportedLocales[localeIndex]);
4754
}
4855

4956
private void ApplyAntialiasing()
@@ -53,23 +60,22 @@ private void ApplyAntialiasing()
5360
ProjectSettings.SetSetting("rendering/anti_aliasing/quality/msaa_3d", antialiasing);
5461
}
5562

56-
private Language GetLanguage()
63+
private int GetLanguage()
5764
{
58-
Language language = CoerceLanguage(_valueStore.GetInt(OptionsSaveKeys.Language, DefaultLanguage));
59-
_valueStore.SetInt(OptionsSaveKeys.Language, (int)language);
65+
int language = CoerceLanguage(_valueStore.GetInt(FrameworkOptionsSaveKeys.Language, DefaultLanguage));
66+
_valueStore.SetInt(FrameworkOptionsSaveKeys.Language, language);
6067
return language;
6168
}
6269

6370
private int GetAntialiasing()
6471
{
65-
int antialiasing = Math.Clamp(_valueStore.GetInt(OptionsSaveKeys.Antialiasing, DefaultAntialiasing), 0, 3);
66-
_valueStore.SetInt(OptionsSaveKeys.Antialiasing, antialiasing);
72+
int antialiasing = Math.Clamp(_valueStore.GetInt(FrameworkOptionsSaveKeys.Antialiasing, DefaultAntialiasing), 0, 3);
73+
_valueStore.SetInt(FrameworkOptionsSaveKeys.Antialiasing, antialiasing);
6774
return antialiasing;
6875
}
6976

70-
private static Language CoerceLanguage(int raw)
77+
private static int CoerceLanguage(int raw)
7178
{
72-
int clamped = Math.Clamp(raw, (int)Language.English, (int)Language.Japanese);
73-
return (Language)clamped;
79+
return Math.Clamp(raw, MinLanguage, MaxLanguage);
7480
}
7581
}

Template/Framework/Scenes/Options/Core/DefaultOptionsTabRegistrars.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
namespace __TEMPLATE__.Ui;
44

5-
internal static class DefaultOptionsTabRegistrars
5+
internal static partial class DefaultOptionsTabRegistrars
66
{
77
public static IEnumerable<IOptionsTabRegistrar> Create()
88
{
9-
yield return new OptionsGeneralTab();
10-
yield return new OptionsDisplayTab();
11-
yield return new OptionsGraphicsTab();
12-
yield return new OptionsAudioTab();
9+
List<IOptionsTabRegistrar> registrars = [];
10+
AddDefaultTabRegistrars(registrars);
11+
return registrars;
1312
}
13+
14+
static partial void AddDefaultTabRegistrars(List<IOptionsTabRegistrar> registrars);
1415
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace __TEMPLATE__.Ui;
2+
3+
internal static class FrameworkOptionsSaveKeys
4+
{
5+
public const string Language = "Language";
6+
public const string MusicVolume = "MusicVolume";
7+
public const string SfxVolume = "SFXVolume";
8+
9+
public const string WindowMode = "WindowMode";
10+
public const string WindowSize = "WindowSize";
11+
public const string WindowWidth = "WindowWidth";
12+
public const string WindowHeight = "WindowHeight";
13+
public const string VSyncMode = "VSyncMode";
14+
public const string MaxFps = "MaxFPS";
15+
16+
public const string QualityPreset = "QualityPreset";
17+
public const string Antialiasing = "Antialiasing";
18+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uid://cv2hx7p1n7mpg
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace __TEMPLATE__.Ui;
2+
3+
internal static class FrameworkOptionsTabs
4+
{
5+
public const string General = "General";
6+
public const string Gameplay = "Gameplay";
7+
public const string Display = "Display";
8+
public const string Graphics = "Graphics";
9+
public const string Audio = "Audio";
10+
public const string Input = "Input";
11+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uid://0d0kk2c3afmo

0 commit comments

Comments
 (0)