170 lines
5.1 KiB
C#

using CharacterSystem;
using PrizeSystem;
using UnityEngine;
public static class StateRouter
{
private static GameManager gm => GameManager.Instance;
public static void RouteAfterTurn()
{
//var checkResult = FieldChecker.Check(GameManager.instance.currentPlayer);
CheckResult checkResult = null;
gm.lastResult = checkResult;//это неправильно. Нужно при проверке записывать в поле.
TurnEndingResult turnResult = EndOfTurnHandler.Evaluate(checkResult, gm.gameMode, gm.currentPlayer);
if(turnResult == TurnEndingResult.GameContinues)
{
gm.DetermineNextTurn();
return;
}
IState nextState = turnResult switch
{
TurnEndingResult.BotWin => BotWinHandler(),
TurnEndingResult.PlayerWinPve => PlayerWinPveHandler(),
TurnEndingResult.PlayerWinPvp => PlayerWinPvpHandler(gm.currentPlayer),
TurnEndingResult.Draw => DrawHandler(),
_ => ToMenu()
};
gm.stateMachine.ChangeState(nextState);
}
private static IState BotWinHandler()
{
LightUtility.Lose();
CharactersController.CurrentCharacter.GetComponent<Animator>().SetTrigger("Win");
CharactersController.CurrentCharacter.difficultyModule.DecreaseDifficulty();
if (gm.vsBotScore != 0)
gm.vsBotScore -= 1;
EventBus.TriggerEvent(GameEvent.BotWin);
//gm.botScale.SetMedalsCount(gm.vsBotScore);
return new ShowWinnerState();
}
private static IState PlayerWinPveHandler() //тут нужна обертка в приз + обертка в приз/супер приз
{
bool prizing = SettingsManager.GetBool(SettingKey.PRIZING);
if (!prizing) return NextBot();
bool takeOrRisk = SettingsManager.GetBool(SettingKey.TAKE_OR_RISK);
if (!takeOrRisk)
{
TryGivePrize();
return NextBot();
}
//todo: Разобраться в этой дичи
//var character = CharactersController.CurrentCharacter;
//var currentPrize = character.prizeModule;
//bool currentBotHasNonEmptyPrize = character.prizeModule.HasPrize && currentPrize is not EmptyPrize;
//if(character.prizeModule.TryFetchIfTypeMatch(out VitrinaPrize vitrinaPrize))
//{
// int[] readyBoxes = PrizeStandController.GetReadyBoxes();
// if (VitrinaPanel.FindIntersection(readyBoxes, vitrinaPrize.Boxes).Length == 0)
// {
// currentBotHasNonEmptyPrize = false;
// }
//}
//if (!currentBotHasNonEmptyPrize) return NextBot();
return NextBot();
//var nextPrize = PrizeSystemManager.GetFirstNonEmptyPrizeAfter(currentPrize);
//if (nextPrize != null)
//{
// gm.takeOrRiskPanel.SetPrizes(currentPrize, nextPrize);
// gm.timerManager.StopAllTimers();
// return new TakeOrRiskState(NextBot(), gm.takeOrRiskPanel);
//}
//else
//{
// return NextBot();
//}
void TryGivePrize()
{
if (CharactersController.CurrentCharacter.prizeModule.TryFetchPrize(out Prize prize))
{
PrizeSystemManager.GivePrize(prize);
}
}
}
public static IState NextBot()
{
CharactersController.CurrentCharacter.difficultyModule.IncreaseDifficulty();
gm.vsBotScore += 1;
EventBus.TriggerEvent(GameEvent.PlayerWin);
LightUtility.Win();
//gm.botScale.SetMedalsCount(gm.vsBotScore);
//если фишку победили, то повышаем.
if (gm.vsBotScore == gm.botsAmount)
GameManager.Instance.upgradeFeeshkaDifficulty();
if (TotalWin())
{
//ClearAllScales();
return new VictoryState();
}
else
{
return new PrizeState(CreateAutoTransitionState(2f));
}
}
private static IState PlayerWinPvpHandler(Team winner)
{
gm.IncreaseScore(winner);
if (TotalWin())
AvatarEventBus.Instance.OnEndGame?.Invoke(gm.currentPlayer);
else
AvatarEventBus.Instance.OnEndRound?.Invoke(gm.currentPlayer);
if (TotalWin())
{
//ClearAllScales();
return new VictoryState();
}
else
{
return new ShowWinnerState();
}
}
private static IState DrawHandler()
{
EventBus.TriggerEvent(GameEvent.Draw);
return new ShowWinnerState();
}
public static IState ToMenu()
{
Board.Instance.MakeClearField();
GameManager.Instance.GotoMenu();
return null;//
}
// Helpers
private static ShowWinnerState CreateAutoTransitionState(float time)
{
var state = new ShowWinnerState();
state.subState = ShowWinnerState.ShowWinnerSubstates.ExitByTime;
state.timeToExit = time;
return state;
}
private static bool TotalWin() =>
gm.player1score == 5 || gm.player2score == 5 || gm.vsBotScore == gm.botsAmount;
}