222 lines
6.7 KiB
C#
222 lines
6.7 KiB
C#
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));
|
||
ComWrapper.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);
|
||
}
|
||
}
|