142 lines
4.1 KiB
C#
142 lines
4.1 KiB
C#
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;
|
||
MachineCountersService.RecordFirstMove();
|
||
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);
|
||
}
|
||
}
|