401 lines
12 KiB
C#
401 lines
12 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 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<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;
|
||
|
||
|
||
|
||
public ShowWinnerState(CheckResult result)
|
||
{
|
||
this.result = result;
|
||
}
|
||
|
||
public void enter()
|
||
{
|
||
coinCounter = GameObject.FindAnyObjectByType<CoinCounter>();
|
||
ToMenuLabel = GameManager.ToMenuLabel;
|
||
TimerLabel = GameManager.TimerLabel;
|
||
|
||
if (subState != ShowWinnerSubstates.ExitByTime)
|
||
{
|
||
subState = ShowWinnerSubstates.PanelFalling;
|
||
ToMenuLabel.gameObject.SetActive(true);
|
||
}
|
||
|
||
//таймер
|
||
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;
|
||
}
|
||
}
|
||
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<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();
|
||
}
|
||
|
||
public float timeRest = 0;
|
||
private void ExitByTime()
|
||
{
|
||
timeRest -= Time.deltaTime;
|
||
if (timeRest < 0)
|
||
{
|
||
timeRest = 0;
|
||
|
||
//чистимся и топаем дальше в след раунд
|
||
if (GameManager.currentPlayer == CellState.Player1)
|
||
{
|
||
FieldCleaner.Clear(false, CellState.Player2);
|
||
|
||
}
|
||
else
|
||
FieldCleaner.Clear(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);
|
||
FieldCleaner.Clear(false, CellState.Player2);
|
||
}
|
||
else
|
||
{
|
||
AvatarEventBus.Instance.OnNewRoundStarted?.Invoke(CellState.Player2);
|
||
FieldCleaner.Clear(false, CellState.Player1);
|
||
}
|
||
break;
|
||
case EndOption.Menu://чистим поле и переходим в меню с параметром чтобы панельки съехались обратно
|
||
CharacterController.HideCharacter();
|
||
DualAvatarController.Instance.HideCharacters();
|
||
FieldCleaner.Clear(true, CellState.Player1);
|
||
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()
|
||
{
|
||
//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 (SingleWallet.Pay(creditsPrice))
|
||
{
|
||
subState = ShowWinnerSubstates.PanelRising;
|
||
}
|
||
else
|
||
{
|
||
GameManager.OnNoMoney?.Invoke();
|
||
}
|
||
}
|
||
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;
|
||
|
||
|
||
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.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;
|
||
}
|
||
}
|
||
}
|