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(PlayerManager player); [Export] private Array PlayerScenes; public Array P1CharactersOut = new Array(); public Array P2CharactersOut = new Array(); 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((PlayerManager)player); GetTree().Root.AddChild(player); } } public void OnAllEnemiesDefeated() { GD.Print("All enemies defeated"); OnLevelClear(); } public void OnHandleCharacterSelectUI(PlayerManager player) { EmitSignal(SignalName.ReselectCharacter, player); } public void SetToNextCharacter(PlayerManager player) { player._characterIndex = (++player._characterIndex) % player.CharactersLeftOnStage.Count(); GD.Print(player.CharactersLeftOnStage.ElementAt(player._characterIndex)); } public void SetToPreviousCharacter(PlayerManager player) { player._characterIndex = player._characterIndex == 0 ? player.CharactersLeftOnStage.Count() - 1 : --player._characterIndex; } public void ResetPlayerPosition(PlayerManager player) { player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); GD.Print(player.CharactersLeftOnStage.ElementAt(player._characterIndex)); } public void OnCharacterSelected(PlayerManager player) { var sfxPlayer = GetTree().Root.GetNode("Main/SFXPlayer"); var audioStream = ResourceLoader.Load("Audio/SFX/Select.wav"); sfxPlayer.Stream = audioStream; sfxPlayer.Play(); GD.Print("Instancing..."); var names = player.CharactersLeftOnStage.Select(x => x.Name).ToArray(); GD.Print(names); if (player.CharactersLeftOnStage.Any()) { var selectedCharacter = player.CharactersLeftOnStage[player._characterIndex]; player.SelectedCharacter = selectedCharacter; GetTree().Root.AddChild(player.SelectedCharacter); player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); } } public void RemoveCharacter(P1Controls character) { Players.ElementAt(0).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); GD.Print(Players.ElementAt(0).CharactersLeftOnStage.Select(x => x.Name).ToArray()); Players.ElementAt(0)._characterIndex = 0; if (Players.ElementAt(0).CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0)); if (!P1CharactersOut.Any() && !Players.ElementAt(0).CharactersLeftOnStage.Any()) SetGameOver(Players.ElementAt(0), true); if (Players.Count() == 2 && !P2CharactersOut.Any() && !Players.ElementAt(1).CharactersLeftOnStage.Any()) SetGameOver(Players.ElementAt(1), true); } public void RemoveCharacter(P2Controls character) { Players.ElementAt(1).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); GD.Print(Players.ElementAt(1).CharactersLeftOnStage.Select(x => x.Name).ToArray()); Players.ElementAt(1)._characterIndex = 0; if (Players.ElementAt(1).CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(1)); } public void RemoveCharacterAndAddToExit(P1Controls character) { P1CharactersOut.Add(character); Players.ElementAt(0).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); GD.Print(Players.ElementAt(0).CharactersLeftOnStage.Select(x => x.Name).ToArray()); Players.ElementAt(0)._characterIndex = 0; if (Players.ElementAt(0).CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0)); } public void RemoveCharacterAndAddToExit(P2Controls character) { P2CharactersOut.Add(character); Players.ElementAt(1).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); Players.ElementAt(1)._characterIndex = 0; if (Players.ElementAt(1).CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(1)); } public void SetGameOver(PlayerManager player, bool isGameOver) { player.GameOver = isGameOver; if (isGameOver) EmitSignal(SignalName.OnGameOver); GD.Print($"Game over for {player.Name}"); } public void OnLevelClear() { Players.ElementAt(0).CharactersLeftOnStage.AddRange(P1CharactersOut); if (Players.Count() == 2) Players.ElementAt(1).CharactersLeftOnStage.AddRange(P2CharactersOut); P1CharactersOut.Clear(); if (Players.Count() == 2) P2CharactersOut.Clear(); Players.ElementAt(0)._characterIndex = 0; if (Players.Count() == 2) Players.ElementAt(1)._characterIndex = 0; var players = GetTree().GetNodesInGroup("Player"); foreach (var player in players) GetTree().Root.RemoveChild(player); var projectiles = GetTree().Root.GetChildren().OfType(); foreach (var projectile in projectiles) GetTree().Root.RemoveChild(projectile); var main = GetTree().Root.GetNode
("/root/Main"); main.LoadNextLevel(_levelIndex++); foreach (var player in Players) EmitSignal(SignalName.ReselectCharacter, player); } }