private static bool CanMakeEnPassantMove(Piece pieceToMove, ChessMoveStepInfo lastMoveStep, Piece pieceOnTheSide)
 {
     return(!pieceOnTheSide.IsNone() &&
            pieceOnTheSide.Type == PieceType.Pawn &&
            pieceOnTheSide.Player != pieceToMove.Player &&
            pieceOnTheSide.NumberOfPlayedMoves == 1 &&
            lastMoveStep.NewPosition.Equals(pieceOnTheSide.Position) &&
            Math.Abs((int)lastMoveStep.OldPosition.VerticalPosition - (int)lastMoveStep.NewPosition.VerticalPosition) == 2);
 }
        private static List <ChessMoveInfo> GetCastlingMoves(ChessBoard board, Piece kingPiece)
        {
            var moves = new List <ChessMoveInfo>();

            var verticalPosition = kingPiece.Position.VerticalPosition;

            var shortCastlingRookPosition = new PiecePosition(PieceHorizontalPosition.P_H, verticalPosition);
            var shortCastlingRookPiece    = board.GetPiece(shortCastlingRookPosition);
            var canDoShortCastling        = CanDoCastling(board, kingPiece, shortCastlingRookPiece);

            if (canDoShortCastling)
            {
                var newRookPosition = new PiecePosition(PieceHorizontalPosition.P_F, verticalPosition);
                var newKingPosition = new PiecePosition(PieceHorizontalPosition.P_G, verticalPosition);
                var firstMoveStep   = new ChessMoveStepInfo(shortCastlingRookPosition, newRookPosition, shortCastlingRookPiece);
                var secondMoveStep  = new ChessMoveStepInfo(kingPiece.Position, newKingPosition, kingPiece);
                var steps           = new List <ChessMoveStepInfo> {
                    firstMoveStep, secondMoveStep
                };
                var move = new ChessMoveInfo(kingPiece.Player, steps, false, isCastling: true);
                moves.Add(move);
            }

            var longCastlingRookPosition = new PiecePosition(PieceHorizontalPosition.P_A, verticalPosition);
            var longCastlingRookPiece    = board.GetPiece(longCastlingRookPosition);
            var canDoLongCastling        = CanDoCastling(board, kingPiece, longCastlingRookPiece);

            if (canDoLongCastling)
            {
                var newRookPosition = new PiecePosition(PieceHorizontalPosition.P_D, verticalPosition);
                var newKingPosition = new PiecePosition(PieceHorizontalPosition.P_C, verticalPosition);
                var firstMoveStep   = new ChessMoveStepInfo(longCastlingRookPosition, newRookPosition, longCastlingRookPiece);
                var secondMoveStep  = new ChessMoveStepInfo(kingPiece.Position, newKingPosition, kingPiece);
                var steps           = new List <ChessMoveStepInfo> {
                    firstMoveStep, secondMoveStep
                };
                var move = new ChessMoveInfo(kingPiece.Player, steps, false, isCastling: true);
                moves.Add(move);
            }

            return(moves);
        }