using CharacterSystem; using System; using UnityEngine; using UnityEngine.Serialization; public class TurnManager : MonoBehaviour { [Header("Players")] [SerializeField, FormerlySerializedAs("player1")] private Player _player1; [SerializeField, FormerlySerializedAs("player2")] private Player _player2; [SerializeField, FormerlySerializedAs("bot")] private Bot _bot; [Header("Settings")] [SerializeField, FormerlySerializedAs("gameMode")] private GameMode _gameMode; private IGamePlayer _currentPlayer; private bool _isGameOver; public void StartGame(GameMode mode) { _gameMode = mode; _isGameOver = false; SetupPlayers(); StartTurn(_currentPlayer); } public void CancelPlayerPreparation() { _player1.OnMoveCommitted -= OnPlayerMoveCommitted; _player1.OnThinkingStarted -= OnPlayerThinkingStarted; _player1.OnChipDropped -= OnTurnCompleted; _player1.ReturnPreparedChipToPool(); } private void SetupPlayers() => _currentPlayer = _player1; private void StartTurn(IGamePlayer player) { if (_isGameOver) return; bool isPlayerOneTurn = player == _player1; if (isPlayerOneTurn) { _player1.OnMoveCommitted -= OnPlayerMoveCommitted; _player1.OnMoveCommitted += OnPlayerMoveCommitted; _player1.OnThinkingStarted -= OnPlayerThinkingStarted; _player1.OnThinkingStarted += OnPlayerThinkingStarted; } if (_gameMode == GameMode.pve) { GameManager.Instance.turnTracker.EnableTimer(false); } player.OnChipDropped -= OnTurnCompleted; player.OnChipDropped += OnTurnCompleted; player.PrepareChip(); ControlsPerformer.Instance.SetControlable(player); _currentPlayer = player; } private void OnTurnCompleted(int column, int row) { IGamePlayer completedPlayer = _currentPlayer; completedPlayer.OnChipDropped -= OnTurnCompleted; if (_gameMode == GameMode.pve && completedPlayer == _player1) EventBus.TriggerEvent(GameEvent.PlayerTurn); if (CheckGameOver(column, row)) { OnGameOver(); return; } NextTurn(); } private void NextTurn() { _currentPlayer.Sleep(); if (_gameMode == GameMode.pve) _currentPlayer = _currentPlayer == _player1 ? (IGamePlayer)_bot : _player1; else _currentPlayer = _currentPlayer == _player1 ? (IGamePlayer)_player2 : _player1; StartTurn(_currentPlayer); if (_gameMode == GameMode.pve && _currentPlayer == _bot) EventBus.TriggerEvent(GameEvent.BotTurn); } private bool CheckGameOver(int column, int row) { if (_currentPlayer is BasePlayer player) { CheckResult checkResult = FieldChecker.Check(player.team, row, column); return checkResult.End; } throw new Exception($"Не удалось привести {_currentPlayer}"); } private void OnGameOver() { _isGameOver = true; _currentPlayer.Sleep(); ControlsPerformer.Instance.SetControlable(null); Team lastPlayerTeam = ((BasePlayer)_currentPlayer).team; CheckResult result = FieldChecker.lastResult; GameManager.Instance.endGameHandler.HandleEndGame(lastPlayerTeam, _gameMode, result); } private void OnPlayerMoveCommitted() { _player1.OnMoveCommitted -= OnPlayerMoveCommitted; GameManager.Instance.DisableEarlyMenuExit(); if (_gameMode == GameMode.pve) { GameManager.Instance.turnTracker.EnableTimer(false); GameManager.Instance.turnTracker.IncrementMoves(); } } private void OnPlayerThinkingStarted() { _player1.OnThinkingStarted -= OnPlayerThinkingStarted; GameManager.Instance.EnableEarlyMenuExit(); if (_gameMode == GameMode.pve) GameManager.Instance.turnTracker.EnableTimer(true); } }