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); } 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) { 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); } }