chip-game/Assets/Scripts/GameFSM/PositioningState.cs

222 lines
6.7 KiB
C#
Raw 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 System.Collections;
using UnityEngine;
using Unity.VisualScripting;
public class PositioningState : IState
{
GameManager gm;
GameObject chip;
Transform chipPointer;
SpriteRenderer pointerRend;
int index;
int position;
bool canMove;
const int DEFAULT_SPEED = 50;
List<int> validPositions;
public void enter()
{
//DebugWindow.Message("Позиционирование");
gm = GameManager.instance;
CollectValidPositions();
canMove = true;
//получаем ссылку на фишку
chip = gm.currentChip;
int centralIndex = validPositions.Count / 2;
index = centralIndex;
position = validPositions[centralIndex];
gm.currentColumnIndex = validPositions[centralIndex];
//ставим фишку на стартовую точку
//float offsety = 5;
float offsety = gm.startY;
if (gm.gameMode == GameMode.pvp) offsety = gm.startY+5;//повыше
float x = gm.slotLeftTop.position.x + validPositions[index] * gm.stepX;
float y = gm.startY + offsety;
chip.transform.position = new Vector3(x, y, 0);
chip.SetActive(true);
gm.chipYSpeed = 0;
//настройка указателя куда упадет фишка
chipPointer = new GameObject("Pointer").transform;
chipPointer.position = new Vector3(100, 100);
chipPointer.gameObject.SetActive(false);
pointerRend = chipPointer.AddComponent<SpriteRenderer>();
pointerRend.enabled = false;
pointerRend.sprite = gm.chipPointer;
pointerRend.color = gm.currentPlayer == CellState.Player1 ? new Color(1, .5f, 0, 1) : new Color(0, .3f, 1, 1);
pointerRend.sortingLayerName = "Middle";
pointerRend.enabled = true;
//НАДО POINTER ЯРЧЕ!
chipPointer.gameObject.SetActive(true);
}
public void exit()
{
gm.pvpPointer.SetVisibility(false);
gm.StartCoroutine(DestroyPointer());
}
public void update()
{
#region Получение инпутов
bool left = false,
right = false,
action = false;
if (gm.gameMode == GameMode.pvp)
{
left = In.GetButtonDownCurrentPlayer(PlayerAction.left);
right = In.GetButtonDownCurrentPlayer(PlayerAction.right);
action = In.GetButtonDownCurrentPlayer(PlayerAction.down);
}
else if (gm.gameMode == GameMode.pve)
{
left = In.GetButtonDownAnyPlayer(PlayerAction.left);
right = In.GetButtonDownAnyPlayer(PlayerAction.right);
action = In.GetButtonDownAnyPlayer(PlayerAction.down);
gm.vsBotThinkTime += Time.deltaTime;
}
#endregion
#region Обработка left|right
if (canMove)
{
//вычисляем куда двигаться
int direction = 0;
if (left && right)
direction = 0;
else if (left)
direction = -1;
else if (right)
direction = 1;
//если двигаемся
if (direction != 0)
{
index = Mathf.Clamp(index + direction, 0, validPositions.Count - 1);
int prevPos = position;
position = validPositions[index];
int dist = Mathf.Abs(position - prevPos);
gm.chipXSpeed = dist * DEFAULT_SPEED;//скорость зануляется
gm.currentColumnIndex = position;
SoundManager.instance.playSwitch();
}
}
#endregion
float targetX = gm.slotLeftTop.position.x +
gm.currentColumnIndex *
gm.stepX;
float targetY = gm.startY;
Vector2 targetPosition = new Vector2(targetX, targetY);
float speed = DEFAULT_SPEED;
//УКАЗАТЕЛЬ
float pointerY = gm.slotLeftTop.transform.position.y - gm.stepY * GameManager.fieldModel.getHeight(position);
chipPointer.position = new Vector2(targetX, pointerY);
Color color = pointerRend.color;
color.a = 0.8f + Mathf.Sin(Time.time * 7) * 0.2f;
pointerRend.color = color;
if (gm.gameMode == GameMode.pvp)
{
gm.pvpPointer.SetColor(gm.currentPlayer);
gm.pvpPointer.SetVisibility(true);
gm.pvpPointer.MoveTo(targetPosition);
targetPosition += Vector2.up*5;//повыше
}
chip.transform.position = Vector2.MoveTowards(chip.transform.position, targetPosition, speed * Time.deltaTime);
if ((Vector2)chip.transform.position == targetPosition)
canMove = true;
else
canMove = false;
if (action)
{
if (canMove && GameManager.fieldModel.getHeight(gm.currentColumnIndex) != -1)
{
float delayBeforeStartFalling = 0;
if (gm.gameMode == GameMode.pve)
{
gm.vsBotMoves += 1;
}
if (gm.gameMode == GameMode.pvp)
{
AvatarEventBus.Instance.OnTurnEnd?.Invoke(gm.currentPlayer);
delayBeforeStartFalling = DualAvatarController.Instance.CurrentAvatar.ChipSpawnTime;
}
gm.moveMade = true;
gm.stateMachine.ChangeState(new ChipFallingState(startDelay: delayBeforeStartFalling));
}
else
{
SoundManager.instance.playWrong();
}
}
//ВЫХОД ДА ПЕРВОГО ХОДА
bool exitPressed = In.GetButtonDown(ButtonPinMapping.startOnePlayer) || In.GetButtonDown(ButtonPinMapping.startTwoPlayers);
if (exitPressed && !gm.moveMade)
{
gm.stateMachine.ChangeState(new ClearFieldState(toMenu: true, CellState.Player1));
SingleWallet.ReturnCredits(gm.gameMode);
GameManager.instance.timerManager.StopAllTimers();
}
}
void CollectValidPositions()
{
validPositions = new List<int>();
for (int i = 0; i < 7; i++)
{
if (GameManager.fieldModel.getHeight(i) != -1)
{
validPositions.Add(i);
}
}
}
IEnumerator DestroyPointer()
{
Color color = pointerRend.color;
float t = 1;
while (t > 0)
{
t -= Time.deltaTime * 3;
color.a = t;
pointerRend.color = color;
yield return null;
}
Object.Destroy(chipPointer.gameObject);
}
}