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

83 lines
2.7 KiB
C#

using CharacterSystem;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
public class EndGameHandler : MonoBehaviour
{
[SerializeField, FormerlySerializedAs("winPanel")] private PveWinPanel _winPanel;
[SerializeField, FormerlySerializedAs("lossPanel")] private PveLossPanel _lossPanel;
[SerializeField, FormerlySerializedAs("pvpWinPanel")] private PvpWinPanel _pvpWinPanel;
[SerializeField, FormerlySerializedAs("drawPanel")] private PveLossPanel _drawPanel;
public void HandleEndGame(Team lastPlayer, GameMode gameMode, CheckResult lastResult)
{
Debug.Log("Конец игры");
GameManager.Instance.turnTracker.EnableTimer(false);
if (lastResult.Draw)
DrawHandler(gameMode);
else
WinHandler(lastPlayer, gameMode, lastResult.WinningIndexes);
}
private void DrawHandler(GameMode gameMode)
{
if (gameMode == GameMode.pve)
{
EventBus.TriggerEvent(GameEvent.Draw);
_drawPanel.Open(GameManager.Instance.ContinueAfterPveDraw);
}
else
{
GameManager gameManager = GameManager.Instance;
_pvpWinPanel.Open(
Team.None,
false,
gameManager.player1score,
gameManager.player2score,
gameManager.ContinueAfterPvpRound);
}
}
private void WinHandler(Team winner, GameMode gameMode, HashSet<(int row, int col)> winChipsCoords)
{
Debug.Log($"Победа {winner}; Режим {gameMode}");
PlayWinChipsAnimation(winChipsCoords);
if (gameMode == GameMode.pve)
{
if (winner == Team.Player1)
{
EventBus.TriggerEvent(GameEvent.PlayerWin);
_winPanel.Open();
}
else
{
EventBus.TriggerEvent(GameEvent.BotWin);
_lossPanel.Open(GameManager.Instance.ContinueAfterPveLoss);
}
}
else
{
GameManager gameManager = GameManager.Instance;
gameManager.IncreaseScore(winner);
bool isMatchWin = gameManager.HasPvpMatchWinner(winner);
_pvpWinPanel.Open(
winner,
isMatchWin,
gameManager.player1score,
gameManager.player2score,
isMatchWin ? gameManager.RestartPvpMatch : gameManager.ContinueAfterPvpRound);
}
}
private void PlayWinChipsAnimation(HashSet<(int row, int col)> winChipsCoords)
{
Chip[,] grid = Board.Instance.Grid;
foreach ((int row, int col) winCoord in winChipsCoords)
grid[winCoord.col, winCoord.row].WinAnimation();
}
}