using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScripting; 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, 485, 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; public ShowWinnerState(CheckResult result) { this.result = result; } public void enter() { coinCounter = GameObject.FindAnyObjectByType(); ToMenuLabel = GameManager.ToMenuLabel; TimerLabel = GameManager.TimerLabel; if (subState != ShowWinnerSubstates.ExitByTime) { subState = ShowWinnerSubstates.PanelFalling; ToMenuLabel.gameObject.SetActive(true); } //общее для всех режимов //coinPanel = GameManager.coinPanel; //таймер 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; } } else//Последный держал фишку бот { //эффект победы бота gameManager.effect.PlayEffect(CharacterController.CurrentCharacter); } } } } 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(); } public float timeRest = 0; private void ExitByTime() { timeRest -= Time.deltaTime; if (timeRest < 0) { timeRest = 0; //чистимся и топаем дальше в след раунд if (GameManager.currentPlayer == CellState.Player1) GameManager.stateMachine.ChangeState(new ClearFieldState(false, CellState.Player2)); else GameManager.stateMachine.ChangeState(new ClearFieldState(false, CellState.Player1)); } } 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://чистим поле и перезапуск. Меняем игрока if (GameManager.currentPlayer == CellState.Player1) { AvatarEventBus.Instance.OnNewRoundStarted?.Invoke(CellState.Player1); GameManager.stateMachine.ChangeState(new ClearFieldState(false, CellState.Player2)); } else { AvatarEventBus.Instance.OnNewRoundStarted?.Invoke(CellState.Player2); GameManager.stateMachine.ChangeState(new ClearFieldState(false, CellState.Player1)); } break; case EndOption.Menu://чистим поле и переходим в меню с параметром чтобы панельки съехались обратно CharacterController.HideCharacter(); DualAvatarController.Instance.HideCharacters(); GameManager.stateMachine.ChangeState(new ClearFieldState(true, CellState.Player1)); 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() { //revengeprice //int creditsPrice = gameManager.gameMode == GameMode.pve ? PlayerPrefs.GetInt("PricePVE", 1) : PlayerPrefs.GetInt("PricePVP", 1); int creditsPrice = gameManager.gameMode == GameMode.pve ? PlayerPrefs.GetInt("PriceRevenge", 10) : PlayerPrefs.GetInt("PricePVP", 10); if (ComWrapper.Pay(creditsPrice)) { subState = ShowWinnerSubstates.PanelRising; } else { GameManager.OnNoMoney?.Invoke(); } } void restart() { subState = ShowWinnerSubstates.PanelRising; } } void InitPanel() { option = EndOption.Restart; left.transform.GetChild(0).GetComponent().color = orange; right.transform.GetChild(0).GetComponent().color = empty; needToPay = true; //pvp платим //играли с ботом и проиграли if (GameManager.gameMode == GameMode.pve && GameManager.currentPlayer==CellState.Player2) { //needToPay = gameManager.currentPlayer == CellState.Player2;//партию завершил бот(победил) - платим needToPay = true; } 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.indexesRow == null) return; //кто то победил по таймеру for (int i = 0; i < 4; i++) { int row = result.indexesRow[i]; int col = result.indexesColumn[i]; GameManager.chipTransforms[row, col].rotation = Quaternion.identity; winningChips.Add(GameManager.chipTransforms[row, col].GetChild(0) .GetComponent()); winningChips[i].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; } } /*Vector3 sCoin = new Vector3(0, -1.93f, 0), eCoin = new Vector3(-8.964f, 3.6f, 0); IEnumerator CoinToSide() { float parametr = 0; while (parametr <= 1) { GameManager.coinPanel.localPosition = Vector3.Lerp(sCoin, eCoin, parametr); parametr += Time.deltaTime * 2; yield return null; } } IEnumerator CoinToCenter() { float parametr = 0; while (parametr < 1) { GameManager.coinPanel.localPosition = Vector3.Lerp(eCoin, sCoin, parametr); parametr += Time.deltaTime; yield return null; } GameManager.coinPanel.localPosition = sCoin; }*/ }