: AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
const Square ksq = pos.square<KING>(Us);
- Bitboard kingOnlyDefended, undefended, b, b1, b2, safe, other;
+ Bitboard weak, b, b1, b2, safe, other;
int kingDanger;
// King shelter and enemy pawns storm
// Main king safety evaluation
if (kingAttackersCount[Them] > (1 - pos.count<QUEEN>(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
// 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<QUEEN>(Them)
- 9 * mg_value(score) / 8
// 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<BISHOP>(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.