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); } }