chip-gameV3/Assets/Scripts/Common/GameFSM/PositioningState.cs

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 = Board.Instance;
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 = board.GetStickedPosition(columnIndex);
targetPosition = 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(InSignal.startOnePlayer) || In.GetButtonDown(InSignal.startTwoPlayers);
if (exitPressed && gm.canReturnToMenu)
{
board.MakeClearField();
PaymentSystem.ReturnCredits(gm.gameMode);
GameManager.instance.timerManager.StopAllTimers();
GameManager.instance.GotoMenu();
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);
}
}