using System.Collections; using UnityEngine; public class ChipFallingState : IState { const float MAX_ANGULAR_SPEED = 500; int rowIndex; int targetColumn; float angularSpeed; float velocityY = 0; Vector2 targetPosition; Transform chipTransform; float startDelay = 0; bool delayCompleted = false; private GameManager gm; public ChipFallingState(float startDelay, int col) { gm = GameManager.instance; this.startDelay = startDelay; targetColumn = col; rowIndex = GameManager.fieldModel.GetColumnHeight(targetColumn); } private Vector2 CalculateTargetPosition() { float targetX = gm.slotLeftTop.position.x + targetColumn * gm.stepX; float targetY = gm.slotLeftTop.transform.position.y - GameManager.instance.stepY * rowIndex; return new Vector2(targetX, targetY); } public void enter() { targetPosition = CalculateTargetPosition(); GameManager.instance.StartCoroutine(DelayedEnter(startDelay)); } private void CacheFields() { chipTransform = GameManager.instance.currentChip.transform; angularSpeed = Random.Range(-MAX_ANGULAR_SPEED, MAX_ANGULAR_SPEED); } private void PrepareForFalling() { chipTransform.GetComponent().enabled = true; } private void InitialSound() => SoundManager.instance.playDropDown(); public void update() { if (!delayCompleted) return; ChipFallProcess(); if (chipTransform.position.y == targetPosition.y) { chipTransform.GetComponent().emitting = false; SoundManager.instance.playChipBounce(); CompleteChipLanding(); } } private void ChipFallProcess() { velocityY += GameManager.instance.chipAcceleration * Time.deltaTime; float delta = velocityY * Time.deltaTime; chipTransform.position = Vector2.MoveTowards(chipTransform.position, targetPosition, delta); chipTransform.transform.Rotate(0, 0, angularSpeed * Time.deltaTime); } private void CompleteChipLanding() { chipTransform.position = targetPosition; GameManager.fieldModel.FieldArray[rowIndex, targetColumn] = GameManager.instance.currentPlayer; GameManager.instance.setChipTransformToArray(rowIndex, targetColumn, chipTransform); StateRouter.RouteAfterTurn(); } public void exit() { velocityY = 0; AnnouncePlayerTurn(); } private void AnnouncePlayerTurn() { if (GameManager.instance.currentPlayer == CellState.Player1) { CharacterEventBus.Instance.OnPlayerTurn?.Invoke(); } } IEnumerator DelayedEnter(float startDelay) { yield return new WaitForSeconds(startDelay); CacheFields(); PrepareForFalling(); InitialSound(); delayCompleted = true; } }