- // The move is pseudo-legal. If it is legal, return it.
- return (pos.move_is_legal(m) ? m : MOVE_NONE);
- }
-
- // Castling moves
- if (move_is_short_castle(m))
- {
- // The piece must be a king and side to move must still have
- // the right to castle kingside.
- if ( type_of_piece(pc) != KING
- ||!pos.can_castle_kingside(us))
- return MOVE_NONE;
-
- assert(from == pos.king_square(us));
- assert(to == pos.initial_kr_square(us));
- assert(pos.piece_on(to) == rook_of_color(us));
-
- Square g1 = relative_square(us, SQ_G1);
- Square f1 = relative_square(us, SQ_F1);
- Square s;
- bool illegal = false;
-
- // Check if any of the squares between king and rook
- // is occupied or under attack.
- for (s = Min(from, g1); s <= Max(from, g1); s++)
- if ( (s != from && s != to && !pos.square_is_empty(s))
- || pos.square_is_attacked(s, them))
- illegal = true;
-
- // Check if any of the squares between king and rook
- // is occupied.
- for (s = Min(to, f1); s <= Max(to, f1); s++)
- if (s != from && s != to && !pos.square_is_empty(s))
- illegal = true;
-
- return (!illegal ? m : MOVE_NONE);
- }
-
- if (move_is_long_castle(m))
- {
- // The piece must be a king and side to move must still have
- // the right to castle kingside.
- if ( type_of_piece(pc) != KING
- ||!pos.can_castle_queenside(us))
- return MOVE_NONE;
-
- assert(from == pos.king_square(us));
- assert(to == pos.initial_qr_square(us));
- assert(pos.piece_on(to) == rook_of_color(us));
-
- Square c1 = relative_square(us, SQ_C1);
- Square d1 = relative_square(us, SQ_D1);
- Square s;
- bool illegal = false;
-
- for (s = Min(from, c1); s <= Max(from, c1); s++)
- if( (s != from && s != to && !pos.square_is_empty(s))
- || pos.square_is_attacked(s, them))
- illegal = true;
-
- for (s = Min(to, d1); s <= Max(to, d1); s++)
- if(s != from && s != to && !pos.square_is_empty(s))
- illegal = true;
-
- if ( square_file(to) == FILE_B
- && ( pos.piece_on(to + DELTA_W) == rook_of_color(them)
- || pos.piece_on(to + DELTA_W) == queen_of_color(them)))
- illegal = true;
-
- return (!illegal ? m : MOVE_NONE);
- }