// KingAttackWeights array.
int kingAttackersWeight[COLOR_NB];
- // kingAdjacentZoneAttacksCount[color] is the number of attacks to squares
- // directly adjacent to the king of the given color. Pieces which attack
- // more than one square are counted multiple times. For instance, if black's
- // king is on g8 and there's a white knight on g5, this knight adds
- // 2 to kingAdjacentZoneAttacksCount[BLACK].
+ // kingAdjacentZoneAttacksCount[color] is the number of attacks by the given
+ // color to squares directly adjacent to the enemy king. Pieces which attack
+ // more than one square are counted multiple times. For instance, if there is
+ // a white knight on g5 and black's king is on g8, this white knight adds 2
+ // to kingAdjacentZoneAttacksCount[WHITE].
int kingAdjacentZoneAttacksCount[COLOR_NB];
Bitboard pinnedPieces[COLOR_NB];
const Score Unstoppable = S( 0, 20);
const Score Hanging = S(31, 26);
const Score PawnAttackThreat = S(20, 20);
+ const Score PawnSafePush = S( 5, 5);
// Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
// a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
// attacked and undefended squares around our king and the quality of
// the pawn shelter (current 'score' value).
attackUnits = std::min(74, ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them])
- + 8 * ei.kingAdjacentZoneAttacksCount[Them]
+ + 8 * ei.kingAdjacentZoneAttacksCount[Them]
+ 25 * popcount<Max15>(undefended)
- + 11 * (ei.pinnedPieces[Us] != 0)
- - mg_value(score) * 31 / 256
+ + 11 * (ei.pinnedPieces[Us] != 0)
+ - mg_value(score) / 8
- !pos.count<QUEEN>(Them) * 60;
// Analyse the enemy's safe queen contact checks. Firstly, find the
score += more_than_one(b) ? KingOnMany : KingOnOne;
}
- // Add bonus for safe pawn pushes which attacks an enemy piece
+ // Add a small bonus for safe pawn pushes
b = pos.pieces(Us, PAWN) & ~TRank7BB;
b = shift_bb<Up>(b | (shift_bb<Up>(b & TRank2BB) & ~pos.pieces()));
b &= ~pos.pieces()
& ~ei.attackedBy[Them][PAWN]
- & (ei.attackedBy[Us][PAWN] | ~ei.attackedBy[Them][ALL_PIECES]);
+ & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]);
+ if (b)
+ score += popcount<Full>(b) * PawnSafePush;
+
+ // Add another bonus if the pawn push attacks an enemy piece
b = (shift_bb<Left>(b) | shift_bb<Right>(b))
& pos.pieces(Them)
& ~ei.attackedBy[Us][PAWN];
void init() {
- const double MaxSlope = 8.7;
- const double Peak = 1280;
- double t = 0.0;
+ const int MaxSlope = 8700;
+ const int Peak = 1280000;
+ int t = 0;
- for (int i = 1; i < 400; ++i)
+ for (int i = 0; i < 400; ++i)
{
- t = std::min(Peak, std::min(0.027 * i * i, t + MaxSlope));
- KingDanger[i] = apply_weight(make_score(int(t), 0), Weights[KingSafety]);
+ t = std::min(Peak, std::min(i * i * 27, t + MaxSlope));
+ KingDanger[i] = apply_weight(make_score(t / 1000, 0), Weights[KingSafety]);
}
}