// Hanging contains a bonus for each enemy hanging piece
const Score Hanging = S(23, 20);
+ const Score KingPawnThreatOne = S(0, 64);
+ const Score KingPawnThreatMany = S(0, 128);
#undef S
Bitboard b, weakEnemies, protectedEnemies;
Score score = SCORE_ZERO;
+ enum { Minor, Major };
// Protected enemies
protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them,PAWN))
& (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
if(protectedEnemies)
- score += Threat[0][type_of(pos.piece_on(lsb(protectedEnemies)))];
+ score += Threat[Minor][type_of(pos.piece_on(lsb(protectedEnemies)))];
// Enemies not defended by a pawn and under our attack
weakEnemies = pos.pieces(Them)
{
b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
if (b)
- score += Threat[0][type_of(pos.piece_on(lsb(b)))];
+ score += Threat[Minor][type_of(pos.piece_on(lsb(b)))];
b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]);
if (b)
- score += Threat[1][type_of(pos.piece_on(lsb(b)))];
+ score += Threat[Major][type_of(pos.piece_on(lsb(b)))];
b = weakEnemies & ~ei.attackedBy[Them][ALL_PIECES];
if (b)
score += more_than_one(b) ? Hanging * popcount<Max15>(b) : Hanging;
- }
+
+ b = weakEnemies & pos.pieces(Them, PAWN) & ei.attackedBy[Us][KING];
+ if (b)
+ score += more_than_one(b) ? KingPawnThreatMany : KingPawnThreatOne;
+ }
if (Trace)
Tracing::terms[Us][Tracing::THREAT] = score;