using System; using UnityEngine; public class TurnManager : MonoBehaviour {//todo: добавить отслеживание по таймеру [Header("Players")] [SerializeField] private Player player1; [SerializeField] private Player player2; [SerializeField] private Bot bot; [Header("Settings")] [SerializeField] private GameMode gameMode; private IGamePlayer currentPlayer; private bool isGameOver = false; public void StartGame(GameMode mode) { gameMode = mode; isGameOver = false; SetupPlayers(); StartTurn(currentPlayer); } private void SetupPlayers() { // Всегда начинаем с первого игрока currentPlayer = player1; } private void StartTurn(IGamePlayer player) { if (isGameOver) return; // Отписываемся, чтобы избежать дублирования подписок player.OnChipDropped -= OnTurnCompleted; player.OnChipDropped += OnTurnCompleted; player.PrepareChip(); ControlsPerformer.Instance.SetControlable(player); currentPlayer = player; } private void OnTurnCompleted(int column, int row) { // Отписываемся от события текущего игрока currentPlayer.OnChipDropped -= OnTurnCompleted; if (CheckGameOver(column, row)) { OnGameOver(); return; } NextTurn(); } private void NextTurn() { // Отключаем текущего игрока currentPlayer.Sleep(); // Определяем следующего игрока в зависимости от режима IGamePlayer nextPlayer; if (gameMode == GameMode.pve) { nextPlayer = (currentPlayer == player1) ? (IGamePlayer)bot : player1; } else // pvp { nextPlayer = (currentPlayer == player1) ? (IGamePlayer)player2 : player1; } currentPlayer = nextPlayer; StartTurn(currentPlayer); } private bool CheckGameOver(int column, int row) { if(currentPlayer is BasePlayer player) { var checkResult = FieldChecker.Check(player.team, row, column); return checkResult.End; } else { throw new Exception($"Не удалось привести {currentPlayer}"); } } private void OnGameOver() { isGameOver = true; currentPlayer.Sleep(); ControlsPerformer.Instance.SetControlable(null); Team lastPlayerTeam = ((BasePlayer)currentPlayer).team; var result = FieldChecker.lastResult; GameManager.Instance.endGameHandler.HandleEndGame(lastPlayerTeam, gameMode, result); } }