const Score KingProtector[] = { S(-3, -5), S(-4, -3), S(-3, 0), S(-1, 1) };
// Assorted bonuses and penalties used by evaluation
- const Score MinorBehindPawn = S( 16, 0);
- const Score BishopPawns = S( 8, 12);
- const Score LongRangedBishop = S( 22, 0);
- const Score RookOnPawn = S( 8, 24);
- const Score TrappedRook = S( 92, 0);
- const Score WeakQueen = S( 50, 10);
- const Score OtherCheck = S( 10, 10);
- const Score CloseEnemies = S( 7, 0);
- const Score PawnlessFlank = S( 20, 80);
- const Score ThreatByHangingPawn = S( 71, 61);
- const Score ThreatBySafePawn = S(192,175);
- const Score ThreatByRank = S( 16, 3);
- const Score Hanging = S( 48, 27);
- const Score WeakUnopposedPawn = S( 5, 25);
- const Score ThreatByPawnPush = S( 38, 22);
- const Score HinderPassedPawn = S( 7, 0);
- const Score TrappedBishopA1H1 = S( 50, 50);
+ const Score MinorBehindPawn = S( 16, 0);
+ const Score BishopPawns = S( 8, 12);
+ const Score LongRangedBishop = S( 22, 0);
+ const Score RookOnPawn = S( 8, 24);
+ const Score TrappedRook = S( 92, 0);
+ const Score WeakQueen = S( 50, 10);
+ const Score OtherCheck = S( 10, 10);
+ const Score CloseEnemies = S( 7, 0);
+ const Score PawnlessFlank = S( 20, 80);
+ const Score ThreatByHangingPawn = S( 71, 61);
+ const Score ThreatBySafePawn = S(192,175);
+ const Score ThreatByRank = S( 16, 3);
+ const Score Hanging = S( 48, 27);
+ const Score WeakUnopposedPawn = S( 5, 25);
+ const Score ThreatByPawnPush = S( 38, 22);
+ const Score ThreatByAttackOnQueen = S( 38, 22);
+ const Score HinderPassedPawn = S( 7, 0);
+ const Score TrappedBishopA1H1 = S( 50, 50);
#undef S
#undef V
attackedBy[Us][Pt] = 0;
+ if (Pt == QUEEN)
+ attackedBy[Us][QUEEN_DIAGONAL] = 0;
+
while ((s = *pl++) != SQ_NONE)
{
// Find attacked squares, including x-ray attacks for bishops and rooks
attackedBy2[Us] |= attackedBy[Us][ALL_PIECES] & b;
attackedBy[Us][ALL_PIECES] |= attackedBy[Us][Pt] |= b;
+ if (Pt == QUEEN)
+ attackedBy[Us][QUEEN_DIAGONAL] |= b & PseudoAttacks[BISHOP][s];
+
if (b & kingRing[Them])
{
kingAttackersCount[Us]++;
score += ThreatByPawnPush * popcount(b);
+ // Add a bonus for safe slider attack threats on opponent queen
+ safeThreats = ~pos.pieces(Us) & ~attackedBy2[Them] & attackedBy2[Us];
+ b = (attackedBy[Us][BISHOP] & attackedBy[Them][QUEEN_DIAGONAL])
+ | (attackedBy[Us][ROOK ] & attackedBy[Them][QUEEN] & ~attackedBy[Them][QUEEN_DIAGONAL]);
+
+ score += ThreatByAttackOnQueen * popcount(b & safeThreats);
+
if (T)
Trace::add(THREAT, Us, score);