using Godot; namespace Cirno.Scripts.Utils; public partial class GameStateManager : Node { public static GameStateManager Instance { get; private set; } public GameState GameState { get; private set; } [Signal] public delegate void GameStateChangeEventHandler(GameState state); public void Init(GameState initialState) { Instance = this; GameState = initialState; } public void Pause() { if (GameState == GameState.Playing) { ChangeState(GameState.Paused); } } public void Unpause() { if (GameState == GameState.Paused) { CallDeferred(MethodName.ChangeState, (int)GameState.Playing); //ChangeState(GameState.Playing); } } public static void SetState(GameState state) { GameStateManager.Instance.ChangeState(state); } public void ChangeState(GameState state) { if (state == GameState) return; GameState = state; EmitSignal(SignalName.GameStateChange, (int)state); GD.Print($"Game state changed to {state}"); switch (state) { case GameState.Paused: case GameState.Dialogue: case GameState.Shop: case GameState.Inventory: GlobalState.Instance.ChangeCursor(true); GetTree().SetPause(true); //Input.MouseMode = Input.MouseModeEnum.Visible; break; case GameState.Playing: case GameState.Controlling: //Input.MouseMode = Input.MouseModeEnum.Confined; GlobalState.Instance.ChangeCursor(false); DelayedUnpause(); //CallDeferred(MethodName.DelayedUnpause); //GetTree().SetPause(false); break; case GameState.Menu: GlobalState.Instance.ChangeCursor(true); //Input.MouseMode = Input.MouseModeEnum.Visible; DelayedUnpause(); //CallDeferred(MethodName.DelayedUnpause); //GetTree().SetPause(false); break; } } private void DelayedUnpause() { GetTree().SetPause(false); } public override void _Process(double delta) { if (GameState is GameState.Paused && GlobalInputManager.IsPauseJustPressed()) { Unpause(); return; } } }