chip-game/Assets/Scripts/Gameplay/EndOfTurnHandler.cs

182 lines
5.4 KiB
C#

using PrizeSystem;
using UnityEngine;
public static class EndOfTurnHandler
{
private static GameManager gm;
private static CheckResult result;
public static void NormalHandling()
{
result = GameManager.fieldModel.Check(GameManager.instance.currentPlayer);
gm = GameManager.instance;
gm.lastResult = result;
bool wrapToPrizeState = false;
IState nextState = new ShowWinnerState(result);//âðåìåííî
if (result.End)
{
if (!result.Draw)
{
if (gm.gameMode == GameMode.pvp)
{
PvpEndroundHandler();
}
else if (gm.gameMode == GameMode.pve) //êîíåö ðàóíäà ñ áîòîì
{
PveEndroundHandler();
if (gm.currentPlayer == CellState.Player1)
{//àâòîïåðåõîä íà íåêñò áîòà.
wrapToPrizeState = true;
nextState = CreateAutoTransitionState(result, 4);
}
}
if (TotalWin())
{//êîíåö èãðû - ïðèçîâîå ñîñòîÿíèå
nextState = new VictoryState();
ClearAllScales();
}
}
else if (gm.gameMode == GameMode.pve && result.Draw)
{
CharacterEventBus.Instance.OnDraw?.Invoke();
}
}
else
{
gm.SwitchPlayer();
nextState = new StartTurnState();
}
if(wrapToPrizeState)
nextState = new PrizeState(nextState: nextState);
gm.stateMachine.ChangeState(nextState);
}
private static void PveEndroundHandler()
{
if (gm.currentPlayer == CellState.Player1)
{
PlayerWinHandler();
}
else//Áîò ïîáåäèë
{
BotWinHandler();
}
gm.botScale.SetMedalsCount(gm.vsBotScore);
//åñëè ôèøêó ïîáåäèëè, òî ïîâûøàåì.
if (gm.vsBotScore == gm.botsAmount) gm.upgradeFeeshkaDifficulty();
}
private static void PvpEndroundHandler()
{
CellState winner = gm.currentPlayer;
gm.IncreaseScoreAndScaleOfPlayer(winner);
if (TotalWin())
AvatarEventBus.Instance.OnEndGame?.Invoke(gm.currentPlayer);
else
AvatarEventBus.Instance.OnEndRound?.Invoke(gm.currentPlayer);
}
private static void BotWinHandler()
{
LightUtility.Lose();
CharacterController.CurrentCharacter.GetComponent<Animator>().SetTrigger("Win");
DifficultyManager.instance.DecreaseDifficulty();
if (gm.vsBotScore != 0)
gm.vsBotScore -= 1;
CharacterEventBus.Instance.OnBotWin?.Invoke();
}
private static void PlayerWinHandler()
{
if (CharacterController.CurrentCharacter.HasPrize)
{
PrizeSystemManager.GivePrize(CharacterController.CurrentCharacter.prize);
CharacterController.CurrentCharacter.HasPrize = false;
}
DifficultyManager.instance.IncreaseDifficulty();
gm.vsBotScore += 1;
CharacterEventBus.Instance.OnPlayerWin?.Invoke();
LightUtility.Win();
CharacterController.CurrentCharacter.Animator.SetTrigger("Lose");
}
private static bool TotalWin() =>
gm.player1score == 5 || gm.player2score == 5 || gm.vsBotScore == gm.botsAmount;
private static void ClearAllScales()
{
if (gm.botScale.isActiveAndEnabled) gm.botScale.ClearScale();
if (gm.Player1Scale.isActiveAndEnabled) gm.Player1Scale.ClearScale();
if (gm.Player2Scale.isActiveAndEnabled) gm.Player2Scale.ClearScale();
}
private static ShowWinnerState CreateAutoTransitionState(CheckResult result, float time)
{
var state = new ShowWinnerState(result);
state.subState = ShowWinnerState.ShowWinnerSubstates.ExitByTime;
state.timeRest = time;
return state;
}
public static void WinByTimerHandling()
{
//Ïðè ïîáåäå ïî òàéìåðó:
//PVP ïðîèãðàë òîò, êòî íå óñïåë êèíóòü ôèøêó
//PVE - ïðîãðûâàåò ÷åëîâåê
result = new CheckResult(true, false, null);
IState nextState;
if (gm.gameMode == GameMode.pvp)
{
//p2 íå óñïåë
if (gm.currentPlayer == CellState.Player2)
{
gm.player1score += 1;
gm.Player1Scale.SetMedalsCount(gm.player1score);
}
else//p1 íå óñïåë
{
gm.player2score += 1;
gm.Player2Scale.SetMedalsCount(gm.player2score);
}
}
else if (gm.gameMode == GameMode.pve)//âðåìÿ âûøëî ïðè èãðå ñ áîòîì - áîò ïîáåäèë
{
LightUtility.Lose();
CharacterController.CurrentCharacter.GetComponent<Animator>().SetTrigger("Win");
//ÍÅ ÍÈ×Üß
VictoryScale vsBotScale = gm.botScale;
DifficultyManager.instance.DecreaseDifficulty();
CharacterEventBus.Instance.OnBotWin?.Invoke();
if (gm.vsBotScore != 0) gm.vsBotScore -= 1;
vsBotScale.SetMedalsCount(gm.vsBotScore);
}
nextState = new ShowWinnerState(result);
//êîíåö èãðû - ïðèçîâîå ñîñòîÿíèå
if (TotalWin())
{
nextState = new VictoryState();
ClearAllScales();
}
gm.stateMachine.ChangeState(nextState);
}
}