337 lines
10 KiB
C#
337 lines
10 KiB
C#
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<SpriteRenderer> 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<CoinCounter>();
|
||
gm.timerManager.StopAllTimers();
|
||
|
||
InitPanel();
|
||
if (gm.gameMode == GameMode.pvp)
|
||
{
|
||
if (!result.Draw)
|
||
{
|
||
LightUtility.Win();
|
||
winningChips = new List<SpriteRenderer>();
|
||
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<SpriteRenderer>();
|
||
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<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;
|
||
|
||
//чистимся и топаем дальше в след раунд
|
||
|
||
|
||
Board.Instance.MakeClearField();
|
||
|
||
//Фишка ходит первой если ее не побеждали сегодня еще
|
||
//текущий бот - последний
|
||
bool goingToLastBot = DifficultyManager.Instance.currentOpponent == 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.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<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(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 creditsPrice = gm.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;
|
||
}
|
||
|
||
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<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;
|
||
}
|
||
}
|
||
}
|