X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=39dac6d14ffb5481b74986ec41660cf5aebac6f0;hp=ee93f11f13cda2b3e776221282534969c18512ed;hb=53239d7d3df44208a915fce84a5745101d3a2ea6;hpb=0dc3b0978dca0459ceb483ada3792080f4caad15 diff --git a/src/evaluate.cpp b/src/evaluate.cpp index ee93f11f..39dac6d1 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -421,7 +421,7 @@ namespace { : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); const Square ksq = pos.square(Us); - Bitboard kingOnlyDefended, undefended, b, b1, b2, safe, other; + Bitboard weak, b, b1, b2, safe, other; int kingDanger; // King shelter and enemy pawns storm @@ -430,16 +430,10 @@ namespace { // Main king safety evaluation if (kingAttackersCount[Them] > (1 - pos.count(Them))) { - // Find the attacked squares which are defended only by our king... - kingOnlyDefended = attackedBy[Them][ALL_PIECES] - & attackedBy[Us][KING] - & ~attackedBy2[Us]; - - // ... and those which are not defended at all in the larger king ring - undefended = attackedBy[Them][ALL_PIECES] - & ~attackedBy[Us][ALL_PIECES] - & kingRing[Us] - & ~pos.pieces(Them); + // Attacked squares defended at most once by our queen or king + weak = attackedBy[Them][ALL_PIECES] + & ~attackedBy2[Us] + & (attackedBy[Us][KING] | attackedBy[Us][QUEEN] | ~attackedBy[Us][ALL_PIECES]); // Initialize the 'kingDanger' variable, which will be transformed // later into a king danger score. The initial value is based on the @@ -448,7 +442,7 @@ namespace { // the quality of the pawn shelter (current 'score' value). kingDanger = kingAttackersCount[Them] * kingAttackersWeight[Them] + 102 * kingAdjacentZoneAttacksCount[Them] - + 191 * popcount(kingOnlyDefended | undefended) + + 191 * popcount(kingRing[Us] & weak) + 143 * !!pos.pinned_pieces(Us) - 848 * !pos.count(Them) - 9 * mg_value(score) / 8 @@ -456,21 +450,15 @@ namespace { // Analyse the safe enemy's checks which are possible on next move safe = ~pos.pieces(Them); - safe &= ~attackedBy[Us][ALL_PIECES] | (kingOnlyDefended & attackedBy2[Them]); + safe &= ~attackedBy[Us][ALL_PIECES] | (weak & attackedBy2[Them]); b1 = pos.attacks_from< ROOK>(ksq); b2 = pos.attacks_from(ksq); // Enemy queen safe checks - if ((b1 | b2) & attackedBy[Them][QUEEN] & safe) + if ((b1 | b2) & attackedBy[Them][QUEEN] & safe & ~attackedBy[Us][QUEEN]) kingDanger += QueenCheck; - // For minors and rooks, also consider the square safe if attacked twice, - // and only defended by our queen. - safe |= attackedBy2[Them] - & ~(attackedBy2[Us] | pos.pieces(Them)) - & attackedBy[Us][QUEEN]; - // Some other potential checks are also analysed, even from squares // currently occupied by the opponent own pieces, as long as the square // is not attacked by our pawns, and is not occupied by a blocked pawn.