@@ -60,32 +60,31 @@ namespace {
60
60
// Unsupported pawn penalty
61
61
const Score UnsupportedPawnPenalty = S(20 , 10 );
62
62
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]
64
64
const Value ShelterWeakness[][RANK_NB] = {
65
65
{ V (101 ), V (10 ), V (24 ), V (68 ), V (90 ), V ( 95 ), V (102 ) },
66
66
{ V (105 ), V ( 1 ), V (30 ), V (76 ), V (95 ), V (100 ), V (105 ) },
67
67
{ V ( 99 ), V ( 0 ), V (32 ), V (72 ), V (92 ), V (101 ), V (100 ) },
68
68
{ V ( 94 ), V ( 1 ), V (31 ), V (68 ), V (89 ), V ( 98 ), V (106 ) } };
69
69
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]
72
71
const Value StormDanger[][4 ][RANK_NB] = {
73
72
{ { 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 ) },
78
77
{ 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 ) },
82
78
{ 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 ) },
83
82
{ 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 ) } } };
89
88
90
89
// Max bonus for king safety. Corresponds to start position with all the pawns
91
90
// 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) {
247
246
248
247
const Color Them = (Us == WHITE ? BLACK : WHITE);
249
248
249
+ enum { NoFriendlyPawn, Unblocked, BlockedByPawn, BlockedByKing };
250
+
250
251
Bitboard b = pos.pieces (PAWN) & (in_front_bb (Us, rank_of (ksq)) | rank_bb (ksq));
251
252
Bitboard ourPawns = b & pos.pieces (Us);
252
253
Bitboard theirPawns = b & pos.pieces (Them);
253
254
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)));
255
256
256
- for (File f = kf - File (1 ); f <= kf + File (1 ); ++f)
257
+ for (File f = center - File (1 ); f <= center + File (1 ); ++f)
257
258
{
258
259
b = ourPawns & file_bb (f);
259
260
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) {
262
263
Rank rkThem = b ? relative_rank (Us, frontmost_sq (Them, b)) : RANK_1;
263
264
264
265
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];
271
271
}
272
272
273
273
return safety;
0 commit comments