const Score CloseEnemies = S( 7, 0);
const Score Hanging = S( 52, 30);
const Score HinderPassedPawn = S( 8, 1);
+ const Score KnightOnQueen = S( 21, 11);
const Score LongRangedBishop = S( 22, 0);
const Score MinorBehindPawn = S( 16, 0);
const Score PawnlessFlank = S( 20, 80);
if (!(pos.pieces(PAWN) & kf))
score -= PawnlessFlank;
- // Find the squares that opponent attacks in our king flank, and the squares
+ // 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];
score += ThreatOnQueen * popcount(b & safeThreats);
+ // Bonus for knight threats on the next moves against enemy queen
+ if (pos.count<QUEEN>(Them) == 1)
+ {
+ b = pos.attacks_from<KNIGHT>(pos.square<QUEEN>(Them))
+ & attackedBy[Us][KNIGHT]
+ & ~pos.pieces(Us, PAWN, KING)
+ & ~stronglyProtected;
+
+ score += KnightOnQueen * popcount(b);
+ }
+
if (T)
Trace::add(THREAT, Us, score);
behind |= (Us == WHITE ? behind >> 8 : behind << 8);
behind |= (Us == WHITE ? behind >> 16 : behind << 16);
- // Since SpaceMask[Us] is fully on our half of the board...
- assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0);
-
- // ...count safe + (behind & safe) with a single popcount.
- int bonus = popcount((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe));
+ int bonus = popcount(safe) + popcount(behind & safe);
int weight = pos.count<ALL_PIECES>(Us) - 2 * pe->open_files();
+
Score score = make_score(bonus * weight * weight / 16, 0);
if (T)