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; private int _characterIndex = 0; [Export] private Array PlayerScenes; public IEnumerable Players = new List(); public override void _Ready() { foreach (var playerScene in PlayerScenes) { var player = playerScene.Instantiate(); Players = Players.Append((Player)player); GD.Print("Players added"); } } public void SetToNextCharacter(Player player) => _characterIndex = (++_characterIndex) % player.PlayableCharacters.Count(); public void SetToPreviousCharacter(Player player) => _characterIndex = _characterIndex == 0 ? player.PlayableCharacters.Count() - 1 : --_characterIndex; public void ResetPlayerPosition(Player player) { player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); } public void OnCharacterSelected(Player player) { GD.Print("Instancing..."); var selectedCharacter = player.PlayableCharacters[_characterIndex].Instantiate(); player.SelectedCharacter = selectedCharacter as Character; GetTree().Root.AddChild(player.SelectedCharacter); player.SpawnPoint.SetPlayerPosition(player.SelectedCharacter); } public void RemoveCharacter(Player player) { player.PlayableCharacters.Remove(player.PlayableCharacters.ElementAt(_characterIndex)); player.SelectedCharacter?.QueueFree(); _characterIndex = 0; if (player.PlayableCharacters.Count() > 0) EmitSignal(SignalName.ReselectCharacter, player); } public void SetGameOver(bool isGameOver) { _gameOver = isGameOver; if (isGameOver) EmitSignal(SignalName.OnGameOver); } public bool IsGameOver => _gameOver; }