using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class ShowWinnerState : IState { Color empty = new Color(0, 0, 0, 0); CoinCounter coinCounter; private GameManager gameManager; GameManager GameManager { get { if (gameManager == null) gameManager = GameManager.instance; return gameManager; } } public enum ShowWinnerSubstates { PanelFalling, HandlingInputs, PanelRising, ExitByTime } public ShowWinnerSubstates subState; enum EndOption { Restart, Menu } EndOption option; RectTransform panel; Image left, right; float speedY = 0; float acceleration = 500; Vector3 targetDownPosition = new Vector3(0, 447.56f, 0); Vector3 targetUpPosition = new Vector3(0, 1200, 0); CheckResult result; List winningChips; Color orange = new Color(1, 0.537794f, 0, 1f); Color blue = new Color(0, 0.7181487f, 1, 0.5f); TextMeshProUGUI TimerLabel; TextMeshProUGUI ToMenuLabel; float TimeRest = 60; bool NeedToPay => !result.Draw; public float timeToExit = 0; public ShowWinnerState() { this.result = GameManager.lastResult; subState = ShowWinnerSubstates.PanelFalling; GameManager.instance.ToMenuLabel.gameObject.SetActive(true); } public ShowWinnerState(float timeToExit) { this.timeToExit = timeToExit; subState = ShowWinnerSubstates.ExitByTime; } public void enter() { coinCounter = GameObject.FindAnyObjectByType(); ToMenuLabel = GameManager.ToMenuLabel; TimerLabel = GameManager.TimerLabel; //таймер GameManager.timerManager.StopAllTimers(); panel = GameManager.EngamePanel; left = GameManager.ReplayButton; right = GameManager.MenuButton; InitPanel(); if (result.Draw) { GameManager.DrawVisual.Show(); } if (GameManager.gameMode == GameMode.pvp) { if (!result.Draw) { LightUtility.Win(); winningChips = new List(); CollectChipsList(result); if (GameManager.player1score == 5)//полная победа 1 игрока { //обнулить очки и выдать приз GameManager.player1score = 0; GameManager.player2score = 0; //переход в приз } else if (GameManager.player2score == 5)//полная победа 2 игрока { //обнулить очки и выдать приз GameManager.player1score = 0; GameManager.player2score = 0; //переход в приз } } } else if (GameManager.gameMode == GameMode.pve) { if (!result.Draw) { winningChips = new List(); CollectChipsList(result); if (GameManager.currentPlayer == CellState.Player1)//Последный держал фишку игрок { if (GameManager.vsBotScore == 5)//5 побед над ботом { GameManager.vsBotScore = 0; } } } } } public void exit() { ToMenuLabel.gameObject.SetActive(false); if (result.Draw) { GameManager.DrawVisual.Hide(); return; } //вернуть альфу фишкам foreach (SpriteRenderer chip in winningChips) { Color c = chip.color; c.a = 1; chip.color = c; MonoBehaviour.Destroy(chip.GetComponent()); chip.transform.rotation = Quaternion.identity; } } public void update() { switch (subState) { case ShowWinnerSubstates.PanelFalling: DropPanel(); break; case ShowWinnerSubstates.HandlingInputs: PollingInputs(); TimerProcessing(); break; case ShowWinnerSubstates.PanelRising: RaisePanel(); break; case ShowWinnerSubstates.ExitByTime: ExitByTime(); break; } if (!result.Draw) BlinkChips(); } private void ExitByTime() { timeToExit -= Time.deltaTime; if (timeToExit < 0) { timeToExit = 0; //чистимся и топаем дальше в след раунд FieldCleaner.Clear(); //Фишка ходит первой если ее не побеждали сегодня еще //текущий бот - последний bool goingToLastBot = DifficultyManager.Instance.currentOpponent == GameManager.instance.botsAmount - 1; if (goingToLastBot) { //Вопрос к логике тут. //bool bossUpgraded = GameManager.instance.BossUpgraded; bool bossFirst = SettingsManager.GetString("BaseBotDifficulty", "Фиксированная") != "Обычная"; CellState firstRoundPlayer = bossFirst ? CellState.Player2 : CellState.Player1; GameManager.instance.stateMachine.ChangeState(new StartRoundState(firstPlayer: firstRoundPlayer)); return; } else { CellState nextPlayer = GameManager.instance.currentPlayer == CellState.Player1 ? CellState.Player2 : CellState.Player2; GameManager.instance.stateMachine.ChangeState(new StartRoundState(firstPlayer: nextPlayer)); } } } private void TimerProcessing() { TimeRest -= Time.deltaTime; if (TimeRest < 0) { option = EndOption.Menu; subState = ShowWinnerSubstates.PanelRising; } TimerLabel.text = getTimeText(); } string getTimeText() { string minutes = ((int)(TimeRest / 60)).ToString(); string seconds = ((int)(TimeRest % 60)).ToString(); if (minutes.Length < 2) minutes = "0" + minutes; if (seconds.Length < 2) seconds = "0" + seconds; string result = minutes + ":" + seconds; return result; } private void RaisePanel() { coinCounter?.SetRevengePriceVisibility(false); //coinCounter = null; panel.localPosition = Vector3.MoveTowards(panel.localPosition, targetUpPosition, speedY * Time.deltaTime); speedY += acceleration * Time.deltaTime; if (panel.localPosition == targetUpPosition)//панель дошла до верха { if (GameManager.lastResult != null && !GameManager.lastResult.Draw) { foreach (SpriteRenderer chip in winningChips) { chip.transform.localScale = Vector3.one; } } switch (option) { case EndOption.Restart://чистим поле и перезапуск. Меняем игрока AvatarEventBus.Instance.OnNewRoundStarted?.Invoke(GameManager.currentPlayer); FieldCleaner.Clear(); CellState nextPlayer = GameManager.currentPlayer == CellState.Player1 ? CellState.Player2 : CellState.Player1; GameManager.stateMachine.ChangeState(new StartRoundState(nextPlayer)); break; case EndOption.Menu://чистим поле и переходим в меню с параметром чтобы панельки съехались обратно CharacterController.HideCharacter(); DualAvatarController.Instance.HideCharacters(); FieldCleaner.Clear(); //GameManager.instance.stateMachine.ChangeState(new MenuState(fromGameplay: true)); GameManager.instance.stateMachine.ChangeState(new MenuState()); break; } } } private void PollingInputs() { if (In.GetButtonDownAnyPlayer(PlayerAction.right)) { SoundManager.instance.playSwitch(); option = EndOption.Menu; right.transform.GetChild(0).GetComponent().color = orange; left.transform.GetChild(0).GetComponent().color = empty; } if (In.GetButtonDownAnyPlayer(PlayerAction.left)) { SoundManager.instance.playSwitch(); option = EndOption.Restart; right.transform.GetChild(0).GetComponent().color = empty; left.transform.GetChild(0).GetComponent().color = orange; } if (In.GetButtonDown(ButtonPinMapping.startOnePlayer)) { option = EndOption.Restart; SoundManager.instance.playChoose(); if (NeedToPay) paymentAndRestart(); else restart(); } if (In.GetButtonDown(ButtonPinMapping.startTwoPlayers)) { option = EndOption.Menu; SoundManager.instance.playChoose(); subState = ShowWinnerSubstates.PanelRising; } if (In.GetButtonDownAnyPlayer(PlayerAction.down)) { SoundManager.instance.playChoose(); if (option == EndOption.Restart) { if (NeedToPay) paymentAndRestart(); else restart(); } else { subState = ShowWinnerSubstates.PanelRising; } } void paymentAndRestart() { int creditsPrice = gameManager.gameMode == GameMode.pve ? PaymentSystem.PriceRevenge : PaymentSystem.PricePvp; if (PaymentSystem.TryPay(creditsPrice)) { subState = ShowWinnerSubstates.PanelRising; } } void restart() { subState = ShowWinnerSubstates.PanelRising; } } void InitPanel() { option = EndOption.Restart; left.transform.GetChild(0).GetComponent().color = orange; right.transform.GetChild(0).GetComponent().color = empty; GameManager.RestartButton.text = NeedToPay ? "Еще раз!" : "Продолжить!"; } private void DropPanel() { panel = GameManager.EngamePanel; panel.transform.localPosition = Vector3.MoveTowards(panel.transform.localPosition, targetDownPosition, speedY * Time.deltaTime); speedY += acceleration * Time.deltaTime; if (panel.localPosition == targetDownPosition) { speedY = 0; subState = ShowWinnerSubstates.HandlingInputs; //revengeprice if (gameManager.gameMode == GameMode.pve) coinCounter?.SetRevengePriceVisibility(true); } } void CollectChipsList(CheckResult result) { if (result.WinningIndexes == null) return; //кто то победил по таймеру foreach (var index in result.WinningIndexes) { GameManager.chipTransforms[index.row, index.col].rotation = Quaternion.identity; var renderer = GameManager.chipTransforms[index.row, index.col].GetChild(0).GetComponent(); winningChips.Add(renderer); renderer.gameObject.AddComponent().speed = 8; } } void BlinkChips() { foreach (SpriteRenderer chip in winningChips) { Color c = chip.color; c.a = 0.2f + Mathf.PingPong(Time.time * 2, 0.8f); chip.color = c; } } }