101 lines
2.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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