private void TryMakeTurn(Move move) { var moveTiles = GameObject.FindGameObjectsWithTag("MoveTile"); foreach (var moveTile in moveTiles) { Destroy(moveTile.gameObject); } if (IsCheck(FiguresOnBoard, PreviousMoveFinalPosition, CurrentTurnState)) { CurrentTurnState = TurnState.Check; } else { CurrentTurnState = TurnState.Obvious; } Vector2Int initialPosition = move.CurrentFigure.Data.position; bool isMovePossible = currentTurnMoves.Any(validMove => validMove.CurrentFigure == move.CurrentFigure && validMove.FinalPosition == move.FinalPosition); if (!isMovePossible) { move.CurrentFigure.transform.position = new Vector3(initialPosition.x, 0, initialPosition.y); selectedFigure = null; sfx.PlayDropSound(); return; } #region Castling if (Mathf.Abs(move.CurrentFigure.Data.position.x - move.FinalPosition.x) == 2 && move.CurrentFigure.Data.kind == Kind.King) { int suitableRookXPosition = move.FinalPosition.x == 2 ? suitableRookXPosition = 0 : suitableRookXPosition = 7; var suitableRook = FiguresOnBoard.FirstOrDefault(figure => figure.Data.kind == Kind.Rook && figure.Data.isWhite == IsWhiteTurn && figure.Data.position == new Vector2Int(suitableRookXPosition, move.CurrentFigure.Data.position.y)); int rookOffset = suitableRookXPosition == 0 ? -1 : 1; suitableRook.Data.position = new Vector2Int(move.CurrentFigure.Data.position.x + rookOffset, move.CurrentFigure.Data.position.y); suitableRook.Data.turnCount++; suitableRook.transform.position = new Vector3(move.CurrentFigure.Data.position.x + rookOffset, 0, move.CurrentFigure.Data.position.y); } #endregion var figureToCapture = FiguresOnBoard.FirstOrDefault(figure => figure.Data.position == move.FinalPosition); #region En passant if (figureToCapture == null && move.CurrentFigure.Data.kind == Kind.Pawn) { if (Mathf.Abs(move.CurrentFigure.Data.position.y - move.FinalPosition.y) == 1 && Mathf.Abs(move.CurrentFigure.Data.position.x - move.FinalPosition.x) == 1) { int pawnPassageYLocation = move.FinalPosition.y == 5 ? pawnPassageYLocation = 4 : pawnPassageYLocation = 3; figureToCapture = FiguresOnBoard.FirstOrDefault(figure => figure.Data.position == new Vector2Int(move.FinalPosition.x, pawnPassageYLocation) && figure.Data.isWhite != IsWhiteTurn && figure.Data.kind == Kind.Pawn); } } #endregion if (figureToCapture != null) { FiguresOnBoard.Remove(figureToCapture); Instantiate(vfx, figureToCapture.transform.position, Quaternion.identity); Destroy(figureToCapture.gameObject); sfx.PlayKillSound(); } else { sfx.PlayDropSound(); } move.CurrentFigure.Data.position = move.FinalPosition; move.CurrentFigure.transform.position = new Vector3(move.FinalPosition.x, 0, move.FinalPosition.y); move.CurrentFigure.Data.turnCount++; selectedFigure = null; IsWhiteTurn = !IsWhiteTurn; if (move.CurrentFigure.Data.kind == Kind.Pawn && (move.FinalPosition.y == 7 || move.FinalPosition.y == 0)) { OnPause = true; } PreviousMoveFinalPosition = move.FinalPosition; if (IsCheck(FiguresOnBoard, PreviousMoveFinalPosition, CurrentTurnState)) { CurrentTurnState = TurnState.Check; } else { CurrentTurnState = TurnState.Obvious; } if (FiguresOnBoard.Count == 2 || (FiguresOnBoard.Count == 3 && FiguresOnBoard.FirstOrDefault(figure => figure.Data.kind == Kind.Queen || figure.Data.kind == Kind.Rook) == null)) { CurrentTurnState = TurnState.Pat; CurrentGameState = GameState.Finished; } if (GetAllCurrentTurnMoves(FiguresOnBoard, PreviousMoveFinalPosition, CurrentTurnState).Count == 0) { if (CurrentTurnState == TurnState.Check) { CurrentTurnState = TurnState.CheckAndMate; } else { CurrentTurnState = TurnState.Pat; } CurrentGameState = GameState.Finished; } }