// Penalties for enemy's safe checks
constexpr int QueenSafeCheck = 780;
- constexpr int RookSafeCheck = 880;
- constexpr int BishopSafeCheck = 435;
+ constexpr int RookSafeCheck = 1080;
+ constexpr int BishopSafeCheck = 635;
constexpr int KnightSafeCheck = 790;
#define S(mg, eg) make_score(mg, eg)
b1 = attacks_bb<ROOK >(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
- // Enemy queen safe checks
- if ((b1 | b2) & attackedBy[Them][QUEEN] & safe & ~attackedBy[Us][QUEEN])
- kingDanger += QueenSafeCheck;
-
- b1 &= attackedBy[Them][ROOK];
- b2 &= attackedBy[Them][BISHOP];
-
// Enemy rooks checks
- if (b1 & safe)
+ Bitboard RookCheck = b1
+ & safe
+ & attackedBy[Them][ROOK];
+
+ if (RookCheck)
kingDanger += RookSafeCheck;
else
- unsafeChecks |= b1;
+ unsafeChecks |= b1 & attackedBy[Them][ROOK];
+
+ // Enemy queen safe checks: we count them only if they are from squares from
+ // which we can't give a rook check, because rook checks are more valuable.
+ Bitboard QueenCheck = (b1 | b2)
+ & attackedBy[Them][QUEEN]
+ & safe
+ & ~attackedBy[Us][QUEEN]
+ & ~RookCheck;
- // Enemy bishops checks
- if (b2 & safe)
+ if (QueenCheck)
+ kingDanger += QueenSafeCheck;
+
+ // Enemy bishops checks: we count them only if they are from squares from
+ // which we can't give a queen check, because queen checks are more valuable.
+ Bitboard BishopCheck = b2
+ & attackedBy[Them][BISHOP]
+ & safe
+ & ~QueenCheck;
+
+ if (BishopCheck)
kingDanger += BishopSafeCheck;
else
- unsafeChecks |= b2;
+ unsafeChecks |= b2 & attackedBy[Them][BISHOP];
// Enemy knights checks
b = pos.attacks_from<KNIGHT>(ksq) & attackedBy[Them][KNIGHT];
+
if (b & safe)
kingDanger += KnightSafeCheck;
else