diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 964a3870b7d..c54b6d30bc8 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -413,11 +413,19 @@ namespace { : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); const Square ksq = pos.square(Us); - Bitboard weak, b, b1, b2, safe, unsafeChecks; + Bitboard kingFlank, weak, b, b1, b2, safe, unsafeChecks; // King shelter and enemy pawns storm Score score = pe->king_safety(pos, ksq); + // Find the squares that opponent attacks in our king flank, and the squares + // which are attacked twice in that flank but not defended by our pawns. + kingFlank = KingFlank[file_of(ksq)]; + b1 = attackedBy[Them][ALL_PIECES] & kingFlank & Camp; + b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN]; + + int tropism = popcount(b1) + popcount(b2); + // Main king safety evaluation if (kingAttackersCount[Them] > 1 - pos.count(Them)) { @@ -470,9 +478,10 @@ namespace { + 69 * kingAttacksCount[Them] + 185 * popcount(kingRing[Us] & weak) + 129 * popcount(pos.blockers_for_king(Us) | unsafeChecks) + + 4 * tropism - 873 * !pos.count(Them) - 6 * mg_value(score) / 8 - - 2 ; + - 30; // Transform the kingDanger units into a Score, and subtract it from the evaluation if (kingDanger > 0) @@ -483,19 +492,12 @@ namespace { } } - Bitboard kf = KingFlank[file_of(ksq)]; - // Penalty when our king is on a pawnless flank - if (!(pos.pieces(PAWN) & kf)) + if (!(pos.pieces(PAWN) & kingFlank)) score -= PawnlessFlank; - // Find the squares that opponent attacks in our king flank, and the squares - // which are attacked twice in that flank but not defended by our pawns. - b1 = attackedBy[Them][ALL_PIECES] & kf & Camp; - b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN]; - - // King tropism, to anticipate slow motion attacks on our king - score -= CloseEnemies * (popcount(b1) + popcount(b2)); + // King tropism bonus, to anticipate slow motion attacks on our king + score -= CloseEnemies * tropism; if (T) Trace::add(KING, Us, score);