From 3d3ebc11d10098cd7b2fccfc9ce2433da28d92e7 Mon Sep 17 00:00:00 2001 From: Zenny Date: Wed, 5 Mar 2025 01:14:23 -0800 Subject: [PATCH] Map save --- src/app/App.cs | 4 ++++ src/game/Game.cs | 15 +++++++++------ src/game/GameLogic.Output.cs | 2 ++ src/game/GameLogic.g.puml | 2 ++ .../state/states/GameLogic.State.FloorCleared.cs | 8 +++++++- src/map/Map.cs | 7 +++---- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/app/App.cs b/src/app/App.cs index 95dbd839..9722186d 100644 --- a/src/app/App.cs +++ b/src/app/App.cs @@ -60,6 +60,10 @@ public partial class App : CanvasLayer, IApp { Instantiator.SceneTree.Paused = false; Game.Show(); + }) + .Handle((in AppLogic.Output.ExitGame _) => + { + GetTree().Quit(); }); diff --git a/src/game/Game.cs b/src/game/Game.cs index 45ce701f..3fa6f82a 100644 --- a/src/game/Game.cs +++ b/src/game/Game.cs @@ -199,10 +199,7 @@ public partial class Game : Node3D, IGame Input.MouseMode = Input.MouseModeEnum.Visible; PauseMenu.SetProcessUnhandledInput(true); }) - .Handle((in GameLogic.Output.LoadNextFloor _) => - { - Map.SpawnNextFloor(); - }) + .Handle((in GameLogic.Output.LoadNextFloor _) => { Map.SpawnNextFloor(); }) .Handle((in GameLogic.Output.HidePauseMenu _) => { PauseMenu.Hide(); }) .Handle((in GameLogic.Output.ExitPauseMenu _) => { PauseMenu.FadeOut(); Input.MouseMode = Input.MouseModeEnum.Visible; PauseMenu.SetProcessUnhandledInput(false); }) .Handle((in GameLogic.Output.ShowFloorClearMenu _) => { FloorClearMenu.Show(); FloorClearMenu.FadeIn(); }) @@ -214,7 +211,14 @@ public partial class Game : Node3D, IGame .Handle((in GameLogic.Output.ShowAskForTeleport _) => { GameRepo.Pause(); InGameUI.UseTeleportPrompt.FadeIn(); InGameUI.SetProcessInput(true); }) .Handle((in GameLogic.Output.HideAskForTeleport _) => { GameRepo.Resume(); InGameUI.UseTeleportPrompt.FadeOut(); InGameUI.SetProcessInput(false); }) .Handle((in GameLogic.Output.ShowLostScreen _) => { DeathMenu.Show(); DeathMenu.FadeIn(); }) - .Handle((in GameLogic.Output.ExitLostScreen _) => { DeathMenu.FadeOut(); }); + .Handle((in GameLogic.Output.ExitLostScreen _) => { DeathMenu.FadeOut(); }) + .Handle((in GameLogic.Output.SaveGame _) => + { + Save(); + AppRepo.OnExitGame(); + GetTree().Quit(); + // Back to title screen + }); GameLogic.Start(); GameLogic.Input(new GameLogic.Input.Initialize()); @@ -440,7 +444,6 @@ public partial class Game : Node3D, IGame private void FloorClearMenu_SaveAndExit() { // Save - GameLogic.Input(new GameLogic.Input.HideFloorClearMenu()); GameLogic.Input(new GameLogic.Input.SaveGame()); } diff --git a/src/game/GameLogic.Output.cs b/src/game/GameLogic.Output.cs index 8d762f93..e898bc9b 100644 --- a/src/game/GameLogic.Output.cs +++ b/src/game/GameLogic.Output.cs @@ -37,5 +37,7 @@ public partial class GameLogic public readonly record struct HideAskForTeleport; public readonly record struct GoToOverworld; + + public readonly record struct SaveGame; } } diff --git a/src/game/GameLogic.g.puml b/src/game/GameLogic.g.puml index 1b460d73..6ae74104 100644 --- a/src/game/GameLogic.g.puml +++ b/src/game/GameLogic.g.puml @@ -16,6 +16,7 @@ GameJamDungeon_GameLogic_State_AskForTeleport --> GameJamDungeon_GameLogic_State GameJamDungeon_GameLogic_State_AskForTeleport --> GameJamDungeon_GameLogic_State_Playing : HideAskForTeleport GameJamDungeon_GameLogic_State_FloorClearedDecisionState --> GameJamDungeon_GameLogic_State_FloorClearedDecisionState : GoToNextFloor GameJamDungeon_GameLogic_State_FloorClearedDecisionState --> GameJamDungeon_GameLogic_State_Playing : HideFloorClearMenu +GameJamDungeon_GameLogic_State_FloorClearedDecisionState --> GameJamDungeon_GameLogic_State_Playing : SaveGame GameJamDungeon_GameLogic_State_GameStarted --> GameJamDungeon_GameLogic_State_Playing : Initialize GameJamDungeon_GameLogic_State_InventoryOpened --> GameJamDungeon_GameLogic_State_Playing : CloseInventory GameJamDungeon_GameLogic_State_MinimapOpen --> GameJamDungeon_GameLogic_State_Playing : MiniMapButtonReleased @@ -30,6 +31,7 @@ GameJamDungeon_GameLogic_State_Resuming --> GameJamDungeon_GameLogic_State_Playi GameJamDungeon_GameLogic_State : OnIsPaused() → SetPauseMode GameJamDungeon_GameLogic_State_FloorClearedDecisionState : OnGoToNextFloor → LoadNextFloor +GameJamDungeon_GameLogic_State_FloorClearedDecisionState : OnSaveGame → SaveGame GameJamDungeon_GameLogic_State_GameStarted : OnInitialize → StartGame GameJamDungeon_GameLogic_State_InventoryOpened : OnEnter → OpenInventory GameJamDungeon_GameLogic_State_InventoryOpened : OnExit → HideInventory diff --git a/src/game/state/states/GameLogic.State.FloorCleared.cs b/src/game/state/states/GameLogic.State.FloorCleared.cs index 7fa85706..a02fba3f 100644 --- a/src/game/state/states/GameLogic.State.FloorCleared.cs +++ b/src/game/state/states/GameLogic.State.FloorCleared.cs @@ -7,7 +7,7 @@ public partial class GameLogic public partial record State { [Meta] - public partial record FloorClearedDecisionState : Playing, IGet, IGet + public partial record FloorClearedDecisionState : Playing, IGet, IGet, IGet { public FloorClearedDecisionState() { @@ -25,6 +25,12 @@ public partial class GameLogic { return To(); } + + public Transition On(in Input.SaveGame input) + { + Output(new Output.SaveGame()); + return To(); + } } } } diff --git a/src/map/Map.cs b/src/map/Map.cs index 331fd3b6..b5aa6b1f 100644 --- a/src/map/Map.cs +++ b/src/map/Map.cs @@ -88,12 +88,11 @@ public partial class Map : Node3D, IMap private void LoadFloor() { - var currentFloorScene = _floors.First(); + var currentFloorScene = FloorScenes.First(); var instantiator = new Instantiator(GetTree()); - var loadedScene = instantiator.LoadAndInstantiate(currentFloorScene.ResourcePath); + var loadedScene = instantiator.LoadAndInstantiate(currentFloorScene); AddChild(loadedScene); CurrentFloor = (IDungeonFloor)loadedScene; - _floors.Remove(currentFloorScene); - FloorScenes.Remove(currentFloorScene.ResourcePath); + FloorScenes.Remove(currentFloorScene); } }