diff --git a/src/position.cpp b/src/position.cpp index 59caa88e..59c3a8c3 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -603,9 +603,10 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { assert(piece_on(king_square(us)) == make_piece(us, KING)); // If the moving piece is a king, check whether the destination - // square is attacked by the opponent. + // square is attacked by the opponent. Castling moves are checked + // for legality during move generation. if (type_of_piece_on(from) == KING) - return !(attackers_to(move_to(m)) & pieces_of_color(opposite_color(us))); + return move_is_castle(m) || !(attackers_to(move_to(m)) & pieces_of_color(opposite_color(us))); // A non-king move is legal if and only if it is not pinned or it // is moving along the ray towards or away from the king. diff --git a/src/position.h b/src/position.h index 04592d27..5935181b 100644 --- a/src/position.h +++ b/src/position.h @@ -526,7 +526,7 @@ inline bool Position::is_chess960() const { inline bool Position::move_is_capture(Move m) const { assert (m != MOVE_NONE && m != MOVE_NULL); - return !square_is_empty(move_to(m)) || move_is_ep(m); + return !move_is_special(m) ? !square_is_empty(move_to(m)) : move_is_ep(m); } inline PieceType Position::captured_piece_type() const {