diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs index 7b6349f2..1d586ee9 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs +++ b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Input.cs @@ -24,6 +24,12 @@ public partial class GameState public readonly record struct FloorExitEntered; + public readonly record struct AskForTeleport; + + public readonly record struct UseTeleport; + + public readonly record struct CloseTeleport; + public readonly record struct GameOver; } } diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs index 2717c4f5..0a4cd8c7 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs +++ b/Zennysoft.Game.Ma.Implementation/Game/state/GameState.Output.cs @@ -22,6 +22,8 @@ public partial class GameState public readonly record struct LoadNextFloor; + public readonly record struct OpenTeleportScreen; + public readonly record struct OpenFloorExitScreen; public readonly record struct OpenDebugMenu; diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.AskForTeleportScreen.cs b/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.AskForTeleportScreen.cs new file mode 100644 index 00000000..db063f05 --- /dev/null +++ b/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.AskForTeleportScreen.cs @@ -0,0 +1,36 @@ +using Chickensoft.Introspection; +using Chickensoft.LogicBlocks; +using Godot; + +namespace Zennysoft.Ma.Adapter; + +public partial class GameState +{ + public partial record State + { + [Meta, LogicBlock(typeof(State), Diagram = true)] + public partial record AskForTeleportScreen : State, IGet, IGet + { + public AskForTeleportScreen() + { + OnAttach(() => Get().Pause()); + } + + public Transition On(in Input.ReturnToMainMenu input) + { + return To(); + } + + public Transition On(in Input.UseTeleport input) + { + Output(new Output.OpenFloorExitScreen()); + return To(); + } + + public Transition On(in Input.CloseTeleport input) + { + return To(); + } + } + } +} diff --git a/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.InGame..cs b/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.InGame..cs index 18a791a5..cffde3ca 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.InGame..cs +++ b/Zennysoft.Game.Ma.Implementation/Game/state/gamestates/GameState.State.InGame..cs @@ -42,8 +42,8 @@ public partial class GameState public Transition On(in Input.FloorExitEntered input) { - Output(new Output.OpenFloorExitScreen()); - return To(); + Output(new Output.OpenTeleportScreen()); + return To(); } public Transition On(in Input.GameOver input) diff --git a/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs b/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs index e22c0ffd..7fee19a1 100644 --- a/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs +++ b/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs @@ -10,6 +10,8 @@ public interface IPlayer : IKillable public void Activate(); + public void Deactivate(); + public void Attack(); public void TakeDamage(double damage, ElementType elementType = ElementType.None, bool isCriticalHit = false); diff --git a/Zennysoft.Game.Ma/src/enemy/state/EnemyLogic.g.puml b/Zennysoft.Game.Ma/src/enemy/state/EnemyLogic.g.puml index 3baf022f..33157ae0 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/EnemyLogic.g.puml +++ b/Zennysoft.Game.Ma/src/enemy/state/EnemyLogic.g.puml @@ -1,12 +1,12 @@ @startuml EnemyLogic state "EnemyLogic State" as Zennysoft_Game_Ma_EnemyLogic_State { state "Alive" as Zennysoft_Game_Ma_EnemyLogic_State_Alive { - state "Idle" as Zennysoft_Game_Ma_EnemyLogic_State_Idle state "Activated" as Zennysoft_Game_Ma_EnemyLogic_State_Activated { - state "Patrolling" as Zennysoft_Game_Ma_EnemyLogic_State_Patrolling - state "FollowPlayer" as Zennysoft_Game_Ma_EnemyLogic_State_FollowPlayer state "Attacking" as Zennysoft_Game_Ma_EnemyLogic_State_Attacking + state "FollowPlayer" as Zennysoft_Game_Ma_EnemyLogic_State_FollowPlayer + state "Patrolling" as Zennysoft_Game_Ma_EnemyLogic_State_Patrolling } + state "Idle" as Zennysoft_Game_Ma_EnemyLogic_State_Idle } state "Defeated" as Zennysoft_Game_Ma_EnemyLogic_State_Defeated } diff --git a/Zennysoft.Game.Ma/src/game/Game.cs b/Zennysoft.Game.Ma/src/game/Game.cs index 8ba7c1e9..851b56fe 100644 --- a/Zennysoft.Game.Ma/src/game/Game.cs +++ b/Zennysoft.Game.Ma/src/game/Game.cs @@ -211,14 +211,20 @@ public partial class Game : Node3D, IGame InGameUI.PlayerInfoUI.Show(); GameRepo.Resume(); }) - .Handle((in GameState.Output.OpenFloorExitScreen _) => + .Handle((in GameState.Output.OpenTeleportScreen _) => { InGameUI.UseTeleportPrompt.Show(); InGameUI.UseTeleportPrompt.FadeIn(); }) - .Handle((in GameState.Output.LoadNextFloor _) => + .Handle((in GameState.Output.OpenFloorExitScreen _) => { InGameUI.UseTeleportPrompt.FadeOut(); + FloorClearMenu.Show(); + FloorClearMenu.FadeIn(); + }) + .Handle((in GameState.Output.LoadNextFloor _) => + { + FloorClearMenu.FadeOut(); Map.SpawnNextFloor(); if (Player.EquippedWeapon.Value.ItemTag == ItemTag.BreaksOnChange) { @@ -249,6 +255,9 @@ public partial class Game : Node3D, IGame GameState.Start(); this.Provide(); InGameUI.UseTeleportPrompt.TeleportToNextFloor += UseTeleportPrompt_TeleportToNextFloor; + InGameUI.UseTeleportPrompt.CloseTeleportPrompt += UseTeleportPrompt_CloseTeleportPrompt; + FloorClearMenu.GoToNextFloor += FloorClearMenu_GoToNextFloor; + FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit; FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted; GameRepo.RestorativePickedUp += GameEventDepot_RestorativePickedUp; @@ -269,6 +278,16 @@ public partial class Game : Node3D, IGame MainMenu.Show(); } + private void FloorClearMenu_SaveAndExit() + { + //SaveFile.Save(); + Player.Deactivate(); + GameState.Input(new GameState.Input.ReturnToMainMenu()); + InGameUI.Hide(); + MainMenu.FadeIn(); + } + + private void FloorClearMenu_GoToNextFloor() => GameState.Input(new GameState.Input.LoadNextFloor()); public void LoadExistingGame() => SaveFile.Load().ContinueWith((_) => CallDeferred(nameof(FinishedLoadingSaveFile))); public void InitializeGame() @@ -382,16 +401,19 @@ public partial class Game : Node3D, IGame restorative.GlobalPosition = vector; } - private void UseTeleportPrompt_TeleportToNextFloor() + private void UseTeleportPrompt_CloseTeleportPrompt() { - InGameUI.UseTeleportPrompt.FadeIn(); - GameState.Input(new GameState.Input.LoadNextFloor()); - GameEventDepot.OnDungeonAThemeAreaEntered(); + GameState.Input(new GameState.Input.CloseTeleport()); + InGameUI.UseTeleportPrompt.FadeOut(); + GameRepo.Resume(); } + private void UseTeleportPrompt_TeleportToNextFloor() => GameState.Input(new GameState.Input.UseTeleport()); + private void FloorClearMenu_TransitionCompleted() { GameRepo.Resume(); + GameEventDepot.OnDungeonAThemeAreaEntered(); } private void GameEventDepot_RestorativePickedUp(IHealthPack obj) => Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + (int)obj.RestoreAmount); diff --git a/Zennysoft.Game.Ma/src/menu/MainMenu.cs b/Zennysoft.Game.Ma/src/menu/MainMenu.cs index 8bc1434f..509ceabf 100644 --- a/Zennysoft.Game.Ma/src/menu/MainMenu.cs +++ b/Zennysoft.Game.Ma/src/menu/MainMenu.cs @@ -10,6 +10,8 @@ public interface IMainMenu : IControl event MainMenu.NewGameEventHandler NewGame; event MainMenu.LoadGameEventHandler LoadGame; event MainMenu.QuitEventHandler Quit; + + void FadeIn(); } [Meta(typeof(IAutoNode))] @@ -38,6 +40,12 @@ public partial class MainMenu : Control, IMainMenu NewGameButton.GrabFocus(); } + public void FadeIn() + { + NewGameButton.GrabFocus(); + Show(); + } + public void OnExitTree() { NewGameButton.Pressed -= OnNewGamePressed; diff --git a/Zennysoft.Game.Ma/src/menu/MainMenu.tscn b/Zennysoft.Game.Ma/src/menu/MainMenu.tscn index 6dc1835d..a86e6af8 100644 --- a/Zennysoft.Game.Ma/src/menu/MainMenu.tscn +++ b/Zennysoft.Game.Ma/src/menu/MainMenu.tscn @@ -11,6 +11,15 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_y6722") +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.137255, 0.121569, 0.12549, 1) + [node name="MarginContainer" type="MarginContainer" parent="."] layout_mode = 1 anchors_preset = 15 diff --git a/Zennysoft.Game.Ma/src/player/Player.cs b/Zennysoft.Game.Ma/src/player/Player.cs index c2e31f0c..0b397eb9 100644 --- a/Zennysoft.Game.Ma/src/player/Player.cs +++ b/Zennysoft.Game.Ma/src/player/Player.cs @@ -215,6 +215,13 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide