using Cirno.Scripts.Enums; using Cirno.Scripts.Misc; using Cirno.Scripts.Resources; using Godot; namespace Cirno.Scripts; public partial class GameController : Node { public static GameController Instance { get; private set; } private Hud _hud; public GameState GameState { get; private set; } [Signal] public delegate void GameStateChangeEventHandler(GameState state); [Signal] public delegate void ManagerReadyEventHandler(); [Export] public StringName PauseActionName { get; private set; } = "pause"; public override void _Ready() { Instance = this; RenderingServer.SetDefaultClearColor(Colors.Black); if (GlobalState.Instance.SessionSettings.GameMode is GameMode.Roguelite) { if (GlobalState.Instance.SessionSettings.LevelNumber < 0) { // TODO: Change based on which level we're going to GlobalState.Instance.SessionSettings.LevelNumber = 0; } } else { //GlobalState.Session.LevelNumber = MapResource.LevelId; } GlobalState.Instance.ChangeCursor(false); if (GlobalState.Instance.SessionSettings.AllowSaving) { GlobalState.Instance.SaveGame(); } //_audioManager = new AudioManager(); // this.AddChild(_audioManager); _hud = GetNodeOrNull("HUD"); if (_hud == null) GD.Print("No HUD in scene."); //_cameraTarget = GetNodeOrNull("CameraTarget"); //if (_cameraTarget == null) GD.Print("No camera target in scene."); // _inventoryManager = GetNodeOrNull("InventoryManager"); //if (_inventoryManager == null) GD.Print("No inventory manager in scene."); //SpawnBulletsContainer(); if (_hud != null) { this.GameStateChange += _hud.OnGameStateChanged; } // if (_inventoryManager != null && _hud != null) // { // // _inventoryManager.WeaponUpdate += key => _hud.EquipWeapon(key); // } //PlayerRespawned += OnPlayerRespawned; GameState = GameState.Playing; //CallDeferred(MethodName.DelayPlayerSpawn); CallDeferred(MethodName.OnFinished); } private void OnFinished() { EmitSignalManagerReady(); } public override void _Process(double delta) { if (GameState is GameState.Paused && Input.IsActionJustPressed(PauseActionName)) { Unpause(); } } 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 GameState ToggleControlMode() { if (GameState is GameState.Playing) { ChangeState(GameState.Controlling); } else if (GameState is GameState.Controlling) { ChangeState(GameState.Playing); } return GameState; } 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); } }