- Color us = pos.side_to_move();
- Color them = opposite_color(us);
- Square from = move_from(m);
- Square to = move_to(m);
- Piece pc = pos.piece_on(from);
-
- // Use a slower but simpler function for uncommon cases
- if (move_is_ep(m) || move_is_castle(m))
- return move_is_legal(pos, m);
-
- // If the from square is not occupied by a piece belonging to the side to
- // move, the move is obviously not legal.
- if (color_of_piece(pc) != us)
- return false;
-
- // The destination square cannot be occupied by a friendly piece
- if (pos.color_of_piece_on(to) == us)
- return false;
-
- // Handle the special case of a pawn move
- if (type_of_piece(pc) == PAWN)
- {
- // Move direction must be compatible with pawn color
- int direction = to - from;
- if ((us == WHITE) != (direction > 0))
- return false;
-
- // A pawn move is a promotion iff the destination square is
- // on the 8/1th rank.
- if (( (square_rank(to) == RANK_8 && us == WHITE)
- ||(square_rank(to) == RANK_1 && us != WHITE)) != bool(move_is_promotion(m)))
- return false;
-
- // The promotion piece, if any, must be valid
- if (move_promotion_piece(m) > QUEEN || move_promotion_piece(m) == PAWN)
- return false;
-
- // Proceed according to the square delta between the origin and
- // destination squares.
- switch (direction)
- {
- case DELTA_NW:
- case DELTA_NE:
- case DELTA_SW:
- case DELTA_SE:
- // Capture. The destination square must be occupied by an enemy
- // piece (en passant captures was handled earlier).
- if (pos.color_of_piece_on(to) != them)
- return false;
- break;