diff --git a/Scripts/AreaExit.cs b/Scripts/AreaExit.cs index 93f1433..fa9cdcd 100644 --- a/Scripts/AreaExit.cs +++ b/Scripts/AreaExit.cs @@ -24,6 +24,7 @@ public partial class AreaExit : Node3D var main = GetTree().Root.GetNode
("/root/Main"); if (!_gameManager.Players.ElementAt(0).CharactersLeftOnStage.Any()) { + _gameManager.OnLevelClear(); main.LoadNextLevel(_levelIndex); } } diff --git a/Scripts/GameManager.cs b/Scripts/GameManager.cs index 7b386b6..744b625 100644 --- a/Scripts/GameManager.cs +++ b/Scripts/GameManager.cs @@ -11,13 +11,12 @@ public partial class GameManager : Node public delegate void ReselectCharacterEventHandler(Player player); private bool _gameOver = false; - private int _characterIndex = 0; [Export] private Array PlayerScenes; - public Array P1CharactersOut = new Array(); - public Array P2CharactersOut = new Array(); + public Array P1CharactersOut = new Array(); + public Array P2CharactersOut = new Array(); public IEnumerable Players = new List(); @@ -39,25 +38,27 @@ public partial class GameManager : Node public void SetToNextCharacter(Player player) { - _characterIndex = (++_characterIndex) % player.CharactersLeftOnStage.Count(); - GD.Print(player.CharactersLeftOnStage.ElementAt(_characterIndex)); + player._characterIndex = (++player._characterIndex) % player.CharactersLeftOnStage.Count(); + GD.Print(player.CharactersLeftOnStage.ElementAt(player._characterIndex)); } public void SetToPreviousCharacter(Player player) { - _characterIndex = _characterIndex == 0 ? player.CharactersLeftOnStage.Count() - 1 : --_characterIndex; + 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(_characterIndex)); + GD.Print(player.CharactersLeftOnStage.ElementAt(player._characterIndex)); } public void OnCharacterSelected(Player player) { GD.Print("Instancing..."); - var selectedCharacter = player.CharactersLeftOnStage[_characterIndex]; + 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); @@ -65,10 +66,10 @@ public partial class GameManager : Node public void RemoveCharacter(Player player) { - player.CharactersLeftOnStage.Remove(player.CharactersLeftOnStage.ElementAt(_characterIndex)); + player.CharactersLeftOnStage.Remove(player.CharactersLeftOnStage.ElementAt(player._characterIndex)); player.SelectedCharacter?.QueueFree(); - _characterIndex = 0; - if (player.CharactersLeftOnStage.Count() > 0) + player._characterIndex = 0; + if (player.CharactersLeftOnStage.Any()) EmitSignal(SignalName.ReselectCharacter, player); } @@ -77,7 +78,9 @@ public partial class GameManager : Node P1CharactersOut.Add(character); Players.ElementAt(0).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); - _characterIndex = 0; + Players.ElementAt(0)._characterIndex = 0; + if (Players.ElementAt(0).CharactersLeftOnStage.Any()) + EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0)); } public void RemoveCharacterAndAddToExit(Character2 character) @@ -85,7 +88,9 @@ public partial class GameManager : Node P2CharactersOut.Add(character); Players.ElementAt(1).CharactersLeftOnStage.Remove(character); GetTree().Root.RemoveChild(character); - _characterIndex = 0; + Players.ElementAt(1)._characterIndex = 0; + if (Players.ElementAt(1).CharactersLeftOnStage.Any()) + EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(1)); } public void SetGameOver(bool isGameOver) @@ -95,5 +100,19 @@ public partial class GameManager : Node EmitSignal(SignalName.OnGameOver); } + public void OnLevelClear() + { + Players.ElementAt(0).CharactersLeftOnStage.AddRange(P1CharactersOut); + Players.ElementAt(1).CharactersLeftOnStage.AddRange(P2CharactersOut); + + P1CharactersOut.Clear(); + P2CharactersOut.Clear(); + + Players.ElementAt(0)._characterIndex = 0; + Players.ElementAt(1)._characterIndex = 0; + + EmitSignal(SignalName.ReselectCharacter, Players.ElementAt(0)); + } + public bool IsGameOver => _gameOver; } diff --git a/Scripts/Player.cs b/Scripts/Player.cs index 3030011..a100fe2 100644 --- a/Scripts/Player.cs +++ b/Scripts/Player.cs @@ -15,6 +15,8 @@ public partial class Player : Node3D public bool IsSelectingCharacter = false; + public int _characterIndex = 0; + public override void _Ready() { foreach (var character in PlayableCharacterScenes)