// Threat[attacking][attacked] contains bonuses according to which piece
// type attacks which one.
const Score Threat[][PIECE_TYPE_NB] = {
- {}, {},
- { S(0, 0), S( 7, 39), S( 0, 0), S(24, 49), S(41,100), S(41,100) }, // KNIGHT
- { S(0, 0), S( 7, 39), S(24, 49), S( 0, 0), S(41,100), S(41,100) }, // BISHOP
- { S(0, 0), S( 0, 22), S(15, 49), S(15, 49), S( 0, 0), S(24, 49) }, // ROOK
- { S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0, 0) } // QUEEN
+ { S(0, 0), S( 7, 39), S(24, 49), S(24, 49), S(41,100), S(41,100) }, // Minor
+ { S(0, 0), S(15, 39), S(15, 45), S(15, 45), S(15, 45), S(24, 49) }, // Major
};
// ThreatenedByPawn[PieceType] contains a penalty according to which piece
{
ei.kingRing[Them] = b | shift_bb<Down>(b);
b &= ei.attackedBy[Us][PAWN];
- ei.kingAttackersCount[Us] = b ? popcount<Max15>(b) / 2 : 0;
+ ei.kingAttackersCount[Us] = b ? popcount<Max15>(b) : 0;
ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0;
}
else
Score score = ei.pi->king_safety<Us>(pos, ksq);
// Main king safety evaluation
- if ( ei.kingAttackersCount[Them] >= 2
- && ei.kingAdjacentZoneAttacksCount[Them])
+ if (ei.kingAttackersCount[Them])
{
// Find the attacked squares around the king which have no defenders
// apart from the king itself
& ~ei.attackedBy[Them][PAWN]
& ei.attackedBy[Us][ALL_PIECES];
- // Add bonus according to type of attacked enemy piece and to the
- // type of attacking piece, from knights to queens. Kings are not
- // considered because they are already handled in king evaluation.
+ // Add a bonus according if the attacking pieces are minor or major
if (weakEnemies)
- for (PieceType pt1 = KNIGHT; pt1 < KING; ++pt1)
- {
- b = ei.attackedBy[Us][pt1] & weakEnemies;
- if (b)
- for (PieceType pt2 = PAWN; pt2 < KING; ++pt2)
- if (b & pos.pieces(pt2))
- score += Threat[pt1][pt2];
- }
+ {
+ b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
+ if (b)
+ score += Threat[0][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)))];
+ }
if (Trace)
Tracing::scores[Us][THREAT] = score;