using Godot; using Godot.Collections; using System.Linq; public partial class GameManager : Node { [Signal] public delegate void OnGameOverEventHandler(); [Signal] public delegate void OnP1GameOverEventHandler(); [Signal] public delegate void OnP2GameOverEventHandler(); public int NumberOfPlayers; public bool IsP1SelectingCharacter = true; public bool IsP2SelectingCharacter = true; [Export] public Array _p1Characters; [Export] public Array _p2Characters; [Export] public Character _p1SelectedCharacter; [Export] public Character _p2SelectedCharacter; private bool _p1GameOver = false; private bool _p2GameOver = false; private int _p1CharacterIndex = 0; private int _p2CharacterIndex = 0; public void SetP1ToNextCharacter() => _p1CharacterIndex = (++_p1CharacterIndex) % _p1Characters.Count(); public void SetP1ToPreviousCharacter() => _p1CharacterIndex = _p1CharacterIndex == 0 ? _p1Characters.Count() : --_p1CharacterIndex; public void ResetPlayerPosition() { var playerSpawnPoint = GetNode("P1SpawnPoint"); playerSpawnPoint.SetPlayerPosition(_p1SelectedCharacter); } public void OnP1CharacterSelected() { GD.Print("Instancing..."); var selectedPlayer = _p1Characters[_p1CharacterIndex].Instantiate(); _p1SelectedCharacter = selectedPlayer as Character; GetTree().Root.AddChild(_p1SelectedCharacter); ResetPlayerPosition(); } public void RemoveP1Character() { _p1Characters.Remove(_p1Characters.ElementAt(_p1CharacterIndex)); _p1SelectedCharacter?.QueueFree(); _p1CharacterIndex = 0; } public void SetP1GameOver(bool isGameOver) { _p1GameOver = isGameOver; if (isGameOver) { EmitSignal(SignalName.OnP1GameOver); CheckForOverallGameOver(); } } public bool IsP1GameOver => _p1GameOver; public void SetP2GameOver(bool isGameOver) { _p2GameOver = isGameOver; if (isGameOver) { EmitSignal(SignalName.OnP2GameOver); CheckForOverallGameOver(); } } private void CheckForOverallGameOver() { if (_p1GameOver && _p2GameOver) EmitSignal(SignalName.OnGameOver); } } public partial class Character : CharacterBody3D { }