// We don't use a Score because we process the two components independently.
const Value Passed[][RANK_NB] = {
{ V(5), V( 5), V(31), V(73), V(166), V(252) },
- { V(7), V(14), V(38), V(64), V(137), V(193) }
+ { V(7), V(14), V(38), V(73), V(166), V(252) }
};
// PassedFile[File] contains a bonus according to the file of a passed pawn
const Score TrappedRook = S(92, 0);
const Score Checked = S(20, 20);
const Score ThreatByHangingPawn = S(70, 63);
+ const Score LooseEnemies = S( 0, 25);
const Score Hanging = S(48, 28);
const Score ThreatByPawnPush = S(31, 19);
const Score Unstoppable = S( 0, 20);
b2 = pos.attacks_from<BISHOP>(ksq) & safe;
// Enemy queen safe checks
- b = (b1 | b2) & ei.attackedBy[Them][QUEEN];
- if (b)
- {
- attackUnits += QueenCheck * popcount<Max15>(b);
- score -= Checked;
- }
+ if ((b1 | b2) & ei.attackedBy[Them][QUEEN])
+ attackUnits += QueenCheck, score -= Checked;
// Enemy rooks safe checks
- b = b1 & ei.attackedBy[Them][ROOK];
- if (b)
- {
- attackUnits += RookCheck * popcount<Max15>(b);
- score -= Checked;
- }
+ if (b1 & ei.attackedBy[Them][ROOK])
+ attackUnits += RookCheck, score -= Checked;
// Enemy bishops safe checks
- b = b2 & ei.attackedBy[Them][BISHOP];
- if (b)
- {
- attackUnits += BishopCheck * popcount<Max15>(b);
- score -= Checked;
- }
+ if (b2 & ei.attackedBy[Them][BISHOP])
+ attackUnits += BishopCheck, score -= Checked;
// Enemy knights safe checks
- b = pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT] & safe;
- if (b)
- {
- attackUnits += KnightCheck * popcount<Max15>(b);
- score -= Checked;
- }
+ if (pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT] & safe)
+ attackUnits += KnightCheck, score -= Checked;
// Finally, extract the king danger score from the KingDanger[]
// array and subtract the score from the evaluation.
}
- // evaluate_threats() assigns bonuses according to the types of the attacking
+ // evaluate_threats() assigns bonuses according to the types of the attacking
// and the attacked pieces.
template<Color Us, bool DoTrace>
Bitboard b, weak, defended, safeThreats;
Score score = SCORE_ZERO;
+ // Small bonus if the opponent has loose pawns or pieces
+ if ( (pos.pieces(Them) ^ pos.pieces(Them, QUEEN, KING))
+ & ~(ei.attackedBy[Us][ALL_PIECES] | ei.attackedBy[Them][ALL_PIECES]))
+ score += LooseEnemies;
+
// Non-pawn enemies attacked by a pawn
weak = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Us][PAWN];
// status of the players.
Score evaluate_initiative(const Position& pos, int asymmetry, Value eg) {
- int kingDistance = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
- - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
+ int kingDistance = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
+ - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
int pawns = pos.count<PAWN>(WHITE) + pos.count<PAWN>(BLACK);
// Compute the initiative bonus for the attacking side
- int initiative = 8 * (asymmetry + kingDistance) + 12 * pawns - 120;
+ int initiative = 8 * (asymmetry + kingDistance - 15) + 12 * pawns;
// Now apply the bonus: note that we find the attacking side by extracting
// the sign of the endgame value, and that we carefully cap the bonus so