Example #1
0
    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;
        }
    }