using Godot; using Godot.Collections; using System.Collections.Generic; using System.Linq; public partial class GameManager : Node { [Signal] public delegate void OnGameOverEventHandler(); [Signal] public delegate void ReselectCharacterEventHandler(Player player); [Export] private Array PlayerScenes; public IEnumerable Players = new List(); private int _levelIndex; public override void _Ready() { var main = GetTree().Root.GetNode
("/root/Main"); for (var i = 0; i < main.NumberOfPlayers; i++) { var player = PlayerScenes[i].Instantiate(); Players = Players.Append((Player)player); GetTree().Root.AddChild(player); } } public void OnAllEnemiesDefeated() { OnLevelClear(); } public void OnHandleCharacterSelectUI(Player player) { EmitSignal(SignalName.ReselectCharacter, player); } public void SetToNextCharacter(Player player) { player.CharacterIndex = (++player.CharacterIndex) % player.CharactersLeftOnStage.Count(); GD.Print(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); } public void SetToPreviousCharacter(Player player) { player.CharacterIndex = player.CharacterIndex == 0 ? player.CharactersLeftOnStage.Count() - 1 : --player.CharacterIndex; } public void ResetPlayerPosition(Player player) { player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); GD.Print(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); } public void OnCharacterSelected(Player player) { var sfxPlayer = GetTree().Root.GetNode("Main/SFXPlayer"); var audioStream = ResourceLoader.Load("Audio/SFX/Select.wav"); sfxPlayer.Stream = audioStream; sfxPlayer.Play(); GD.Print("Instancing..."); GD.Print(player.Name); if (player.CharactersLeftOnStage.Any()) { player.SelectedCharacter = player.CharactersLeftOnStage[player.CharacterIndex]; GetTree().Root.AddChild(player.SelectedCharacter); player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); } } public void RemoveCharacter(Player player) { player.CharactersLeftOnStage.Remove(player.SelectedCharacter); GetTree().Root.RemoveChild(player.SelectedCharacter); GD.Print(player.CharactersLeftOnStage.Select(x => x.Name).ToArray()); player.CharacterIndex = 0; if (player.CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, player); if (!player.CharactersExited.Any() && !player.CharactersLeftOnStage.Any()) SetGameOver(player, true); } public void RemoveCharacterAndAddToExit(Player player) { player.CharactersExited.Add(player.SelectedCharacter); player.CharactersLeftOnStage.Remove(player.SelectedCharacter); GetTree().Root.RemoveChild(player.SelectedCharacter); GD.Print(player.CharactersLeftOnStage.Select(x => x.Name).ToArray()); player.CharacterIndex = 0; if (player.CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, player); } public void SetGameOver(Player player, bool isGameOver) { player.GameOver = isGameOver; if (isGameOver) EmitSignal(SignalName.OnGameOver); GD.Print($"Game over for {player.Name}"); } public void OnLevelClear() { foreach (var player in Players) { player.CharactersLeftOnStage.AddRange(player.CharactersExited); player.CharactersExited.Clear(); player.CharacterIndex = 0; GetTree().Root.RemoveChild(player.SelectedCharacter); } var projectiles = GetTree().Root.GetChildren().OfType(); foreach (var projectile in projectiles) projectile.QueueFree(); var main = GetTree().Root.GetNode
("/root/Main"); main.LoadNextLevel(_levelIndex++); foreach (var player in Players) EmitSignal(SignalName.ReselectCharacter, player); } }