chip-gameV3/Assets/Scripts/GameFSM/ShowWinnerState.cs
2026-07-14 11:14:13 +03:00

389 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SpriteRenderer> 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<CoinCounter>();
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<SpriteRenderer>();
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<SpriteRenderer>();
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<SinRotator>());
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<Image>().color = orange;
left.transform.GetChild(0).GetComponent<Image>().color = empty;
}
if (In.GetButtonDownAnyPlayer(PlayerAction.left))
{
SoundManager.instance.playSwitch();
option = EndOption.Restart;
right.transform.GetChild(0).GetComponent<Image>().color = empty;
left.transform.GetChild(0).GetComponent<Image>().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<Image>().color = orange;
right.transform.GetChild(0).GetComponent<Image>().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<SpriteRenderer>();
winningChips.Add(renderer);
renderer.gameObject.AddComponent<SinRotator>().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;
}
}
}