155 lines
4.6 KiB
C#
155 lines
4.6 KiB
C#
using UnityEngine;
|
|
|
|
public class PositioningState : IState
|
|
{
|
|
private GameManager gm;
|
|
private Chip chip;
|
|
private Board board;
|
|
private ChipPointer pointer;
|
|
|
|
private int indexValidArr;
|
|
private int columnIndex;
|
|
private bool chipOnPosition;
|
|
private int[] validPositions;
|
|
|
|
private Vector2 stickedPosition;
|
|
private Vector2 targetPosition;
|
|
|
|
public void enter()
|
|
{
|
|
gm = GameManager.instance;
|
|
board = gm.board;
|
|
pointer = gm.chipPointer;
|
|
|
|
validPositions = board.GetNonFullColumns();
|
|
|
|
int centralIndex = validPositions.Length / 2;
|
|
indexValidArr = centralIndex;
|
|
columnIndex = validPositions[centralIndex];
|
|
|
|
stickedPosition = board.GetStickedPosition(validPositions[indexValidArr]);
|
|
targetPosition = board.GetTargetPosition(validPositions[indexValidArr]);
|
|
|
|
chip = gm.currentChip;
|
|
chip.transform.position = stickedPosition;
|
|
chipOnPosition = true;
|
|
|
|
pointer.Show();
|
|
pointer.SetColorByPlayer(gm.currentPlayer);
|
|
pointer.SetPosition(targetPosition);
|
|
|
|
if (gm.gameMode == GameMode.pvp)
|
|
{
|
|
gm.pvpPointer.SetColor(gm.currentPlayer);
|
|
gm.pvpPointer.SetVisibility(true);
|
|
gm.pvpPointer.MoveTo(stickedPosition);
|
|
}
|
|
|
|
if (gm.gameMode == GameMode.pve)
|
|
gm.StartVsBotTimer();
|
|
}
|
|
|
|
public void exit()
|
|
{
|
|
gm.pvpPointer.SetVisibility(false);
|
|
gm.StopVsBotTimer();
|
|
pointer.Hide();
|
|
}
|
|
|
|
public void update()
|
|
{
|
|
// вычисление ввода в зависимости от игрового режима
|
|
var input = GetInputs();
|
|
|
|
|
|
HandleChipMovement(input.direction);
|
|
chipOnPosition = chip.MoveToLinear(stickedPosition);
|
|
|
|
if (HandleDrop(input.action)) return;
|
|
if (HandleExitToMenu()) return;
|
|
}
|
|
|
|
private void HandleChipMovement(int direction)
|
|
{
|
|
if (direction == 0 || !chipOnPosition) return;
|
|
|
|
indexValidArr += direction;
|
|
indexValidArr = Mathf.Clamp(indexValidArr, 0, validPositions.Length - 1);
|
|
|
|
columnIndex = validPositions[indexValidArr];
|
|
|
|
stickedPosition = gm.board.GetStickedPosition(columnIndex);
|
|
targetPosition = gm.board.GetTargetPosition(columnIndex);
|
|
|
|
//перемещение указателей
|
|
pointer.SetPosition(targetPosition);
|
|
if (gm.gameMode == GameMode.pvp)
|
|
gm.pvpPointer.MoveTo(stickedPosition);
|
|
|
|
SoundManager.instance.playSwitch();
|
|
}
|
|
|
|
private bool HandleExitToMenu()
|
|
{
|
|
bool exitPressed = In.GetButtonDown(ButtonPinMapping.startOnePlayer) || In.GetButtonDown(ButtonPinMapping.startTwoPlayers);
|
|
if (exitPressed && gm.canReturnToMenu)
|
|
{
|
|
gm.board.MakeClearField();
|
|
PaymentSystem.ReturnCredits(gm.gameMode);
|
|
GameManager.instance.timerManager.StopAllTimers();
|
|
GameManager.instance.stateMachine.ChangeState(new MenuState());
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private bool HandleDrop(bool action)
|
|
{
|
|
if (!action) return false;
|
|
|
|
bool canDropInCurrentColumn = board.CanDrop(columnIndex);
|
|
if (!(chipOnPosition && canDropInCurrentColumn))
|
|
{
|
|
SoundManager.instance.playWrong();
|
|
return false;
|
|
}
|
|
|
|
if (gm.gameMode == GameMode.pve) gm.vsBotMoves += 1;
|
|
|
|
float delayBeforeStartFalling = 0;
|
|
if (gm.gameMode == GameMode.pvp)
|
|
{
|
|
AvatarEventBus.Instance.OnTurnEnd?.Invoke(gm.currentPlayer);
|
|
delayBeforeStartFalling = DualAvatarController.Instance.CurrentAvatar.ChipSpawnTime;
|
|
}
|
|
|
|
gm.canReturnToMenu = false;
|
|
gm.stateMachine.ChangeState(new ChipFallingState(startDelay: delayBeforeStartFalling, columnIndex));
|
|
return true;
|
|
}
|
|
|
|
private (int direction, bool action) GetInputs()
|
|
{
|
|
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);
|
|
}
|
|
|
|
int direction = 0;
|
|
if (left) direction -= 1;
|
|
if (right) direction += 1;
|
|
|
|
return (direction, action);
|
|
}
|
|
} |