using Godot; using Godot.Collections; using System.Collections.Generic; using System.Linq; public partial class GameManager : Node { [Signal] public delegate void OnPlayerGameOverEventHandler(); [Signal] public delegate void ReselectCharacterEventHandler(Player player); [Export] private Array PlayerScenes; public IEnumerable Players = new List(); private int _levelIndex; public bool IsGameOverScreenOn = false; 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]; player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); GetTree().Root.AddChild(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); if (Players.All(x => !x.CharactersLeftOnStage.Any()) && Players.Any(x => x.CharactersExited.Any())) OnLevelClear(); } 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.OnPlayerGameOver); GD.Print($"Game over for {player.Name}"); } public void ReloadGameScene() { GD.Print("Reloading scene"); var players = GetTree().Root.GetChildren().OfType(); foreach (var player in players) player.QueueFree(); var levels = GetTree().Root.GetChildren().OfType(); foreach (var level in levels) level.QueueFree(); GetTree().ReloadCurrentScene(); } public void OnLevelClear() { foreach (var player in Players) { player.CharactersLeftOnStage.AddRange(player.CharactersExited); player.CharactersExited.Clear(); player.CharacterIndex = 0; } var playerCharacters = GetTree().GetNodesInGroup("Player"); foreach (var character in playerCharacters) character.GetParent().RemoveChild(character); 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); } }