- // Doubled pawn penalty by file
- const Score DoubledPawnPenalty[8] = {
- S(13, 43), S(20, 48), S(23, 48), S(23, 48),
- S(23, 48), S(23, 48), S(20, 48), S(13, 43)
- };
-
- // Isolated pawn penalty by file
- const Score IsolatedPawnPenalty[8] = {
- S(25, 30), S(36, 35), S(40, 35), S(40, 35),
- S(40, 35), S(40, 35), S(36, 35), S(25, 30)
- };
-
- // Backward pawn penalty by file
- const Score BackwardPawnPenalty[8] = {
- S(20, 28), S(29, 31), S(33, 31), S(33, 31),
- S(33, 31), S(33, 31), S(29, 31), S(20, 28)
- };
-
- // Pawn chain membership bonus by file
- const Score ChainBonus[8] = {
- S(11,-1), S(13,-1), S(13,-1), S(14,-1),
- S(14,-1), S(13,-1), S(13,-1), S(11,-1)
- };
-
- // Candidate passed pawn bonus by rank
- const Score CandidateBonus[8] = {
- S( 0, 0), S( 6, 13), S(6,13), S(14,29),
- S(34,68), S(83,166), S(0, 0), S( 0, 0)
- };
-
- // Pawn storm tables for positions with opposite castling
- const int QStormTable[64] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- -22,-22,-22,-14,-6, 0, 0, 0,
- -6,-10,-10,-10,-6, 0, 0, 0,
- 4, 12, 16, 12, 4, 0, 0, 0,
- 16, 23, 23, 16, 0, 0, 0, 0,
- 23, 31, 31, 23, 0, 0, 0, 0,
- 23, 31, 31, 23, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0
+ // Pawn penalties
+ constexpr Score Isolated = S(13, 16);
+ constexpr Score Backward = S(17, 11);
+ constexpr Score Doubled = S(13, 40);
+
+ // Connected pawn bonus by opposed, phalanx, #support and rank
+ Score Connected[2][2][3][RANK_NB];
+
+ // Strength of pawn shelter for our king by [distance from edge][rank].
+ // RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king.
+ constexpr Value ShelterStrength[int(FILE_NB) / 2][RANK_NB] = {
+ { V( 7), V(76), V( 84), V( 38), V( 7), V( 30), V(-19) },
+ { V(-13), V(83), V( 42), V(-27), V( 2), V(-32), V(-45) },
+ { V(-26), V(63), V( 5), V(-44), V( -5), V( 2), V(-59) },
+ { V(-19), V(53), V(-11), V(-22), V(-12), V(-51), V(-60) }