101 lines
2.8 KiB
C#
101 lines
2.8 KiB
C#
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);
|
||
}
|
||
} |