public BoardState ApplyMove(BoardState currentState, Move move, MoveValidationResult moveValidation)
        {
            var newBoardState = new BoardState();

            Piece[,] piecePositions = (Piece[, ])currentState.PiecePositions.Clone();

            MovePiece(move, piecePositions);
            MovePiece(moveValidation.CastleRookMove, piecePositions);

            RemoveEnPassantCapture(moveValidation, piecePositions);
            PromotePawn(move, moveValidation, piecePositions);

            newBoardState.PiecePositions  = piecePositions;
            newBoardState.EnPassantTarget = moveValidation.NewEnPassantTarget;
            newBoardState.ActiveColor     = currentState.ActiveColor == Color.White ? Color.Black : Color.White;
            newBoardState.CastlingState   = GetNewCastlingState(move, currentState);

            if (currentState.ActiveColor == Color.Black)
            {
                newBoardState.FullmoveNumber += 1;
            }

            if (moveValidation.ShouldResetHalfmoveClock)
            {
                newBoardState.HalfmoveClock = 0;
            }
            else
            {
                newBoardState.HalfmoveClock += 1;
            }

            return(newBoardState);
        }
        private void RemoveEnPassantCapture(MoveValidationResult moveValidation, Piece[,] piecePositions)
        {
            var enPassantCapture = moveValidation.EnPassantCapture;

            if (enPassantCapture == null)
            {
                return;
            }

            piecePositions[enPassantCapture.X, enPassantCapture.Y] = null;
        }
 private void PromotePawn(Move move, MoveValidationResult moveValidation, Piece[,] piecePositions)
 {
     if (moveValidation.Promotion != null)
     {
         var piece = piecePositions[move.EndPosition.X, move.EndPosition.Y];
         piecePositions[move.EndPosition.X, move.EndPosition.Y] = new Piece
         {
             Color = piece.Color,
             Type  = moveValidation.Promotion.Value
         };
     }
 }