@@ -60,32 +60,31 @@ namespace {
6060 // Unsupported pawn penalty
6161 const Score UnsupportedPawnPenalty = S(20 , 10 );
6262
63- // Weakness of our pawn shelter in front of the king indexed by [file pairs (a/h,b/g,c/f,d/e) ][rank]
63+ // Weakness of our pawn shelter in front of the king by [distance from edge ][rank]
6464 const Value ShelterWeakness[][RANK_NB] = {
6565 { V (101 ), V (10 ), V (24 ), V (68 ), V (90 ), V ( 95 ), V (102 ) },
6666 { V (105 ), V ( 1 ), V (30 ), V (76 ), V (95 ), V (100 ), V (105 ) },
6767 { V ( 99 ), V ( 0 ), V (32 ), V (72 ), V (92 ), V (101 ), V (100 ) },
6868 { V ( 94 ), V ( 1 ), V (31 ), V (68 ), V (89 ), V ( 98 ), V (106 ) } };
6969
70- // Danger of enemy pawns moving toward our king indexed by
71- // [file pairs (a/h,b/g,c/f,d/e)][no friendly pawn | pawn unblocked | pawn blocked by pawn| pawn blocked by king][rank of enemy pawn]
70+ // Danger of enemy pawns moving toward our king by [type][distance from edge][rank]
7271 const Value StormDanger[][4 ][RANK_NB] = {
7372 { { V ( 0 ), V ( 61 ), V ( 128 ), V (47 ), V (27 ) },
74- { V (25 ), V ( 33 ), V ( 95 ), V (39 ), V (21 ) },
75- { V ( 0 ), V ( 0 ), V ( 80 ), V (14 ), V ( 8 ) },
76- { V ( 0 ), V (- 300 ), V (- 300 ), V (54 ), V (23 ) } },
77- { { V ( 0 ), V ( 66 ), V ( 131 ), V (49 ), V (27 ) },
73+ { V ( 0 ), V ( 66 ), V ( 131 ), V (49 ), V (27 ) },
74+ { V ( 0 ), V ( 62 ), V ( 126 ), V (52 ), V (23 ) },
75+ { V ( 0 ), V ( 63 ), V ( 128 ), V (52 ), V (26 ) } },
76+ { { V (25 ), V ( 33 ), V ( 95 ), V (39 ), V (21 ) },
7877 { V (24 ), V ( 33 ), V ( 97 ), V (42 ), V (22 ) },
79- { V ( 0 ), V ( 0 ), V ( 163 ), V (28 ), V (12 ) },
80- { V ( 0 ), V ( 67 ), V ( 128 ), V (46 ), V (24 ) } },
81- { { V ( 0 ), V ( 62 ), V ( 126 ), V (52 ), V (23 ) },
8278 { V (24 ), V ( 33 ), V ( 93 ), V (35 ), V (23 ) },
79+ { V (26 ), V ( 27 ), V ( 96 ), V (37 ), V (22 ) } },
80+ { { V ( 0 ), V ( 0 ), V ( 80 ), V (14 ), V ( 8 ) },
81+ { V ( 0 ), V ( 0 ), V ( 163 ), V (28 ), V (12 ) },
8382 { V ( 0 ), V ( 0 ), V ( 163 ), V (25 ), V (15 ) },
84- { V ( 0 ), V ( 64 ), V ( 130 ), V (50 ), V (29 ) } },
85- { { V ( 0 ), V ( 63 ), V ( 128 ), V (52 ), V (26 ) },
86- { V (26 ), V ( 27 ), V ( 96 ), V (37 ), V (22 ) },
87- { V ( 0 ), V ( 0 ), V ( 161 ), V (24 ), V (14 ) },
88- { V ( 0 ), V ( 63 ), V ( 127 ), V (51 ), V (24 ) } } };
83+ { V ( 0 ), V ( 0 ), V ( 161 ), V (24 ), V (14 ) } },
84+ { { V ( 0 ), V (- 300 ), V (- 300 ), V (54 ), V (23 ) },
85+ { V ( 0 ), V ( 67 ), V ( 128 ), V (46 ), V (24 ) },
86+ { V ( 0 ), V ( 64 ), V ( 130 ), V (50 ), V (29 ) },
87+ { V ( 0 ), V ( 63 ), V ( 127 ), V (51 ), V (24 ) } } };
8988
9089 // Max bonus for king safety. Corresponds to start position with all the pawns
9190 // in front of the king and no enemy pawn on the horizon.
@@ -247,13 +246,15 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) {
247246
248247 const Color Them = (Us == WHITE ? BLACK : WHITE);
249248
249+ enum { NoFriendlyPawn, Unblocked, BlockedByPawn, BlockedByKing };
250+
250251 Bitboard b = pos.pieces (PAWN) & (in_front_bb (Us, rank_of (ksq)) | rank_bb (ksq));
251252 Bitboard ourPawns = b & pos.pieces (Us);
252253 Bitboard theirPawns = b & pos.pieces (Them);
253254 Value safety = MaxSafetyBonus;
254- File kf = std::max (FILE_B, std::min (FILE_G, file_of (ksq)));
255+ File center = std::max (FILE_B, std::min (FILE_G, file_of (ksq)));
255256
256- for (File f = kf - File (1 ); f <= kf + File (1 ); ++f)
257+ for (File f = center - File (1 ); f <= center + File (1 ); ++f)
257258 {
258259 b = ourPawns & file_bb (f);
259260 Rank rkUs = b ? relative_rank (Us, backmost_sq (Us, b)) : RANK_1;
@@ -262,12 +263,11 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) {
262263 Rank rkThem = b ? relative_rank (Us, frontmost_sq (Them, b)) : RANK_1;
263264
264265 safety -= ShelterWeakness[std::min (f, FILE_H - f)][rkUs]
265- + StormDanger[std::min (f, FILE_H - f)]
266- [file_of (ksq) == f && relative_rank (Us, ksq) == rkThem - 1 ? 3 :
267- rkUs == RANK_1 ? 0 :
268- rkThem != rkUs + 1 ? 1 :
269- /* pawn blocked by pawn */ 2 ]
270- [rkThem];
266+ + StormDanger
267+ [f == file_of (ksq) && rkThem == relative_rank (Us, ksq) + 1 ? BlockedByKing :
268+ rkUs == RANK_1 ? NoFriendlyPawn :
269+ rkThem == rkUs + 1 ? BlockedByPawn : Unblocked]
270+ [std::min (f, FILE_H - f)][rkThem];
271271 }
272272
273273 return safety;
0 commit comments