diff --git a/assets b/assets index 37af2de..235643b 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 37af2de43458380ee7e86f3635c40bde9ec7093f +Subproject commit 235643b054d4c0532dde528fb33eeec119fad60f diff --git a/src/App/App.cs b/src/App/App.cs index 7b6ada9..1fafb33 100644 --- a/src/App/App.cs +++ b/src/App/App.cs @@ -86,6 +86,7 @@ public partial class App : CanvasLayer, IApp // GD.Print(string.Join(',', AppRepo.ModManger.AllMods.GetMods())); AppLogic = new AppLogic(); AppLogic.Set(AppRepo); + AppLogic.Set(new AppLogic.Data()); OptionConfig = new TestConfig(); ((TestConfig)OptionConfig).OnSettingChanged += AppRepo.OnSettingChanged; @@ -108,10 +109,10 @@ public partial class App : CanvasLayer, IApp GameViewPort.Scaling3DScale = setting.Value.As() / 100f; } }); - _binding.On((in IAppRepo.GameExiting exiting) => - { - AppLogic.Input(new AppLogicState.Input.EndGame(ExitGameReason.QuitToMenu)); - }); + // _binding.On((in IAppRepo.GameExiting exiting) => + // { + // AppLogic.Input(new AppLogicState.Input.EndGame(AppLogic.Get().ExitGameReason)); + // }); MainMenu.NewGame += OnNewGame; MainMenu.LastGame += () => { @@ -159,6 +160,8 @@ public partial class App : CanvasLayer, IApp MainMenu.SetLastGameVisible(fileSystem.File.Exists(Path.Combine(OS.GetUserDataDir(), "lastGame.txt"))); + ModsMenu.ExitModMenu += OnMenuExit; + this.Provide(); } diff --git a/src/App/App.g.puml b/src/App/App.g.puml index f0a439b..7684ce5 100644 --- a/src/App/App.g.puml +++ b/src/App/App.g.puml @@ -20,28 +20,31 @@ package App-Type [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGa [Methods] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:33 _Notification()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:70 BindSetting()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:299 GetLevels()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:252 GetSaves()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:288 HideMenus()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:302 GetLevels()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:255 GetSaves()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:291 HideMenus()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:72 Initialize()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:270 OnExitTree()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:165 OnLastGame()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:174 OnLoadGame()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:175 OnLoadSaveGame()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:172 OnMenuExit()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:187 OnMods()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:173 OnNewGame()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:186 OnOptions()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:189 OnReady()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:283 OnResolved()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:260 OnSaveFileLoaded()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:266 Setup()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:306 Value()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:273 OnExitTree()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:168 OnLastGame()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:177 OnLoadGame()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:178 OnLoadSaveGame()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:175 OnMenuExit()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:190 OnMods()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:176 OnNewGame()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:189 OnOptions()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:192 OnReady()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:286 OnResolved()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:263 OnSaveFileLoaded()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:269 Setup()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/App.cs:309 Value()]] } class AppLogic { [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/AppLogic.cs ScriptFile]] [Constructors] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/AppLogic.cs:12 AppLogic]]() + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/AppLogic.cs:14 AppLogic]]() + -- + [Methods] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/App/AppLogic.cs:19 OnStartSubscriptions()]] } package Game-Type [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs]] { class Game { @@ -59,32 +62,31 @@ package App-Type [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGa [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:38 SaveFile]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:41 SaveFilePath]] -- - [Interface Methods] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:162 LoadGame()]] [Methods] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:33 _Notification()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:218 _UnhandledInput()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:169 HideMenus()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:132 HideMenus()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:71 Initialize()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:232 Load()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:233 LoadExistingGame()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:198 OnExitTree()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:103 OnReady()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:201 OnResolved()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:82 OnSaveButton()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:97 OpenOptions()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:85 PauseButtonPressed()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:84 QuitToDesktop()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:83 QuitToMainMenu()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:125 LoadGame()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:162 OnExitTree()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:102 OnReady()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:165 OnResolved()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:81 OnSaveButton()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:96 OpenOptions()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:84 PauseButtonPressed()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:83 QuitToDesktop()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:82 QuitToMainMenu()]] [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:228 Save()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:143 SaveGame()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:155 SaveGame2()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:175 Setup()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:106 SaveGame()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:118 SaveGame2()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/Game.cs:138 Setup()]] } class GameLogicState { [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/GameLogicState.cs ScriptFile]] [Constructors] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/GameLogicState.cs:14 GameLogic]]() + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/Game/GameLogicState.cs:15 GameLogic]]() } class PauseMenu { [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/PauseMenu/PauseMenu.cs ScriptFile]] @@ -149,18 +151,21 @@ package App-Type [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGa class ModMenu { [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs ScriptFile]] [Properties] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:15 ModEntryScene]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:17 ModManger]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:18 ModsContainer]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ReorderableContainer/ReOrderableContainer.cs Script]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:19 ProfilesButton]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:27 BackButton]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:26 DisableAllButton]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:25 EnableAllButton]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:20 ModEntryScene]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:22 ModManger]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:23 ModsContainer]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ReorderableContainer/ReOrderableContainer.cs Script]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:24 ProfilesButton]] -- [Methods] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:74 _ExitTree()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:14 _Notification()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:26 OnModProfileSelected()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:20 OnResolved()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:32 OnVisibilityChanged()]] - [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:40 RefreshMods()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:83 _ExitTree()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:17 _Notification()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:35 OnModProfileSelected()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:28 OnResolved()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:41 OnVisibilityChanged()]] + [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ModMenu/ModMenu.cs:49 RefreshMods()]] } class ReOrderableContainer { [[vscode://file//home/ronnie/Documents/Godot/Projects/ChickenGameTest/src/ReorderableContainer/ReOrderableContainer.cs ScriptFile]] diff --git a/src/App/AppLogic.cs b/src/App/AppLogic.cs index 6b16e94..cda060a 100644 --- a/src/App/AppLogic.cs +++ b/src/App/AppLogic.cs @@ -1,5 +1,7 @@ namespace FoodFactory; +using System; +using System.Collections.Generic; using Chickensoft.Introspection; using Chickensoft.LogicBlocks; using Chickensoft.LogicBlocks.Auto; @@ -14,4 +16,9 @@ public partial class AppLogic : AutoBlock, IAppLogic Preallocate(); } + public override IEnumerable OnStartSubscriptions() + { + yield return Get().AutoChannel.Bind() + .On((in IAppRepo.GameExiting message) => (State as AppLogicState.InGame)?.OnGameExited(message.Reason)); + } } diff --git a/src/App/AppLogicState.g.puml b/src/App/AppLogicState.g.puml index 4652cd6..1cbfa44 100644 --- a/src/App/AppLogicState.g.puml +++ b/src/App/AppLogicState.g.puml @@ -11,7 +11,7 @@ state "AppLogicState" as FoodFactory_AppLogicState { FoodFactory_AppLogicState_CreatingGame --> FoodFactory_AppLogicState_InGame : NewGame FoodFactory_AppLogicState_CreatingGame --> FoodFactory_AppLogicState_MainMenu : ExitMenu -FoodFactory_AppLogicState_InGame --> FoodFactory_AppLogicState_MainMenu : EndGame +FoodFactory_AppLogicState_InGame --> FoodFactory_AppLogicState_LeavingGame : EndGame FoodFactory_AppLogicState_LeavingGame --> FoodFactory_AppLogicState_MainMenu : EndGame FoodFactory_AppLogicState_LoadingGame --> FoodFactory_AppLogicState_InGame : LoadSave FoodFactory_AppLogicState_LoadingGame --> FoodFactory_AppLogicState_MainMenu : ExitMenu @@ -24,7 +24,6 @@ FoodFactory_AppLogicState_OptionMenu --> FoodFactory_AppLogicState_MainMenu : Ex FoodFactory_AppLogicState_CreatingGame : OnEnter → ShowGameCreationWindow FoodFactory_AppLogicState_CreatingGame : OnNewGame → SetUpGameScene -FoodFactory_AppLogicState_InGame : OnEndGame → RemoveExistingGame FoodFactory_AppLogicState_InGame : OnEnter → ShowGame FoodFactory_AppLogicState_LeavingGame : OnEndGame → QuitGame, RemoveExistingGame FoodFactory_AppLogicState_LoadingGame : OnEnter → ShowGameLoadingWindow diff --git a/src/App/AppRepo.cs b/src/App/AppRepo.cs index 72e5c81..4d8a496 100644 --- a/src/App/AppRepo.cs +++ b/src/App/AppRepo.cs @@ -11,10 +11,10 @@ using TrimKit.VirtualFileSystem; public interface IAppRepo : IDisposable { readonly record struct GameEntering; - readonly record struct GameExiting; + readonly record struct GameExiting(ExitGameReason Reason); readonly record struct GameSettingChanged(IOptionKey Setting, Variant Value); void OnEnteringGame(); - void OnExitGame(); + void OnExitGame(ExitGameReason reason = ExitGameReason.QuitToMenu); void OnSettingChanged(IOptionKey setting, Variant value); IAutoChannel AutoChannel { get; } IModManger ModManger { get; } @@ -30,7 +30,7 @@ public class AppRepo : IAppRepo public required IModManger ModManger {get;init;} public void OnEnteringGame() => _autoChannel.Send(new IAppRepo.GameEntering()); - public void OnExitGame() => _autoChannel.Send(new IAppRepo.GameExiting()); + public void OnExitGame(ExitGameReason reason = ExitGameReason.QuitToMenu) => _autoChannel.Send(new IAppRepo.GameExiting(reason)); public void OnSettingChanged(IOptionKey setting, Variant value) => _autoChannel.Send(new IAppRepo.GameSettingChanged(setting, value)); protected virtual void Dispose(bool disposing) @@ -57,3 +57,10 @@ public class AppRepo : IAppRepo GC.SuppressFinalize(this); } } +public partial class AppLogic +{ + public record Data + { + public ExitGameReason ExitGameReason { get; set; } + } +} diff --git a/src/App/States/InGame.cs b/src/App/States/InGame.cs index 82defb4..c636744 100644 --- a/src/App/States/InGame.cs +++ b/src/App/States/InGame.cs @@ -20,9 +20,11 @@ public partial record AppLogicState public Type On(in Input.EndGame input) { // return To(); - - Output(new Output.RemoveExistingGame()); - return To(); + Get().ExitGameReason = input.Reason; + return To(); } + + public void OnGameExited(ExitGameReason reason) => Input(new Input.EndGame(reason)); + } } diff --git a/src/App/States/LeavingGame.cs b/src/App/States/LeavingGame.cs index 0e05d84..10adb7e 100644 --- a/src/App/States/LeavingGame.cs +++ b/src/App/States/LeavingGame.cs @@ -13,14 +13,16 @@ public partial record AppLogicState { this.OnEnter(() => { - + Input(new Input.EndGame());//PlaceHolder // Output(new Output.ShowGame()); }); + this.OnExit(()=> Get().ExitGameReason = ExitGameReason.QuitToMenu); } public Type On(in Input.EndGame input){ + var reason = Get().ExitGameReason; Output(new Output.RemoveExistingGame()); - if (input.Reason == ExitGameReason.QuitToDesktop) + if (reason is ExitGameReason.QuitToDesktop) { Output(new Output.QuitGame()); } diff --git a/src/Game/Game.cs b/src/Game/Game.cs index 0233d22..ad3b259 100644 --- a/src/Game/Game.cs +++ b/src/Game/Game.cs @@ -76,7 +76,6 @@ public partial class Game : Node3D, IGame PauseMenu.OnQuitToMainMenu += QuitToMainMenu; PauseMenu.OnQuitToDesktop += QuitToDesktop; PauseMenu.OnSave += OnSaveButton; - GameLogic = new GameLogic(); } private void OnSaveButton() => GameLogic.Input(new GameLogicState.Input.SaveRequested()); @@ -102,42 +101,6 @@ public partial class Game : Node3D, IGame public void OnReady() { - GameBinding = GameLogic.Bind(); - GameBinding.OnOutput((in GameLogicState.Output.SetPauseMode _) => - { - GetTree().Paused = !GetTree().Paused; - }).OnOutput((in GameLogicState.Output.ShowOptionMenu _) => - { - HideMenus(); - OptionsMenu.Show(); - }) - // .OnOutput((in GameLogicState.Output.ShowOptionMenu _) => - // { - // OptionsMenu.Hide(); - // }) - .OnOutput((in GameLogicState.Output.ShowPauseMenu _) => - { - HideMenus(); - PauseMenu.Show(); - }) - .OnOutput((in GameLogicState.Output.HideMenus _) => HideMenus()) - .OnOutput((in GameLogicState.Output.StartSaving _) => SaveGame2()) - .OnInput((in GameLogicState.Input.SaveCompleted _) => { - var path = Path.Combine(OS.GetUserDataDir(), "lastGame.txt"); - File.WriteAllText(path,SaveService.FilePath); - }) - - - // .OnOutput((in GameLogicState.Output.ExitPauseMenu _) => - // { - // HideMenus(); - // }) - // .OnOutput((in GameLogicState.Output.HidePauseMenu _) => - // { - // PauseMenu.Hide(); - // }) - ; - GameLogic.Start(); } private async ValueTask SaveGame() @@ -175,6 +138,7 @@ throw; public void Setup() { + GameLogic = new GameLogic(); GameRepo = new GameRepo(); GameLogic.Set(GameRepo); GameLogic.Set(AppRepo); @@ -213,6 +177,42 @@ throw; // } // ); + GameBinding = GameLogic.Bind(); + GameBinding.OnOutput((in GameLogicState.Output.SetPauseMode _) => + { + GetTree().Paused = !GetTree().Paused; + }).OnOutput((in GameLogicState.Output.ShowOptionMenu _) => + { + HideMenus(); + OptionsMenu.Show(); + }) + // .OnOutput((in GameLogicState.Output.ShowOptionMenu _) => + // { + // OptionsMenu.Hide(); + // }) + .OnOutput((in GameLogicState.Output.ShowPauseMenu _) => + { + HideMenus(); + PauseMenu.Show(); + }) + .OnOutput((in GameLogicState.Output.HideMenus _) => HideMenus()) + .OnOutput((in GameLogicState.Output.StartSaving _) => SaveGame2()) + .OnInput((in GameLogicState.Input.SaveCompleted _) => { + var path = Path.Combine(OS.GetUserDataDir(), "lastGame.txt"); + File.WriteAllText(path,SaveService.FilePath); + }) + + + // .OnOutput((in GameLogicState.Output.ExitPauseMenu _) => + // { + // HideMenus(); + // }) + // .OnOutput((in GameLogicState.Output.HidePauseMenu _) => + // { + // PauseMenu.Hide(); + // }) + ; + GameLogic.Start(); this.Provide(); } public override void _UnhandledInput(InputEvent @event) diff --git a/src/Game/GameLogicState.cs b/src/Game/GameLogicState.cs index b5568f0..882b056 100644 --- a/src/Game/GameLogicState.cs +++ b/src/Game/GameLogicState.cs @@ -5,6 +5,7 @@ using Chickensoft.LogicBlocks; using Chickensoft.LogicBlocks.Auto; using System; using Microsoft.Extensions.Options; +using System.Collections.Generic; public interface IGameLogic : ILogicBlock; [Meta] @@ -43,6 +44,7 @@ public abstract partial record GameLogicState , IGet , IGet , IGet + , IGet { public Paused() { @@ -64,8 +66,18 @@ public abstract partial record GameLogicState public Type On(in Input.SaveRequested input) => To(); public virtual Type On(in Input.PauseButtonPressed input) => To(); - public virtual Type On(in Input.GotoMainMenu input) => To(); + public virtual Type On(in Input.GotoMainMenu input) + { + // Get().ExitGameReason = ExitGameReason.QuitToMenu; + return To(); + } + public virtual Type On(in Input.OpenOptionMenu input) => To(); + public Type On(in Input.GotoDesktop input) + { + // Get().ExitGameReason = ExitGameReason.QuitToDesktop; + return To(); + } } [Meta] public partial record OptionsMenu : Paused @@ -112,7 +124,18 @@ public abstract partial record GameLogicState public Quit() { this.OnEnter( - () => Get().OnExitGame() + () => Get().OnExitGame(ExitGameReason.QuitToMenu) + ); + } + } + [Meta] + public partial record QuitToDesktop : GameLogicState + { + + public QuitToDesktop() + { + this.OnEnter( + () => Get().OnExitGame(ExitGameReason.QuitToDesktop) ); } } diff --git a/src/Game/GameLogicState.g.puml b/src/Game/GameLogicState.g.puml index 72b3a3a..52ec421 100644 --- a/src/Game/GameLogicState.g.puml +++ b/src/Game/GameLogicState.g.puml @@ -6,6 +6,7 @@ state "GameLogicState" as GameLogicState { } state "Playing" as GameLogicState_Playing state "Quit" as GameLogicState_Quit + state "QuitToDesktop" as GameLogicState_QuitToDesktop } GameLogicState_OptionsMenu --> GameLogicState_OptionsMenu : OpenOptionMenu @@ -13,6 +14,7 @@ GameLogicState_OptionsMenu --> GameLogicState_Paused : PauseButtonPressed GameLogicState_Paused --> GameLogicState_OptionsMenu : OpenOptionMenu GameLogicState_Paused --> GameLogicState_Playing : PauseButtonPressed GameLogicState_Paused --> GameLogicState_Quit : GotoMainMenu +GameLogicState_Paused --> GameLogicState_QuitToDesktop : GotoDesktop GameLogicState_Paused --> GameLogicState_Saving : SaveRequested GameLogicState_Playing --> GameLogicState_Paused : PauseButtonPressed GameLogicState_Saving --> GameLogicState_Paused : SaveCompleted diff --git a/src/ModMenu/ModMenu.cs b/src/ModMenu/ModMenu.cs index b427a16..6e58723 100644 --- a/src/ModMenu/ModMenu.cs +++ b/src/ModMenu/ModMenu.cs @@ -8,19 +8,28 @@ using Chickensoft.Introspection; using Godot; using GodotHelpers; -public interface IModMenu : IControl; +public interface IModMenu : IControl +{ + event ModMenu.ExitModMenuEventHandler ExitModMenu; +} [Meta(typeof(IAutoNode))] public partial class ModMenu : Control, IModMenu { public override void _Notification(int what) => this.Notify(what); + +[Signal] public delegate void ExitModMenuEventHandler(); [Export] public PackedScene ModEntryScene { get; set; } = default!; [Dependency] public IAppRepo AppRepo => this.DependOn(); private IModManger ModManger => AppRepo.ModManger; [Node] public ReOrderableContainer ModsContainer { get; set; } = default!; [Node] public IOptionButton ProfilesButton { get; set; } = default!; + [Node] public IButton EnableAllButton { get; set; } = default!; + [Node] public IButton DisableAllButton { get; set; } = default!; + [Node] public IButton BackButton { get; set; } = default!; public void OnResolved() { VisibilityChanged += OnVisibilityChanged; ProfilesButton.ItemSelected += OnModProfileSelected; + BackButton.Pressed += EmitSignalExitModMenu; } private void OnModProfileSelected(long index) diff --git a/src/ModMenu/ModMenu.tscn b/src/ModMenu/ModMenu.tscn index 45dcfbc..3a9f9a2 100644 --- a/src/ModMenu/ModMenu.tscn +++ b/src/ModMenu/ModMenu.tscn @@ -91,15 +91,18 @@ layout_mode = 2 unique_name_in_owner = true layout_mode = 2 -[node name="Button2" type="Button" parent="VSplitContainer/HBoxContainer3" unique_id=656433698] +[node name="EnableAllButton" type="Button" parent="VSplitContainer/HBoxContainer3" unique_id=656433698] +unique_name_in_owner = true layout_mode = 2 text = "Enable All" -[node name="Button3" type="Button" parent="VSplitContainer/HBoxContainer3" unique_id=1971172163] +[node name="DisableAllButton" type="Button" parent="VSplitContainer/HBoxContainer3" unique_id=1971172163] +unique_name_in_owner = true layout_mode = 2 text = "Disable All" [node name="BackButton" type="Button" parent="VSplitContainer/HBoxContainer3" unique_id=392421633] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 10 text = "Back"