using Godot; using Godot.Collections; using System.Collections.Generic; using System.Linq; public partial class GameManager : Node { [Signal] public delegate void OnPlayerGameOverEventHandler(Player player); [Signal] public delegate void ReselectCharacterEventHandler(Player player); [Signal] public delegate void ClearPlayerBGEventHandler(Array players); [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(); var castedPlayer = (Player)player; castedPlayer.PlayerNumber = i + 1; Players = Players.Append(castedPlayer); 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(); if (player.CharactersLeftOnStage.Any()) { var character = player.CharactersLeftOnStage[player.CharacterIndex]; var instance = (Character)character.Instantiate(); instance.Initialize(player); player.SelectedCharacter = instance; player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); GetTree().Root.AddChild(player.SelectedCharacter); } } public void RemoveCharacter(Player player) { ResetPlayerPosition(player); player.CharactersLeftOnStage.RemoveAt(player.CharacterIndex); if (player.SelectedCharacter is not null) GetTree().Root.RemoveChild(player.SelectedCharacter); 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) { ResetPlayerPosition(player); player.CharactersExited.Add(player.CharactersLeftOnStage.ElementAt(player.CharacterIndex)); RemoveCharacter(player); } public void SetGameOver(Player player, bool isGameOver) { player.GameOver = isGameOver; if (isGameOver) EmitSignal(SignalName.OnPlayerGameOver, player); 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() { var enemies = GetTree().GetNodesInGroup("Enemy").Where(x => !x.IsQueuedForDeletion()); foreach (var enemy in enemies) enemy.QueueFree(); var playerCharacters = GetTree().GetNodesInGroup("Player"); EmitSignal(SignalName.ClearPlayerBG, 0); EmitSignal(SignalName.ClearPlayerBG, 1); foreach (var player in Players) { player.CharactersLeftOnStage.AddRange(player.CharactersExited); player.CharactersExited.Clear(); player.CharacterIndex = 0; } foreach (var character in playerCharacters) character.GetParent().RemoveChild(character); var projectiles = GetTree().GetNodesInGroup("Projectile").Where(x => !x.IsQueuedForDeletion()); foreach (var projectile in projectiles) projectile.QueueFree(); var main = GetTree().Root.GetNode
("/root/Main"); if (_levelIndex < main.Levels.Count) { _levelIndex++; main.LoadNextLevel(_levelIndex); } } }