S(0, 0), S(0, 0), S(107, 138), S(84, 122), S(114, 203), S(121, 217)
};
+ const Score ThreatenedByHangingPawn = S(40, 60);
+
// Assorted bonuses and penalties used by evaluation
const Score KingOnOne = S( 2, 58);
const Score KingOnMany = S( 6,125);
mobility[Us] += MobilityBonus[Pt][mob];
- // Decrease score if we are attacked by an enemy pawn. The remaining part
- // of threat evaluation must be done later when we have full attack info.
- if (ei.attackedBy[Them][PAWN] & s)
- score -= ThreatenedByPawn[Pt];
-
if (Pt == BISHOP || Pt == KNIGHT)
{
// Bonus for outpost square
{
// ...and then remove squares not supported by another enemy piece
b &= ( ei.attackedBy[Them][PAWN] | ei.attackedBy[Them][KNIGHT]
- | ei.attackedBy[Them][BISHOP] | ei.attackedBy[Them][QUEEN]);
+ | ei.attackedBy[Them][BISHOP]);
if (b)
attackUnits += RookContactCheck * popcount<Max15>(b);
enum { Defended, Weak };
enum { Minor, Major };
- Bitboard b, weak, defended;
+ Bitboard b, weak, defended, safeThreats;
Score score = SCORE_ZERO;
+ // Non-pawn enemies attacked by a pawn
+ weak = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Us][PAWN];
+
+ if (weak)
+ {
+ b = pos.pieces(Us, PAWN) & ( ~ei.attackedBy[Them][ALL_PIECES]
+ | ei.attackedBy[Us][ALL_PIECES]);
+
+ safeThreats = (shift_bb<Right>(b) | shift_bb<Left>(b)) & weak;
+
+ if (weak ^ safeThreats)
+ score += ThreatenedByHangingPawn;
+
+ while (safeThreats)
+ score += ThreatenedByPawn[type_of(pos.piece_on(pop_lsb(&safeThreats)))];
+ }
+
// Non-pawn enemies defended by a pawn
defended = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Them][PAWN];