sega ebc47a80dd Доработать PvP и ранний выход из игры
Реализовать матч PvP до пяти очков и рабочую панель победы. Исправить возврат подготовленной фишки и оплаты при раннем выходе. Ограничить перемещения фишки бота осмысленными кандидатами.
2026-08-27 11:04:40 +03:00

141 lines
4.0 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 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);
}
}