using CharacterSystem; 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 gm = GameManager.Instance; 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.560f, 0); Vector3 targetUpPosition = new Vector3(0, 1200, 0); CheckResult result; List winningChips; Color orange = new Color(1, 0.537794f, 0, 1f); float TimeRest = 60; bool NeedToPay => !result.Draw; public float timeToExit = 0; public ShowWinnerState() { this.result = gm.lastResult; subState = ShowWinnerSubstates.PanelFalling; } public ShowWinnerState(float timeToExit) { this.timeToExit = timeToExit; subState = ShowWinnerSubstates.ExitByTime; } public void enter() { coinCounter = GameObject.FindAnyObjectByType(); gm.timerManager.StopAllTimers(); InitPanel(); if (gm.gameMode == GameMode.pvp) { if (!result.Draw) { LightUtility.Win(); winningChips = new List(); CollectChipsList(result); if (gm.player1score == 5)//полная победа 1 игрока { //обнулить очки и выдать приз gm.player1score = 0; gm.player2score = 0; //переход в приз } else if (gm.player2score == 5)//полная победа 2 игрока { //обнулить очки и выдать приз gm.player1score = 0; gm.player2score = 0; //переход в приз } } } else if (gm.gameMode == GameMode.pve) { if (!result.Draw) { winningChips = new List(); CollectChipsList(result); if (gm.currentPlayer == Team.Player1)//Последный держал фишку игрок { if (gm.vsBotScore == 5)//5 побед над ботом { gm.vsBotScore = 0; } } } } } public void exit() { if (result.Draw) { 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; //чистимся и топаем дальше в след раунд Board.Instance.MakeClearField(); //Фишка ходит первой если ее не побеждали сегодня еще //текущий бот - последний bool goingToLastBot = CharactersController.CurrentCharacter.CharacterIndex == GameManager.Instance.botsAmount - 1; if (goingToLastBot) { //Вопрос к логике тут. //bool bossUpgraded = GameManager.instance.BossUpgraded; bool bossFirst = SettingsManager.GetString(SettingKey.DIFFICULTY_MODE) != "Прохождение"; Team firstRoundPlayer = bossFirst ? Team.Player2 : Team.Player1; gm.PrepareRound(firstRoundPlayer); return; } else { Team nextPlayer = GameManager.Instance.currentPlayer == Team.Player1 ? Team.Player2 : Team.Player2; gm.PrepareRound(nextPlayer); } } } private void TimerProcessing() { TimeRest -= Time.deltaTime; if (TimeRest < 0) { option = EndOption.Menu; subState = ShowWinnerSubstates.PanelRising; } } private void RaisePanel() { panel.localPosition = Vector3.MoveTowards(panel.localPosition, targetUpPosition, speedY * Time.deltaTime); speedY += acceleration * Time.deltaTime; if (panel.localPosition == targetUpPosition)//панель дошла до верха { if (gm.lastResult != null && !gm.lastResult.Draw) { foreach (SpriteRenderer chip in winningChips) { chip.transform.localScale = Vector3.one; } } switch (option) { case EndOption.Restart://чистим поле и перезапуск. Меняем игрока AvatarEventBus.Instance.OnNewRoundStarted?.Invoke(gm.currentPlayer); Board.Instance.MakeClearField(); Team nextPlayer = gm.currentPlayer == Team.Player1 ? Team.Player2 : Team.Player1; gm.PrepareRound(nextPlayer); break; case EndOption.Menu://чистим поле и переходим в меню с параметром чтобы панельки съехались обратно CharactersController.I.HideCharacter(); DualAvatarController.Instance.HideCharacters(); Board.Instance.MakeClearField(); //GameManager.instance.stateMachine.ChangeState(new MenuState(fromGameplay: true)); GameManager.Instance.GotoMenu(); 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(InSignal.startOnePlayer)) { option = EndOption.Restart; SoundManager.instance.playChoose(); if (NeedToPay) paymentAndRestart(); else restart(); } if (In.GetButtonDown(InSignal.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 price = PaymentSystem.GetRevengePrice(gm.gameMode); if (PaymentSystem.TryPay(price)) { 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; } private void DropPanel() { 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; } } void CollectChipsList(CheckResult result) { if (result.WinningIndexes == null) return; //кто то победил по таймеру foreach (var index in result.WinningIndexes) { //todo: разобраться че это я тут закомментил чтобы избавиться от ошибки //gm.chipTransforms[index.row, index.col].rotation = Quaternion.identity; //var renderer = gm.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; } } }