X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=6f8747635772aa930a604025bd5b0c95a67dbbc2;hp=23ecf55732a0b87626374e87e9c1dc4c54f4ee7a;hb=ddeb01612b122bbeeb59a26ba6f8c6f1e4283199;hpb=c9dcda6ac488c0058ebd567e1f52e30b8cd0db20 diff --git a/src/position.cpp b/src/position.cpp index 23ecf557..6f874763 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -411,11 +411,14 @@ const string Position::pretty(Move move) const { } -/// Position:hidden_checkers() returns a bitboard of all pinned / discovered check -/// pieces, according to the call parameters. Pinned pieces protect our king and -/// discovered check pieces attack the enemy king. +/// Position::check_blockers() returns a bitboard of all the pieces with color +/// 'c' that are blocking check on the king with color 'kingColor'. A piece +/// blocks a check if removing that piece from the board would result in a +/// position where the king is in check. A check blocking piece can be either a +/// pinned or a discovered check piece, according if its color 'c' is the same +/// or the opposite of 'kingColor'. -Bitboard Position::hidden_checkers(Color c, Color kingColor) const { +Bitboard Position::check_blockers(Color c, Color kingColor) const { Bitboard b, pinners, result = 0; Square ksq = king_square(kingColor); @@ -614,7 +617,7 @@ bool Position::pseudo_legal(const Move m) const { } -/// Position::move_gives_check() tests whether a pseudo-legal move gives a check +/// Position::gives_check() tests whether a pseudo-legal move gives a check bool Position::gives_check(Move m, const CheckInfo& ci) const { @@ -633,20 +636,17 @@ bool Position::gives_check(Move m, const CheckInfo& ci) const { // Is there a discovered check? if ( unlikely(ci.dcCandidates) && (ci.dcCandidates & from) - && !aligned(from, to, king_square(~sideToMove))) + && !aligned(from, to, ci.ksq)) return true; // Can we skip the ugly special cases? if (type_of(m) == NORMAL) return false; - Color us = sideToMove; - Square ksq = king_square(~us); - switch (type_of(m)) { case PROMOTION: - return attacks_bb(Piece(promotion_type(m)), to, pieces() ^ from) & ksq; + return attacks_bb(Piece(promotion_type(m)), to, pieces() ^ from) & ci.ksq; // En passant capture with check? We have already handled the case // of direct checks and ordinary discovered check, so the only case we @@ -657,18 +657,18 @@ bool Position::gives_check(Move m, const CheckInfo& ci) const { Square capsq = file_of(to) | rank_of(from); Bitboard b = (pieces() ^ from ^ capsq) | to; - return (attacks_bb< ROOK>(ksq, b) & pieces(us, QUEEN, ROOK)) - | (attacks_bb(ksq, b) & pieces(us, QUEEN, BISHOP)); + return (attacks_bb< ROOK>(ci.ksq, b) & pieces(sideToMove, QUEEN, ROOK)) + | (attacks_bb(ci.ksq, b) & pieces(sideToMove, QUEEN, BISHOP)); } case CASTLING: { Square kfrom = from; Square rfrom = to; // Castling is encoded as 'King captures the rook' - Square kto = relative_square(us, rfrom > kfrom ? SQ_G1 : SQ_C1); - Square rto = relative_square(us, rfrom > kfrom ? SQ_F1 : SQ_D1); + Square kto = relative_square(sideToMove, rfrom > kfrom ? SQ_G1 : SQ_C1); + Square rto = relative_square(sideToMove, rfrom > kfrom ? SQ_F1 : SQ_D1); - return (PseudoAttacks[ROOK][rto] & ksq) - && (attacks_bb(rto, (pieces() ^ kfrom ^ rfrom) | rto | kto) & ksq); + return (PseudoAttacks[ROOK][rto] & ci.ksq) + && (attacks_bb(rto, (pieces() ^ kfrom ^ rfrom) | rto | kto) & ci.ksq); } default: assert(false); @@ -1077,20 +1077,23 @@ int Position::see(Move m) const { // Add the new entry to the swap list swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured]; - ++slIndex; // Locate and remove the next least valuable attacker captured = min_attacker(byTypeBB, to, stmAttackers, occupied, attackers); - stm = ~stm; - stmAttackers = attackers & pieces(stm); // Stop before processing a king capture - if (captured == KING && stmAttackers) + if (captured == KING) { - swapList[slIndex++] = QueenValueMg * 16; + if (stmAttackers == attackers) + ++slIndex; + break; } + stm = ~stm; + stmAttackers = attackers & pieces(stm); + ++slIndex; + } while (stmAttackers); // Having built the swap list, we negamax through it to find the best