From 99d32e395ee0509578553d75580234e90de89d66 Mon Sep 17 00:00:00 2001 From: Shawn Xu Date: Fri, 28 Feb 2025 00:55:29 -0800 Subject: [PATCH] Reapply #5909 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This version fixes the logic of `gives_check`, which was identified to be the cause of illegal moves. closes https://github.com/official-stockfish/Stockfish/pull/5914 No functional change Co-authored-by: Robert Nürnberg Co-authored-by: gab8192 --- src/position.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 37e9a2eb5..14599a76d 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -560,7 +560,7 @@ bool Position::legal(Move m) const { // 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. - return !(blockers_for_king(us) & from) || aligned(from, to, square(us)); + return !(blockers_for_king(us) & from) || line_bb(from, to) & pieces(us, KING); } @@ -648,7 +648,7 @@ bool Position::gives_check(Move m) const { // Is there a discovered check? if (blockers_for_king(~sideToMove) & from) - return !aligned(from, to, square(~sideToMove)) || m.type_of() == CASTLING; + return !(line_bb(from, to) & pieces(~sideToMove, KING)) || m.type_of() == CASTLING; switch (m.type_of()) { @@ -656,7 +656,7 @@ bool Position::gives_check(Move m) const { return false; case PROMOTION : - return attacks_bb(m.promotion_type(), to, pieces() ^ from) & square(~sideToMove); + return attacks_bb(m.promotion_type(), to, pieces() ^ from) & pieces(~sideToMove, KING); // En passant capture with check? We have already handled the case of direct // checks and ordinary discovered check, so the only case we need to handle