diff --git a/Scripts/Logic/World.cs b/Scripts/Logic/World.cs index cbf8b80..f9e8da3 100644 --- a/Scripts/Logic/World.cs +++ b/Scripts/Logic/World.cs @@ -4,152 +4,172 @@ namespace AceField.Scripts.Logic; public partial class World : Node2D { - [Export] public Scoreboard Scoreboard; - [Export] public PackedScene PlayerScene; + [Export] public Scoreboard Scoreboard; + [Export] public PackedScene PlayerScene; - [Export] public int RoundCount = 1; - [Export] public int RoundTotalCount = 20; - [Export] public double RoundDuration = 60; - [Export] public double RoundProgress; - [Export] public double RoundTimeLeft; + [Export] public int RoundCount = 1; + [Export] public int RoundTotalCount = 20; + [Export] public double RoundDuration = 60; + [Export] public double RoundProgress; + [Export] public double RoundTimeLeft; - private Timer _roundTimer; + private Timer _roundTimer; - public void StartGame(string currentPlayerName = null) - { - if (!Multiplayer.IsServer()) - return; + public void StartGame(string currentPlayerName = null) + { + if (!Multiplayer.IsServer()) + return; - _roundTimer = new Timer(); - _roundTimer.WaitTime = RoundDuration; - _roundTimer.Autostart = true; - _roundTimer.Timeout += NewRound; - _roundTimer.OneShot = true; - AddChild(_roundTimer); - _roundTimer.Start(); + _roundTimer = new Timer(); + _roundTimer.WaitTime = RoundDuration; + _roundTimer.Autostart = true; + _roundTimer.Timeout += NewRound; + _roundTimer.OneShot = true; + GetParent().AddChild(_roundTimer); + _roundTimer.Start(RoundDuration); - // Add players into the game - PutPlayers(currentPlayerName); - } + // Add players into the game + PutPlayers(currentPlayerName); + } - public override void _Ready() - { - if (!Multiplayer.IsServer()) - return; + public override void _Ready() + { + if (!Multiplayer.IsServer()) + return; - // Handling player connect / disconnect after this client connected - Multiplayer.PeerDisconnected += RemovePlayer_Adaptor; - Multiplayer.PeerConnected += AddPlayer_Adaptor; + // Handling player connect / disconnect after this client connected + Multiplayer.PeerDisconnected += RemovePlayer_Adaptor; + Multiplayer.PeerConnected += AddPlayer_Adaptor; - // Handling player connected before this client - foreach (var id in Multiplayer.GetPeers()) - Scoreboard.AddPlayer(id); + // Handling player connected before this client + foreach (var id in Multiplayer.GetPeers()) + Scoreboard.AddPlayer(id); - // Add this client as a player if client isn't a dedicated server - if (!OS.HasFeature("dedicated_server")) - Scoreboard.AddPlayer(1); - } + // Add this client as a player if client isn't a dedicated server + if (!OS.HasFeature("dedicated_server")) + Scoreboard.AddPlayer(1); + } - public override void _ExitTree() - { - if (!Multiplayer.IsServer()) - return; + public override void _ExitTree() + { + if (!Multiplayer.IsServer()) + return; - Multiplayer.PeerDisconnected -= RemovePlayer_Adaptor; - Multiplayer.PeerConnected -= AddPlayer_Adaptor; - } + Multiplayer.PeerDisconnected -= RemovePlayer_Adaptor; + Multiplayer.PeerConnected -= AddPlayer_Adaptor; + } - public override void _Process(double delta) - { - if (Multiplayer.IsServer()) - { - RoundProgress = _roundTimer.TimeLeft / _roundTimer.WaitTime; - RoundTimeLeft = _roundTimer.TimeLeft; - } - } + public override void _Process(double delta) + { + if (Multiplayer.IsServer()) + { + RoundProgress = _roundTimer.TimeLeft / _roundTimer.WaitTime; + RoundTimeLeft = _roundTimer.TimeLeft; + } + } - private static string BuildPlayerName(int id) - => $"Player@{id}"; + private static string BuildPlayerName(int id) + => $"Player@{id}"; - private void AddPlayer_Adaptor(long id) - => Scoreboard.AddPlayer((int)id); + private void AddPlayer_Adaptor(long id) + => Scoreboard.AddPlayer((int)id); - private void RemovePlayer_Adaptor(long id) - => Scoreboard.RemovePlayer((int)id); + private void RemovePlayer_Adaptor(long id) + => Scoreboard.RemovePlayer((int)id); - private void SpawnPlayer(int id, string name = null) - { - var player = PlayerScene.Instantiate(); - player.PlayerId = id; - player.Position = new Vector2(GD.RandRange(-100, 100), GD.RandRange(-100, 100)); - player.Name = BuildPlayerName(id); - player.PlayerDied += (killerId) => - { - if (killerId == 0) return; - Scoreboard.AddScore(killerId); - }; + private void SpawnPlayer(int id, string name = null) + { + var player = PlayerScene.Instantiate(); + player.PlayerId = id; + player.Position = new Vector2(GD.RandRange(-100, 100), GD.RandRange(-100, 100)); + player.Name = BuildPlayerName(id); + player.PlayerDied += (killerId) => + { + if (killerId == 0) return; + Scoreboard.AddScore(killerId); + if (CountPlayer() <= 2) + _roundTimer.Start(3); + }; - AddChild(player, true); - player.PlayerName = name; - } + AddChild(player, true); + player.PlayerName = name; + } - private void PutPlayers(string currentPlayerName = null) - { - // Spawn clients - foreach (var id in Multiplayer.GetPeers()) - SpawnPlayer(id, Scoreboard.Players[id]?.Name); + private void PutPlayers(string currentPlayerName = null) + { + // Spawn clients + foreach (var id in Multiplayer.GetPeers()) + SpawnPlayer(id, Scoreboard.Players[id]?.Name); - // Spawn host - if (!OS.HasFeature("dedicated_server")) - SpawnPlayer(1, currentPlayerName ?? Scoreboard.Players[1]?.Name); - } + // Spawn host + if (!OS.HasFeature("dedicated_server")) + SpawnPlayer(1, currentPlayerName ?? Scoreboard.Players[1]?.Name); + } - private void NewRound() - { - if (RoundCount >= RoundTotalCount) - { - Rpc(nameof(EndGame)); - return; - } - - RoundCount++; - foreach (var child in GetChildren()) - { - if (child is not Timer) - child.QueueFree(); - } + private void NewRound() + { + if (RoundCount >= RoundTotalCount) + { + Rpc(nameof(EndGame)); + return; + } - PutPlayers(); - _roundTimer.Start(); - } + RoundCount++; + Rpc(nameof(CleanWorld)); - public Player GetCurrentPlayer() - { - foreach (var child in GetChildren()) - { - if (child is Player { IsCurrentPlayer: true } player) - return player; - } + PutPlayers(); + _roundTimer.Start(RoundDuration); + } - return null; - } + public Player GetCurrentPlayer() + { + foreach (var child in GetChildren()) + { + if (child is Player { IsCurrentPlayer: true } player) + return player; + } - public T GetTileByPosition(Vector2 position) where T : Node2D - { - foreach (var item in GetChildren()) - { - if (item is T tile && tile.Position == position) - return tile; - } + return null; + } - return null; - } + public int CountPlayer() + { + var count = 0; + foreach (var child in GetChildren()) + { + if (child is Player) + count++; + } - [Rpc(MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)] - private void EndGame() - { - GetParent().GetNode("OverlayLayer/Hud").Hide(); - GetParent().GetNode("OverlayLayer/GameOverScreen").Show(); - GetTree().Paused = true; - } -} + return count; + } + + public T GetTileByPosition(Vector2 position) where T : Node2D + { + foreach (var item in GetChildren()) + { + if (item is T tile && tile.Position == position) + return tile; + } + + return null; + } + + + [Rpc(MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)] + private void CleanWorld() + { + foreach (var child in GetChildren()) + { + child.QueueFree(); + } + } + + [Rpc(MultiplayerApi.RpcMode.AnyPeer, CallLocal = true)] + private void EndGame() + { + GetParent().GetNode("OverlayLayer/Hud").Hide(); + GetParent().GetNode("OverlayLayer/GameOverScreen").Show(); + GetTree().Paused = true; + } +} \ No newline at end of file