From 72f8b5c050e1a85bb84fd926c214eebd107ce402 Mon Sep 17 00:00:00 2001 From: Zenny Date: Sat, 6 Jun 2026 17:19:48 -0700 Subject: [PATCH] Small tweak to floor number display, increased chinthe speed, fix Return To Overworld option on floor clear menu --- .../Game/state/GameState.Input.cs | 2 + .../Game/state/GameState.Output.cs | 2 + .../GameState.State.FloorExitScreen.cs | 8 +- .../enemy_types/07. chinthe/Chinthe.tscn | 2 +- Zennysoft.Game.Ma/src/game/Game.cs | 13 +-- Zennysoft.Game.Ma/src/map/FloorNode.cs | 2 + Zennysoft.Game.Ma/src/map/IMap.cs | 2 + Zennysoft.Game.Ma/src/map/Map.cs | 91 ++++++++++--------- Zennysoft.Game.Ma/src/map/Map.tscn | 18 ++++ Zennysoft.Game.Ma/src/minimap/Minimap.cs | 14 +-- .../src/ui/load_next_level/LoadNextLevel.cs | 52 ++++++++--- 11 files changed, 134 insertions(+), 72 deletions(-) diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs index 888169cc..6deba1af 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs +++ b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs @@ -12,6 +12,8 @@ public partial class GameState public readonly record struct LoadNextFloor; + public readonly record struct ReturnToOverworld; + public readonly record struct InventoryButtonPressed; public readonly record struct InteractButtonPressed; diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs index 774a2244..3735a2cf 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs +++ b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs @@ -20,6 +20,8 @@ public partial class GameState public readonly record struct LoadNextFloor; + public readonly record struct ReturnToOverworld; + public readonly record struct OpenTeleportScreen; public readonly record struct OpenFloorExitScreen; diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.FloorExitScreen.cs b/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.FloorExitScreen.cs index 6ff8c52c..29f9a38d 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.FloorExitScreen.cs +++ b/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.FloorExitScreen.cs @@ -8,7 +8,7 @@ public partial class GameState public partial record State { [Meta, LogicBlock(typeof(State), Diagram = true)] - public partial record FloorExitScreen : State, IGet + public partial record FloorExitScreen : State, IGet, IGet { public FloorExitScreen() { @@ -20,6 +20,12 @@ public partial class GameState Output(new Output.LoadNextFloor()); return To(); } + + public Transition On(in Input.ReturnToOverworld input) + { + Output(new Output.ReturnToOverworld()); + return To(); + } } } } diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn index ad3be97e..d22a8406 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn @@ -88,7 +88,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.46013, 0) [node name="FollowBehavior" parent="Components" instance=ExtResource("6_t7elt")] unique_name_in_owner = true -_followSpeed = 500.0 +FollowSpeed = 800.0 [node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("7_24q6i")] unique_name_in_owner = true diff --git a/Zennysoft.Game.Ma/src/game/Game.cs b/Zennysoft.Game.Ma/src/game/Game.cs index 78302dbb..90fe00e6 100644 --- a/Zennysoft.Game.Ma/src/game/Game.cs +++ b/Zennysoft.Game.Ma/src/game/Game.cs @@ -415,7 +415,6 @@ public partial class Game : Node3D, IGame }) .Handle((in GameState.Output.LoadNextFloor _) => { - LoadNextLevel.FadeOut(); EmitSignal(SignalName.OnLoadLevelRequest); Task.Run(() => Save()); if (_player.EquipmentComponent.EquippedWeapon.Value.ItemTag == ItemTag.BreaksOnFloorExit) @@ -438,6 +437,12 @@ public partial class Game : Node3D, IGame } LoadNextLevel.FadeOut(); }) + .Handle((in GameState.Output.ReturnToOverworld _) => + { + LoadNextLevel.FadeOut(); + Task.Run(() => Save()); + InitializeGame(); + }) .Handle((in GameState.Output.ExitGame _) => { OnQuit(); @@ -453,11 +458,7 @@ public partial class Game : Node3D, IGame public void SetAffinity(ElementType elementType) => InGameUI.SetAffinity(elementType); - private void FloorClearMenu_Exit() - { - _player.Deactivate(); - InGameUI.Hide(); - } + private void FloorClearMenu_Exit() => GameState.Input(new GameState.Input.ReturnToOverworld()); private void ExitInventoryAction() => GameState.Input(new GameState.Input.CloseInventory()); diff --git a/Zennysoft.Game.Ma/src/map/FloorNode.cs b/Zennysoft.Game.Ma/src/map/FloorNode.cs index b0663980..1f28695e 100644 --- a/Zennysoft.Game.Ma/src/map/FloorNode.cs +++ b/Zennysoft.Game.Ma/src/map/FloorNode.cs @@ -3,4 +3,6 @@ using Godot; namespace Zennysoft.Game.Ma; public abstract partial class FloorNode : Node { + [Export] + public string DisplayedFloorNumber { get; set; } = string.Empty; } diff --git a/Zennysoft.Game.Ma/src/map/IMap.cs b/Zennysoft.Game.Ma/src/map/IMap.cs index 641a9e45..41c19815 100644 --- a/Zennysoft.Game.Ma/src/map/IMap.cs +++ b/Zennysoft.Game.Ma/src/map/IMap.cs @@ -28,6 +28,8 @@ public interface IMap : INode3D public AutoProp CurrentFloorNumber { get; } + AutoProp CurrentFloorDisplayString { get; } + public event Action<(Vector3 Rotation, Vector3 Position)> SpawnPointCreated; public event Action FloorLoaded; diff --git a/Zennysoft.Game.Ma/src/map/Map.cs b/Zennysoft.Game.Ma/src/map/Map.cs index e023791a..90ae2eeb 100644 --- a/Zennysoft.Game.Ma/src/map/Map.cs +++ b/Zennysoft.Game.Ma/src/map/Map.cs @@ -27,6 +27,8 @@ public partial class Map : Node3D, IMap public AutoProp CurrentFloorNumber { get; private set; } = new AutoProp(0); + public AutoProp CurrentFloorDisplayString { get; private set; } = new AutoProp(string.Empty); + private readonly string _floorFilePath = @"res://src/map/dungeon/floors/"; public event Action<(Vector3 Rotation, Vector3 Position)> SpawnPointCreated; @@ -37,29 +39,30 @@ public partial class Map : Node3D, IMap public void OnResolved() { - AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished; - this.Provide(); + AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished; + this.Provide(); } private async void AnimationPlayer_AnimationFinished(StringName animName) { - if (animName == "fade_out") - { - await LoadNewFloor(); - FloorLoaded?.Invoke(); - } + if (animName == "fade_out") + { + await LoadNewFloor(); + FloorLoaded?.Invoke(); + } } private async Task LoadNewFloor() { - SpawnPointCreated?.Invoke((Vector3.Forward, new Vector3(-999, -999, -999))); - var newFloor = await LoadNewFloor(_sceneName); - ClearFloor(); - AddChild(newFloor); - InitializeFloor(newFloor); - var floor = MapOrder.GetChildren().OfType().ElementAt(CurrentFloorNumber.Value); - if (CurrentFloor is DungeonFloor dungeonFloor && floor is DungeonFloorNode dungeonFloorNode) - dungeonFloor.SpawnEnemies(dungeonFloorNode); + SpawnPointCreated?.Invoke((Vector3.Forward, new Vector3(-999, -999, -999))); + var newFloor = await LoadNewFloor(_sceneName); + ClearFloor(); + AddChild(newFloor); + InitializeFloor(newFloor); + var floor = MapOrder.GetChildren().OfType().ElementAt(CurrentFloorNumber.Value); + if (CurrentFloor is DungeonFloor dungeonFloor && floor is DungeonFloorNode dungeonFloorNode) + dungeonFloor.SpawnEnemies(dungeonFloorNode); + CurrentFloorDisplayString.OnNext(floor.DisplayedFloorNumber); } public void FadeIn() => AnimationPlayer.Play("fade_in"); @@ -67,49 +70,49 @@ public partial class Map : Node3D, IMap public void InitializeMapData() { - CurrentFloorNumber.OnNext(-1); + CurrentFloorNumber.OnNext(-1); } public IDungeonRoom GetPlayersCurrentRoom() { - var rooms = CurrentFloor.Rooms; - var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom); - return playersRoom; + var rooms = CurrentFloor.Rooms; + var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom); + return playersRoom; } public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPosition() { - var spawnPoint = CurrentFloor.GetPlayerSpawnPoint(); - return (spawnPoint.Rotation, spawnPoint.Position); + var spawnPoint = CurrentFloor.GetPlayerSpawnPoint(); + return (spawnPoint.Rotation, spawnPoint.Position); } public void ClearFloor() { - CurrentFloor?.CallDeferred(MethodName.QueueFree, []); + CurrentFloor?.CallDeferred(MethodName.QueueFree, []); } public async Task LoadFloor() { - var floor = MapOrder.GetChildren().OfType().ElementAt(CurrentFloorNumber.Value + 1); - var sceneToLoad = LayoutToScenePathConverter.Convert(floor); - await LoadFloor(sceneToLoad); + var floor = MapOrder.GetChildren().OfType().ElementAt(CurrentFloorNumber.Value + 1); + var sceneToLoad = LayoutToScenePathConverter.Convert(floor); + await LoadFloor(sceneToLoad); } public async Task LoadFloor(string sceneName) { - CallDeferred(MethodName.FadeOut); - _sceneName = sceneName; - var dimmableAudio = GetTree().GetNodesInGroup("DimmableAudio").OfType(); - foreach (var node in dimmableAudio) - node.FadeOut(); + CallDeferred(MethodName.FadeOut); + _sceneName = sceneName; + var dimmableAudio = GetTree().GetNodesInGroup("DimmableAudio").OfType(); + foreach (var node in dimmableAudio) + node.FadeOut(); } private void InitializeFloor(Node newFloor) { - CurrentFloor = (IDungeonFloor)newFloor; - SetupDungeonFloor(); - CurrentFloor.FloorIsLoaded = true; - CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1); + CurrentFloor = (IDungeonFloor)newFloor; + SetupDungeonFloor(); + CurrentFloor.FloorIsLoaded = true; + CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1); if (CurrentFloor is SpecialFloor) Game.ShowMinimap(false); else @@ -118,19 +121,19 @@ public partial class Map : Node3D, IMap private async Task LoadNewFloor(string sceneName) { - var sceneLoader = new SceneLoader(); - AddChild(sceneLoader); - sceneLoader.LoadSceneRequest(sceneName); - await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded); - var result = sceneLoader.LoadedScene; - sceneLoader.QueueFree(); - return result; + var sceneLoader = new SceneLoader(); + AddChild(sceneLoader); + sceneLoader.LoadSceneRequest(sceneName); + await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded); + var result = sceneLoader.LoadedScene; + sceneLoader.QueueFree(); + return result; } private void SetupDungeonFloor() { - CurrentFloor.InitializeDungeon(); - var transform = GetPlayerSpawnPosition(); - SpawnPointCreated?.Invoke(transform); + CurrentFloor.InitializeDungeon(); + var transform = GetPlayerSpawnPosition(); + SpawnPointCreated?.Invoke(transform); } } diff --git a/Zennysoft.Game.Ma/src/map/Map.tscn b/Zennysoft.Game.Ma/src/map/Map.tscn index cd7a2dcc..644ce5db 100644 --- a/Zennysoft.Game.Ma/src/map/Map.tscn +++ b/Zennysoft.Game.Ma/src/map/Map.tscn @@ -81,6 +81,7 @@ FolderName = "Floor01" FloorOdds = Array[float]([0.33, 0.33, 0.33]) Sproingy = 0.5 Michael = 0.5 +DisplayedFloorNumber = "01" [node name="Floor02" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -91,6 +92,7 @@ Michael = 0.5 FilthEater = 0.1 GoldSproingy = 0.05 TrueRedAmbassador = 0.3 +DisplayedFloorNumber = "02" [node name="Floor03" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -102,6 +104,7 @@ FilthEater = 0.3 Sara = 0.1 GoldSproingy = 0.05 TrueRedAmbassador = 0.3 +DisplayedFloorNumber = "03" [node name="Floor04" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -111,6 +114,7 @@ FilthEater = 0.5 Sara = 0.3 AgniDemon = 0.3 GoldSproingy = 0.05 +DisplayedFloorNumber = "04" [node name="Floor05" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -122,6 +126,7 @@ Ballos = 0.4 RedAmbassador = 0.3 AgniDemon = 0.5 GoldSproingy = 0.05 +DisplayedFloorNumber = "05" [node name="Floor06" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -132,6 +137,7 @@ Ballos = 0.5 RedAmbassador = 0.3 AgniDemon = 0.5 GoldSproingy = 0.05 +DisplayedFloorNumber = "06" [node name="Floor07" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -142,10 +148,12 @@ Ballos = 0.5 RedAmbassador = 0.3 AgniDemon = 0.4 GoldSproingy = 0.05 +DisplayedFloorNumber = "07" [node name="Boss Floor 1" type="Node" parent="MapOrder"] script = ExtResource("3_v14r0") FloorName = 2 +DisplayedFloorNumber = "???" [node name="Floor09" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -153,6 +161,7 @@ FolderName = "Floor09" FloorOdds = Array[float]([0.5, 0.5]) Chinthe = 0.5 GreenAmbassador = 0.1 +DisplayedFloorNumber = "09" [node name="Floor10" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -161,6 +170,7 @@ FloorOdds = Array[float]([0.5, 0.5]) Chinthe = 0.5 GreenAmbassador = 0.5 ShieldOfHeaven = 0.1 +DisplayedFloorNumber = "10" [node name="Floor11" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -169,6 +179,7 @@ FloorOdds = Array[float]([0.5, 0.5]) Chinthe = 0.5 GreenAmbassador = 0.5 ShieldOfHeaven = 0.5 +DisplayedFloorNumber = "11" [node name="Floor12" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -177,6 +188,7 @@ FloorOdds = Array[float]([0.5, 0.5]) GreenAmbassador = 0.5 SteelAmbassador = 0.05 ShieldOfHeaven = 0.5 +DisplayedFloorNumber = "12" [node name="Floor13" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -187,6 +199,7 @@ GreenAmbassador = 0.25 SteelAmbassador = 0.05 Palan = 0.3 ShieldOfHeaven = 0.5 +DisplayedFloorNumber = "13" [node name="Floor14" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") @@ -196,24 +209,29 @@ SteelAmbassador = 0.05 Palan = 0.5 ShieldOfHeaven = 0.5 GoldSproingy = 0.05 +DisplayedFloorNumber = "14" [node name="Floor15" type="Node" parent="MapOrder"] script = ExtResource("2_00xd7") FolderName = "Floor15" FloorOdds = Array[float]([1.0]) Sproingy = 1.0 +DisplayedFloorNumber = "15" [node name="Boss Floor 2" type="Node" parent="MapOrder"] script = ExtResource("3_v14r0") FloorName = 3 +DisplayedFloorNumber = "???" [node name="Goddess of Guidance Floor" type="Node" parent="MapOrder"] script = ExtResource("3_v14r0") FloorName = 4 +DisplayedFloorNumber = "???" [node name="Final Floor" type="Node" parent="MapOrder"] script = ExtResource("3_v14r0") FloorName = 6 +DisplayedFloorNumber = "???" [node name="ColorRect" type="ColorRect" parent="."] anchors_preset = 15 diff --git a/Zennysoft.Game.Ma/src/minimap/Minimap.cs b/Zennysoft.Game.Ma/src/minimap/Minimap.cs index 05f1437f..62456767 100644 --- a/Zennysoft.Game.Ma/src/minimap/Minimap.cs +++ b/Zennysoft.Game.Ma/src/minimap/Minimap.cs @@ -21,23 +21,23 @@ public partial class Minimap : Control public void OnResolved() { - _map.CurrentFloorNumber.Sync += CurrentFloorNumber_Sync; - _ready = true; + _map.CurrentFloorDisplayString.Sync += CurrentFloorNumber_Sync; + _ready = true; } public override void _PhysicsProcess(double delta) { - if (_ready) - MinimapCamera.Position = new Vector3(_player.GlobalPosition.X, MinimapCamera.Position.Y, _player.GlobalPosition.Z); + if (_ready) + MinimapCamera.Position = new Vector3(_player.GlobalPosition.X, MinimapCamera.Position.Y, _player.GlobalPosition.Z); } - private void CurrentFloorNumber_Sync(int obj) + private void CurrentFloorNumber_Sync(string obj) { - LayerNumberText.Text = $"{obj:D2}"; + LayerNumberText.Text = obj; } public void OnExitTree() { - _map.CurrentFloorNumber.Sync -= CurrentFloorNumber_Sync; + _map.CurrentFloorDisplayString.Sync -= CurrentFloorNumber_Sync; } } diff --git a/Zennysoft.Game.Ma/src/ui/load_next_level/LoadNextLevel.cs b/Zennysoft.Game.Ma/src/ui/load_next_level/LoadNextLevel.cs index d8974acd..10c5400e 100644 --- a/Zennysoft.Game.Ma/src/ui/load_next_level/LoadNextLevel.cs +++ b/Zennysoft.Game.Ma/src/ui/load_next_level/LoadNextLevel.cs @@ -43,19 +43,7 @@ public partial class LoadNextLevel : Control, IFloorClearMenu public void OnResolved() { - _player.ExperiencePointsComponent.Level.Sync += Level_Sync; - _player.ExperiencePointsComponent.CurrentExp.Sync += Exp_Sync; - _player.ExperiencePointsComponent.ExpToNextLevel.Sync += Exp_Sync; - _player.HealthComponent.CurrentHP.Sync += HP_Sync; - _player.HealthComponent.MaximumHP.Sync += HP_Sync; - _player.VTComponent.CurrentVT.Sync += VT_Sync; - _player.VTComponent.MaximumVT.Sync += VT_Sync; - _player.AttackComponent.CurrentAttack.Sync += Attack_Sync; - _player.AttackComponent.MaximumAttack.Sync += Attack_Sync; - _player.DefenseComponent.CurrentDefense.Sync += Defense_Sync; - _player.DefenseComponent.MaximumDefense.Sync += Defense_Sync; - _player.EquipmentComponent.EquipmentChanged += EquipmentComponent_EquipmentChanged; - _map.CurrentFloorNumber.Sync += CurrentFloorNumber_Sync; + EnableUISync(); AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished; AnimationPlayer.AnimationStarted += AnimationPlayer_AnimationStarted; @@ -104,6 +92,7 @@ public partial class LoadNextLevel : Control, IFloorClearMenu } if (animName == "fade_out") { + DisableUISync(); _fadingIn = false; ContinueButton.CallDeferred(MethodName.ReleaseFocus); } @@ -119,6 +108,43 @@ public partial class LoadNextLevel : Control, IFloorClearMenu ExitButton.FocusMode = FocusModeEnum.All; } if (animName == "fade_out") + { + EnableUISync(); TransitionCompleted?.Invoke(); + } + } + + private void EnableUISync() + { + _player.ExperiencePointsComponent.Level.Sync += Level_Sync; + _player.ExperiencePointsComponent.CurrentExp.Sync += Exp_Sync; + _player.ExperiencePointsComponent.ExpToNextLevel.Sync += Exp_Sync; + _player.HealthComponent.CurrentHP.Sync += HP_Sync; + _player.HealthComponent.MaximumHP.Sync += HP_Sync; + _player.VTComponent.CurrentVT.Sync += VT_Sync; + _player.VTComponent.MaximumVT.Sync += VT_Sync; + _player.AttackComponent.CurrentAttack.Sync += Attack_Sync; + _player.AttackComponent.MaximumAttack.Sync += Attack_Sync; + _player.DefenseComponent.CurrentDefense.Sync += Defense_Sync; + _player.DefenseComponent.MaximumDefense.Sync += Defense_Sync; + _player.EquipmentComponent.EquipmentChanged += EquipmentComponent_EquipmentChanged; + _map.CurrentFloorNumber.Sync += CurrentFloorNumber_Sync; + } + + private void DisableUISync() + { + _player.ExperiencePointsComponent.Level.Sync -= Level_Sync; + _player.ExperiencePointsComponent.CurrentExp.Sync -= Exp_Sync; + _player.ExperiencePointsComponent.ExpToNextLevel.Sync -= Exp_Sync; + _player.HealthComponent.CurrentHP.Sync -= HP_Sync; + _player.HealthComponent.MaximumHP.Sync -= HP_Sync; + _player.VTComponent.CurrentVT.Sync -= VT_Sync; + _player.VTComponent.MaximumVT.Sync -= VT_Sync; + _player.AttackComponent.CurrentAttack.Sync -= Attack_Sync; + _player.AttackComponent.MaximumAttack.Sync -= Attack_Sync; + _player.DefenseComponent.CurrentDefense.Sync -= Defense_Sync; + _player.DefenseComponent.MaximumDefense.Sync -= Defense_Sync; + _player.EquipmentComponent.EquipmentChanged -= EquipmentComponent_EquipmentChanged; + _map.CurrentFloorNumber.Sync -= CurrentFloorNumber_Sync; } }