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