X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=ec54da9e9e3161b382120acfaadfe7c9866129fd;hp=05e093a8a6fc8b2bae8085d1d7f0eab1806ba324;hb=1f97b48a31cd60d71c5fb63541cbf3991a094443;hpb=f9f30412e798b4ba06375a383a85a9e65bfe299f diff --git a/src/position.cpp b/src/position.cpp index 05e093a8..ec54da9e 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -451,20 +451,24 @@ void Position::find_checkers() { /// computes bitboards relative to that color only, the other computes both /// colors. Bitboard checkersBB must be already updated. -void Position::find_hidden_checks(Color us) { +void Position::find_hidden_checks(Color us, unsigned int types) { Bitboard p1, p2; Color them = opposite_color(us); Square ksq = king_square(them); - st->pinned[them] = hidden_checks(them, ksq, p1) | hidden_checks(them, ksq, p2); - st->pinners[them] = p1 | p2; - st->dcCandidates[us] = hidden_checks(us, ksq, p1) | hidden_checks(us, ksq, p2); + if (types & Pinned) + { + st->pinned[them] = hidden_checks(them, ksq, p1) | hidden_checks(them, ksq, p2); + st->pinners[them] = p1 | p2; + } + if (types & DcCandidates) + st->dcCandidates[us] = hidden_checks(us, ksq, p1) | hidden_checks(us, ksq, p2); } void Position::find_hidden_checks() { for (Color c = WHITE; c <= BLACK; c++) - find_hidden_checks(c); + find_hidden_checks(c, Pinned | DcCandidates); } @@ -702,25 +706,36 @@ void Position::update_hidden_checks(Square from, Square to) { // otherwise skip because our dcCandidates and opponent pinned pieces are not changed. if ( (moveSquares & RookPseudoAttacks[ksq]) && (checkerMoved || (rooks_and_queens(us) & RookPseudoAttacks[ksq])) || (moveSquares & BishopPseudoAttacks[ksq]) && (checkerMoved || (bishops_and_queens(us) & BishopPseudoAttacks[ksq]))) - find_hidden_checks(us); + find_hidden_checks(us, Pinned | DcCandidates); ksq = king_square(us); if (ksq == to) { - find_hidden_checks(them); + find_hidden_checks(them, Pinned | DcCandidates); return; } // It is possible that we have captured an opponent hidden checker? - Bitboard checkerCaptured = (st->dcCandidates[them] | st->pinners[us]) && st->capture; + Bitboard checkerCaptured = st->capture && (st->dcCandidates[them] || bit_is_set(st->pinners[us], to)); // If we are moving from/to an our king attack direction and there was/is some possible // opponent hidden checker then calculate the position otherwise skip because opponent // dcCandidates and our pinned pieces are not changed. if ( (moveSquares & RookPseudoAttacks[ksq]) && (checkerCaptured || (rooks_and_queens(them) & RookPseudoAttacks[ksq])) || (moveSquares & BishopPseudoAttacks[ksq]) && (checkerCaptured || (bishops_and_queens(them) & BishopPseudoAttacks[ksq]))) - find_hidden_checks(them); + { + + // If we don't have opponent dc candidates and we are moving in the + // attack line then won't be dc candidates also after the move. + if ( st->dcCandidates[them] + || bit_is_set(RookPseudoAttacks[ksq], from) + || bit_is_set(BishopPseudoAttacks[ksq], from)) + + find_hidden_checks(them, Pinned | DcCandidates); + else + find_hidden_checks(them, Pinned); + } }