diff --git a/Autoloads/ConfigFileHandler.cs b/Autoloads/ConfigFileHandler.cs index 67acdae..c198f51 100644 --- a/Autoloads/ConfigFileHandler.cs +++ b/Autoloads/ConfigFileHandler.cs @@ -4,13 +4,16 @@ namespace Mr.BrickAdventures.Autoloads; public partial class ConfigFileHandler : Node { + public static ConfigFileHandler Instance { get; private set; } + private ConfigFile _settingsConfig = new(); public const string SettingsPath = "user://settings.ini"; - + public ConfigFile SettingsConfig => _settingsConfig; public override void _Ready() { + Instance = this; if (!FileAccess.FileExists(SettingsPath)) { var err = _settingsConfig.Save(SettingsPath); @@ -24,4 +27,9 @@ public partial class ConfigFileHandler : Node GD.PushError($"Failed to load settings file at {SettingsPath}: {err}"); } } + + public override void _ExitTree() + { + if (Instance == this) Instance = null; + } } \ No newline at end of file diff --git a/Autoloads/SaveSystem.cs b/Autoloads/SaveSystem.cs index e825515..bc890e4 100644 --- a/Autoloads/SaveSystem.cs +++ b/Autoloads/SaveSystem.cs @@ -141,7 +141,7 @@ public partial class SaveSystem : Node var skills = new List(); if (skillNames == null) return skills; - var skillManager = GetNodeOrNull(Constants.SkillManagerPath); + var skillManager = SkillManager.Instance; if (skillManager == null) { GD.PrintErr("SaveSystem: SkillManager not available to resolve skill names."); diff --git a/Autoloads/UIManager.cs b/Autoloads/UIManager.cs index 93b5844..849e08d 100644 --- a/Autoloads/UIManager.cs +++ b/Autoloads/UIManager.cs @@ -4,7 +4,19 @@ namespace Mr.BrickAdventures.Autoloads; public partial class UIManager : Node { + public static UIManager Instance { get; private set; } + private readonly System.Collections.Generic.List UiStack = new(); + + public override void _Ready() + { + Instance = this; + } + + public override void _ExitTree() + { + if (Instance == this) Instance = null; + } [Signal] public delegate void ScreenPushedEventHandler(Control screen); [Signal] public delegate void ScreenPoppedEventHandler(Control screen); diff --git a/Mr. Brick Adventures.csproj b/Mr. Brick Adventures.csproj index 17539c8..c197fc7 100644 --- a/Mr. Brick Adventures.csproj +++ b/Mr. Brick Adventures.csproj @@ -1,4 +1,4 @@ - + net8.0 true diff --git a/scenes/level_village_6.tscn b/scenes/level_village_6.tscn index 27069fa..7e29c5d 100644 --- a/scenes/level_village_6.tscn +++ b/scenes/level_village_6.tscn @@ -32,7 +32,7 @@ point_count = 2 [sub_resource type="CurveTexture" id="CurveTexture_7b7mt"] curve = SubResource("Curve_82d6e") -[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_85ofa"] +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_sktot"] resource_local_to_scene = true lifetime_randomness = 1.0 particle_flag_disable_z = true @@ -114,7 +114,7 @@ script = ExtResource("13_sktot") metadata/_custom_type_script = "uid://6foetukqmyoe" [node name="HitParticles" parent="Brick Player" index="23"] -process_material = SubResource("ParticleProcessMaterial_85ofa") +process_material = SubResource("ParticleProcessMaterial_sktot") [connection signal="Death" from="Brick Player/HealthComponent" to="UI Layer/DeathScreen" method="OnPlayerDeath"] [connection signal="Death" from="Brick Player/HealthComponent" to="UI Layer/GameOverScreen" method="OnPlayerDeath"] diff --git a/scripts/Events/SpeedRunEventHandler.cs b/scripts/Events/SpeedRunEventHandler.cs index babe841..9064a54 100644 --- a/scripts/Events/SpeedRunEventHandler.cs +++ b/scripts/Events/SpeedRunEventHandler.cs @@ -1,5 +1,4 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.Events; @@ -7,17 +6,18 @@ namespace Mr.BrickAdventures.scripts.Events; [GlobalClass] public partial class SpeedRunEventHandler : Node { - private SpeedRunManager _speedRunManager; - public override void _Ready() { - _speedRunManager = GetNode(Constants.SpeedRunManagerPath); - EventBus.Instance.LevelCompleted += OnLevelCompleted; } + public override void _ExitTree() + { + EventBus.Instance.LevelCompleted -= OnLevelCompleted; + } + private void OnLevelCompleted(int levelIndex, Node currentScene, double completionTime) { - _speedRunManager.Split(); + SpeedRunManager.Instance?.Split(); } } \ No newline at end of file diff --git a/scripts/UI/AudioSettings.cs b/scripts/UI/AudioSettings.cs index 96eeebb..7826d59 100644 --- a/scripts/UI/AudioSettings.cs +++ b/scripts/UI/AudioSettings.cs @@ -1,5 +1,4 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.UI; @@ -12,13 +11,11 @@ public partial class AudioSettings : Control [Export] public Control AudioSettingsControl { get; set; } [Export] public float MuteThreshold { get; set; } = -20f; - private UIManager _uiManager; - private ConfigFileHandler _configFileHandler; + private UIManager UIManager => UIManager.Instance; + private ConfigFileHandler ConfigFileHandler => ConfigFileHandler.Instance; public override void _Ready() { - _uiManager = GetNode(Constants.UIManagerPath); - _configFileHandler = GetNode(Constants.ConfigFileHandlerPath); Initialize(); MasterVolumeSlider.ValueChanged += OnMasterVolumeChanged; MusicVolumeSlider.ValueChanged += OnMusicVolumeChanged; @@ -35,10 +32,10 @@ public partial class AudioSettings : Control public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionReleased("ui_cancel")) return; - if (!_uiManager.IsScreenOnTop(AudioSettingsControl)) return; + if (!UIManager.IsScreenOnTop(AudioSettingsControl)) return; SaveSettings(); - _uiManager.PopScreen(); + UIManager.PopScreen(); } private void OnSfxVolumeChanged(double value) @@ -84,7 +81,7 @@ public partial class AudioSettings : Control private void SaveSettings() { - var settingsConfig = _configFileHandler.SettingsConfig; + var settingsConfig = ConfigFileHandler.SettingsConfig; settingsConfig.SetValue("audio_settings", "master_volume", MasterVolumeSlider.Value); settingsConfig.SetValue("audio_settings", "music_volume", MusicVolumeSlider.Value); settingsConfig.SetValue("audio_settings", "sfx_volume", SfxVolumeSlider.Value); @@ -94,7 +91,7 @@ public partial class AudioSettings : Control private void LoadSettings() { - var settingsConfig = _configFileHandler.SettingsConfig; + var settingsConfig = ConfigFileHandler.SettingsConfig; if (!settingsConfig.HasSection("audio_settings")) return; var masterVolume = (float)settingsConfig.GetValue("audio_settings", "master_volume", MasterVolumeSlider.Value); diff --git a/scripts/UI/Credits.cs b/scripts/UI/Credits.cs index d26b114..f995535 100644 --- a/scripts/UI/Credits.cs +++ b/scripts/UI/Credits.cs @@ -1,24 +1,18 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.UI; public partial class Credits : Control { - private UIManager _uiManager; - - public override void _Ready() - { - _uiManager = GetNode(Constants.UIManagerPath); - } + private UIManager UIManager => UIManager.Instance; public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionPressed("ui_cancel")) return; - if (_uiManager != null && _uiManager.IsScreenOnTop(this)) + if (UIManager != null && UIManager.IsScreenOnTop(this)) { - _uiManager.PopScreen(); + UIManager.PopScreen(); } } } \ No newline at end of file diff --git a/scripts/UI/MainMenu.cs b/scripts/UI/MainMenu.cs index 4b9c161..4bf47e3 100644 --- a/scripts/UI/MainMenu.cs +++ b/scripts/UI/MainMenu.cs @@ -1,5 +1,4 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.UI; @@ -16,15 +15,12 @@ public partial class MainMenu : Control [Export] public Control SettingsControl { get; set; } [Export] public Control CreditsControl { get; set; } - private SaveSystem _saveSystem; - private GameManager _gameManager; - private UIManager _uiManager; + private SaveSystem SaveSystem => SaveSystem.Instance; + private GameManager GameManager => GameManager.Instance; + private UIManager UIManager => UIManager.Instance; public override void _Ready() { - _saveSystem = SaveSystem.Instance; - _gameManager = GameManager.Instance; - _uiManager = GetNode(Constants.UIManagerPath); NewGameButton.Pressed += OnNewGamePressed; ContinueButton.Pressed += OnContinuePressed; @@ -33,9 +29,9 @@ public partial class MainMenu : Control ExitButton.Pressed += OnExitPressed; VersionLabel.Text = $"v. {ProjectSettings.GetSetting("application/config/version")}"; - ContinueButton.Disabled = !_saveSystem.CheckSaveExists(); + ContinueButton.Disabled = !SaveSystem.CheckSaveExists(); - if (_saveSystem.CheckSaveExists()) + if (SaveSystem.CheckSaveExists()) ContinueButton.GrabFocus(); else NewGameButton.GrabFocus(); @@ -43,26 +39,26 @@ public partial class MainMenu : Control private void OnExitPressed() { - _gameManager.QuitGame(); + GameManager.QuitGame(); } private void OnCreditsPressed() { - _uiManager.PushScreen(CreditsControl); + UIManager.PushScreen(CreditsControl); } private void OnSettingsPressed() { - _uiManager.PushScreen(SettingsControl); + UIManager.PushScreen(SettingsControl); } private void OnContinuePressed() { - _gameManager.ContinueGame(); + GameManager.ContinueGame(); } private void OnNewGamePressed() { - _gameManager.StartNewGame(); + GameManager.StartNewGame(); } } \ No newline at end of file diff --git a/scripts/UI/PauseMenu.cs b/scripts/UI/PauseMenu.cs index 746c7ea..01349d0 100644 --- a/scripts/UI/PauseMenu.cs +++ b/scripts/UI/PauseMenu.cs @@ -1,5 +1,4 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.UI; @@ -14,13 +13,11 @@ public partial class PauseMenu : Control [Export] public Button SettingsButton { get; set; } [Export] public PackedScene MainMenuScene { get; set; } - private GameManager _gameManager; - private UIManager _uiManager; + private GameManager GameManager => GameManager.Instance; + private UIManager UIManager => UIManager.Instance; public override void _Ready() { - _gameManager = GameManager.Instance; - _uiManager = GetNode(Constants.UIManagerPath); ResumeButton.Pressed += OnResumePressed; MainMenuButton.Pressed += OnMainMenuPressed; @@ -33,36 +30,36 @@ public partial class PauseMenu : Control public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionPressed("pause")) return; - if (_uiManager.IsVisibleOnStack(PauseMenuControl)) + if (UIManager.IsVisibleOnStack(PauseMenuControl)) OnResumePressed(); else { - _uiManager.PushScreen(PauseMenuControl); - _gameManager.PauseGame(); + UIManager.PushScreen(PauseMenuControl); + GameManager.PauseGame(); } } private void OnSettingsPressed() { - _uiManager.PushScreen(SettingsControl); - _gameManager.PauseGame(); + UIManager.PushScreen(SettingsControl); + GameManager.PauseGame(); } private void OnQuitPressed() { - _gameManager.QuitGame(); + GameManager.QuitGame(); } private void OnMainMenuPressed() { - _gameManager.ResumeGame(); - _gameManager.ResetCurrentSessionState(); + GameManager.ResumeGame(); + GameManager.ResetCurrentSessionState(); GetTree().ChangeSceneToPacked(MainMenuScene); } private void OnResumePressed() { - _uiManager.PopScreen(); - _gameManager.ResumeGame(); + UIManager.PopScreen(); + GameManager.ResumeGame(); } } \ No newline at end of file diff --git a/scripts/UI/SettingsMenu.cs b/scripts/UI/SettingsMenu.cs index 365c1a0..37bf3c4 100644 --- a/scripts/UI/SettingsMenu.cs +++ b/scripts/UI/SettingsMenu.cs @@ -1,5 +1,4 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.UI; @@ -16,11 +15,10 @@ public partial class SettingsMenu : Control [Export] public Button DisplaySettingsButton { get; set; } [Export] public Button GameplaySettingsButton { get; set; } - private UIManager _uiManager; + private UIManager UIManager => UIManager.Instance; public override void _Ready() { - _uiManager = GetNode(Constants.UIManagerPath); InputSettingsButton.Pressed += OnInputSettingsPressed; AudioSettingsButton.Pressed += OnAudioSettingsPressed; @@ -36,26 +34,26 @@ public partial class SettingsMenu : Control public override void _UnhandledInput(InputEvent @event) { if (!@event.IsActionPressed("ui_cancel")) return; - if (_uiManager.IsScreenOnTop(SettingsMenuControl)) _uiManager.PopScreen(); + if (UIManager.IsScreenOnTop(SettingsMenuControl)) UIManager.PopScreen(); } private void OnInputSettingsPressed() { - _uiManager.PushScreen(InputSettingsControl); + UIManager.PushScreen(InputSettingsControl); } private void OnAudioSettingsPressed() { - _uiManager.PushScreen(AudioSettingsControl); + UIManager.PushScreen(AudioSettingsControl); } private void OnDisplaySettingsPressed() { - _uiManager.PushScreen(DisplaySettingsControl); + UIManager.PushScreen(DisplaySettingsControl); } private void OnGameplaySettingsPressed() { - _uiManager.PushScreen(GameplaySettingsControl); + UIManager.PushScreen(GameplaySettingsControl); } } \ No newline at end of file diff --git a/scripts/components/ExitDoorComponent.cs b/scripts/components/ExitDoorComponent.cs index e32d143..bd23f6e 100644 --- a/scripts/components/ExitDoorComponent.cs +++ b/scripts/components/ExitDoorComponent.cs @@ -1,5 +1,4 @@ using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; using Mr.BrickAdventures.scripts.interfaces; using Mr.BrickAdventures.scripts.State; @@ -17,14 +16,8 @@ public partial class ExitDoorComponent : Area2D, IUnlockable [Signal] public delegate void ExitTriggeredEventHandler(); - private GameManager _gameManager; - private AchievementManager _achievementManager; - public override void _Ready() { - _gameManager = GameManager.Instance; - _achievementManager = GetNode(Constants.AchievementManagerPath); - BodyEntered += OnExitAreaBodyEntered; } @@ -34,10 +27,9 @@ public partial class ExitDoorComponent : Area2D, IUnlockable if (Locked) return; EmitSignalExitTriggered(); - _achievementManager.UnlockAchievement(AchievementId); - // Get current level from GameStateStore + AchievementManager.Instance?.UnlockAchievement(AchievementId); var currentLevel = GameStateStore.Instance?.Session.CurrentLevel ?? 0; - _gameManager.UnlockLevel(currentLevel + 1); + GameManager.Instance?.UnlockLevel(currentLevel + 1); CallDeferred(nameof(GoToNextLevel)); } @@ -54,6 +46,6 @@ public partial class ExitDoorComponent : Area2D, IUnlockable private void GoToNextLevel() { - _gameManager.OnLevelComplete(); + GameManager.Instance?.OnLevelComplete(); } } \ No newline at end of file diff --git a/scripts/components/LeverComponent.cs b/scripts/components/LeverComponent.cs index 8caf258..1ddff32 100644 --- a/scripts/components/LeverComponent.cs +++ b/scripts/components/LeverComponent.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; using Godot; -using Mr.BrickAdventures; using Mr.BrickAdventures.Autoloads; namespace Mr.BrickAdventures.scripts.components; @@ -17,12 +16,8 @@ public partial class LeverComponent : Node [Signal] public delegate void ActivatedEventHandler(); - private FloatingTextManager _floatingTextManager; - public override void _Ready() { - _floatingTextManager = GetNode(Constants.FloatingTextManagerPath); - if (Area == null) { GD.PushError("LeverComponent: Area is not set."); @@ -52,7 +47,7 @@ public partial class LeverComponent : Node private async Task Activate() { EmitSignalActivated(); - _floatingTextManager?.ShowMessage("Activated!", ((Node2D)Owner).GlobalPosition); + FloatingTextManager.Instance?.ShowMessage("Activated!", ((Node2D)Owner).GlobalPosition); Sfx?.Play(); Sprite.Frame = StartAnimationIndex + 1; var timer = GetTree().CreateTimer(AnimationDuration); diff --git a/sprites/ppc-tileset.png b/sprites/ppc-tileset.png index 95bbba3..cfaff8b 100644 Binary files a/sprites/ppc-tileset.png and b/sprites/ppc-tileset.png differ