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); private bool _gameOver = false; [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((Player)player); GetTree().Root.AddChild(player); } } public void OnAllEnemiesDefeated() { GD.Print("All enemies defeated"); P1CharactersOut.AddRange(Players.ElementAt(0).CharactersLeftOnStage); if (Players.Count() == 2) P2CharactersOut.AddRange(Players.ElementAt(1).CharactersLeftOnStage); 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) { GD.Print("Instancing..."); var names = player.CharactersLeftOnStage.Select(x => x.Name).ToArray(); GD.Print(names); var selectedCharacter = player.CharactersLeftOnStage[player._characterIndex]; player.SelectedCharacter = selectedCharacter; GetTree().Root.AddChild(player.SelectedCharacter); player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); } public void RemoveCharacter(Player player) { player.CharactersLeftOnStage.Remove(player.CharactersLeftOnStage.ElementAt(player._characterIndex)); player.SelectedCharacter?.QueueFree(); player._characterIndex = 0; if (player.CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, player); } public void RemoveCharacterAndAddToExit(Character1 character) { P1CharactersOut.Add(character); Players.ElementAt(0).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); Players.ElementAt(0)._characterIndex = 0; if (Players.ElementAt(0).CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0)); } public void RemoveCharacterAndAddToExit(Character2 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(bool isGameOver) { _gameOver = isGameOver; if (isGameOver) EmitSignal(SignalName.OnGameOver); } 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 main = GetTree().Root.GetNode
("/root/Main"); main.LoadNextLevel(_levelIndex++); foreach (var player in Players) EmitSignal(SignalName.ReselectCharacter, player); } public bool IsGameOver => _gameOver; }