1 #include "chess.h"
2 /* *INDENT-OFF* */
3 /*
4  ************************************************************
5  *                                                          *
6  *  Pawn scoring terms.                                     *
7  *                                                          *
8  ************************************************************
9  */
10 const int pawn_can_promote          = 525;
11 const int pawn_file_width           =   8;
12 const int pawn_unsupported[2]       = { -8, -4 };
13 const int pawn_defects[2][8] = {
14   { 0, 0, 0, 1, 2, 3, 0, 0 },               /* [black][8] */
15   { 0, 0, 3, 2, 1, 0, 0, 0 }                /* [white][8] */
16 };
17 const int passed_pawn[8] = { 0, 0, 0, 2, 6, 12, 21, 0 };
18 const int passed_pawn_base[2] = { 4, 8 };
19 const int passed_pawn_free_advance = 8;
20 const int passed_pawn_free_advance_1 = 5;
21 const int passed_pawn_defended = 3;
22 const int passed_pawn_defended_1 = 2;
23 const int passed_pawn_candidate[2][8] = {
24   { 0, 2, 2,  6, 13, 32, 0, 0 },            /* [mg][rank] */
25   { 0, 5, 5, 11, 27, 65, 0, 0 }             /* [eg][rank] */
26 };
27 const int pawn_doubled[2][8] = {
28   { 7,  8,  9,  9,  9,  9,  8,  7},
29   {22, 19, 19, 19, 19, 19, 19, 22}
30 };
31 const int pawn_isolated[2][8] = {
32   {14, 21, 23, 23, 23, 23, 21, 14},
33   { 5,  7,  8,  8,  8,  8,  7,  5}
34 };
35 const int pawn_backward[2][8] = {
36   { 8, 12, 14, 14, 14, 14, 12,  8},
37   { 2,  3,  3,  3,  3,  3,  3,  2}
38 };
39 const int pawn_connected[2][8][8] = {
40   {{  0,  0,  0,  0,  0,  0,  0,  0 },
41    {  0,  1,  1,  2,  2,  1,  1,  0 },
42    {  1,  2,  2,  3,  3,  2,  2,  1 },
43    {  3,  5,  6, 10, 10,  6,  5,  3 },  /* [mg][file][rank] */
44    { 12, 14, 17, 22, 22, 17, 14, 12 },
45    { 27, 29, 31, 35, 35, 31, 29, 27 },
46    { 54, 63, 65, 70, 70, 65, 63, 54 },
47    {  0,  0,  0,  0,  0,  0,  0,  0 }},
48 
49   {{  0,  0,  0,  0,  0,  0,  0,  0 },
50    {  1,  3,  3,  3,  3,  3,  1,  1 },
51    {  3,  6,  6,  6,  6,  6,  6,  1 },
52    {  6, 10, 10, 10, 10, 10, 10,  3 },  /* [eg][file][rank] */
53    { 13, 17, 17, 17, 17, 17, 17, 13 },
54    { 32, 38, 38, 38, 38, 38, 38, 32 },
55    { 76, 87, 87, 87, 87, 87, 87, 76 },
56    {  0,  0,  0,  0,  0,  0,  0,  0 }}
57 };
58 const int pval[2][64] = {
59    { 0,  0,  0,  0,  0,  0,  0,  0,
60     -5,  0,  0,  0,  0,  0,  0, -5,
61     -5,  0,  0,  0,  0,  0,  0, -5,
62     -5,  0,  3,  5,  5,  3,  0, -5,  /* [mg][black][sq] */
63     -5,  0,  5, 10, 10,  5,  0, -5,
64     -5,  0,  3,  5,  5,  3,  0, -5,
65     -5,  0,  0,  0,  0,  0,  0, -5,
66      0,  0,  0,  0,  0,  0,  0,  0 },
67 
68    { 0,  0,  0,  0,  0,  0,  0,  0,
69     -5,  0,  0,  0,  0,  0,  0, -5,
70     -5,  0,  3,  5,  5,  3,  0, -5,
71     -5,  0,  5, 10, 10,  5,  0, -5,  /* [mg][white][sq] */
72     -5,  0,  3,  5,  5,  3,  0, -5,
73     -5,  0,  0,  0,  0,  0,  0, -5,
74     -5,  0,  0,  0,  0,  0,  0, -5,
75      0,  0,  0,  0,  0,  0,  0,  0 }
76 };
77 /*
78  ************************************************************
79  *                                                          *
80  *  Knight scoring terms.                                   *
81  *                                                          *
82  ************************************************************
83  */
84 const int king_tropism_n[8] = { 3, 3, 3, 2, 1, 0, 0, 0 };
85 const int knight_outpost[2][64] = {
86   { 0, 0, 0, 0, 0, 0, 0, 0,
87     0, 0, 0, 0, 0, 0, 0, 0,
88     0, 1, 4, 4, 4, 4, 1, 0,
89     0, 2, 6, 8, 8, 6, 2, 0,
90     0, 1, 4, 4, 4, 4, 1, 0,   /* [black][sq] */
91     0, 0, 0, 0, 0, 0, 0, 0,
92     0, 0, 0, 0, 0, 0, 0, 0,
93     0, 0, 0, 0, 0, 0, 0, 0 },
94 
95   { 0, 0, 0, 0, 0, 0, 0, 0,
96     0, 0, 0, 0, 0, 0, 0, 0,
97     0, 0, 0, 0, 0, 0, 0, 0,
98     0, 1, 4, 4, 4, 4, 1, 0,
99     0, 2, 6, 8, 8, 6, 2, 0,   /* [white][sq] */
100     0, 1, 4, 4, 4, 4, 1, 0,
101     0, 0, 0, 0, 0, 0, 0, 0,
102     0, 0, 0, 0, 0, 0, 0, 0 }
103 };
104 const int nval[2][2][64] = {
105   {{ -41, -29, -27, -15, -15, -27, -29, -41,
106       -9,   4,  14,  20,  20,  14,   4,  -9,
107       -7,  10,  23,  29,  29,  23,  10,  -7,
108       -5,  12,  25,  32,  32,  25,  12,  -5,  /* [mg][black][sq] */
109       -5,  10,  23,  28,  28,  23,  10,  -5,
110       -7,  -2,  19,  19,  19,  19,  -2,  -7,
111       -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
112      -31, -29, -27, -25, -25, -27, -29, -31 },
113 
114    { -31, -29, -27, -25, -25, -27, -29, -31,
115       -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
116       -7,  -2,  19,  19,  19,  19,  -2,  -7,
117       -5,  10,  23,  28,  28,  23,  10,  -5,  /* [mg][white][sq] */
118       -5,  12,  25,  32,  32,  25,  12,  -5,
119       -7,  10,  23,  29,  29,  23,  10,  -7,
120       -9,   4,  14,  20,  20,  14,   4,  -9,
121      -41, -29, -27, -15, -15, -27, -29, -41 }},
122 
123   {{ -41, -29, -27, -15, -15, -27, -29, -41,
124       -9,   4,  14,  20,  20,  14,   4,  -9,
125       -7,  10,  23,  29,  29,  23,  10,  -7,
126       -5,  12,  25,  32,  32,  25,  12,  -5,  /* [eg][black][sq] */
127       -5,  10,  23,  28,  28,  23,  10,  -5,
128       -7,  -2,  19,  19,  19,  19,  -2,  -7,
129       -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
130      -31, -29, -27, -25, -25, -27, -29, -31 },
131 
132    { -31, -29, -27, -25, -25, -27, -29, -31,
133       -9,  -6,  -2,   0,   0,  -2,  -6,  -9,
134       -7,  -2,  19,  19,  19,  19,  -2,  -7,
135       -5,  10,  23,  28,  28,  23,  10,  -5,  /* [eg][white][sq] */
136       -5,  12,  25,  32,  32,  25,  12,  -5,
137       -7,  10,  23,  29,  29,  23,  10,  -7,
138       -9,   4,  14,  20,  20,  14,   4,  -9,
139      -41, -29, -27, -15, -15, -27, -29, -41 }}
140 };
141 /*
142  ************************************************************
143  *                                                          *
144  *  Bishop scoring terms.                                   *
145  *                                                          *
146  ************************************************************
147  */
148 const int bishop_trapped            = 174;
149 const int bishop_pawns_on_color[2]  = { 4, 6 };
150 const int bishop_wing_pawns[2]      = { 18, 36 };
151 const int bishop_pair[2]            = { 38, 56 };
152 const int king_tropism_b[8] = { 2, 2, 2, 1, 0, 0, 0, 0 };
153 const int bishop_outpost[2][64] = {
154   { 0, 0, 0, 0, 0, 0, 0, 0,
155     0, 0, 0, 0, 0, 0, 0, 0,
156     0, 1, 3, 3, 3, 3, 1, 0,
157     0, 3, 5, 5, 5, 5, 3, 0,
158     0, 1, 2, 2, 2, 2, 1, 0,   /* [black][sq] */
159     0, 0, 1, 1, 1, 1, 0, 0,
160     0, 0, 0, 0, 0, 0, 0, 0,
161     0, 0, 0, 0, 0, 0, 0, 0 },
162 
163   { 0, 0, 0, 0, 0, 0, 0, 0,
164     0, 0, 0, 0, 0, 0, 0, 0,
165     0, 0, 1, 1, 1, 1, 0, 0,
166     0, 1, 2, 2, 2, 2, 1, 0,
167     0, 3, 5, 5, 5, 5, 3, 0,   /* [white][sq] */
168     0, 1, 3, 3, 3, 3, 1, 0,
169     0, 0, 0, 0, 0, 0, 0, 0,
170     0, 0, 0, 0, 0, 0, 0, 0 }
171 };
172 const int bval[2][2][64] = {
173   {{  0,   0,   0,   0,   0,   0,   0,   0,
174       0,   4,   4,   4,   4,   4,   4,   0,
175       0,   4,   8,   8,   8,   8,   4,   0,
176       0,   4,   8,  12,  12,   8,   4,   0,
177       0,   4,   8,  12,  12,   8,   4,   0,  /* [mg][black][sq] */
178       0,   4,   8,   8,   8,   8,   4,   0,
179       0,   4,   4,   4,   4,   4,   4,   0,
180     -15, -15, -15, -15, -15, -15, -15, -15},
181 
182    {-15, -15, -15, -15, -15, -15, -15, -15,
183       0,   4,   4,   4,   4,   4,   4,   0,
184       0,   4,   8,   8,   8,   8,   4,   0,
185       0,   4,   8,  12,  12,   8,   4,   0,
186       0,   4,   8,  12,  12,   8,   4,   0,  /* [mg][white][sq] */
187       0,   4,   8,   8,   8,   8,   4,   0,
188       0,   4,   4,   4,   4,   4,   4,   0,
189       0,   0,   0,   0,   0,   0,   0,   0}},
190 
191   {{  0,   0,   0,   0,   0,   0,   0,   0,
192       0,   4,   4,   4,   4,   4,   4,   0,
193       0,   4,   8,   8,   8,   8,   4,   0,
194       0,   4,   8,  12,  12,   8,   4,   0,
195       0,   4,   8,  12,  12,   8,   4,   0,  /* [eg][black][sq] */
196       0,   4,   8,   8,   8,   8,   4,   0,
197       0,   4,   4,   4,   4,   4,   4,   0,
198     -15, -15, -15, -15, -15, -15, -15, -15},
199 
200    {-15, -15, -15, -15, -15, -15, -15, -15,
201       0,   4,   4,   4,   4,   4,   4,   0,
202       0,   4,   8,   8,   8,   8,   4,   0,
203       0,   4,   8,  12,  12,   8,   4,   0,
204       0,   4,   8,  12,  12,   8,   4,   0,  /* [eg][white][sq] */
205       0,   4,   8,   8,   8,   8,   4,   0,
206       0,   4,   4,   4,   4,   4,   4,   0,
207       0,   0,   0,   0,   0,   0,   0,   0}}
208 };
209 /*
210  ************************************************************
211  *                                                          *
212  *  Rook scoring terms.                                     *
213  *                                                          *
214  ************************************************************
215  */
216 const int rook_on_7th[2]          = { 25, 35 };
217 const int rook_connected_7th[2]   = {  6, 10 };
218 const int rook_open_file[2]       = { 35, 20 };
219 const int rook_half_open_file[2]  = { 10, 10 };
220 const int king_tropism_r[8] = { 4, 4, 3, 2, 1, 1, 1, 1 };
221 /*
222  ************************************************************
223  *                                                          *
224  *  Queen scoring terms.                                    *
225  *                                                          *
226  ************************************************************
227  */
228 const int king_tropism_q[8] = { 6, 6, 5, 4, 3, 2, 2, 2 };
229 const int qval[2][2][64] = {
230    {{ 0,   0,   0,   0,   0,   0,   0,   0,
231       0,   0,   4,   4,   4,   4,   0,   0,
232       0,   4,   4,   6,   6,   4,   4,   0,
233       0,   4,   6,   8,   8,   6,   4,   0,
234       0,   4,   6,   8,   8,   6,   4,   0,   /* [mg][black][sq] */
235       0,   4,   4,   6,   6,   4,   4,   0,
236       0,   0,   4,   4,   4,   4,   0,   0,
237       0,   0,   0,   0,   0,   0,   0,   0 },
238 
239     { 0,   0,   0,   0,   0,   0,   0,   0,
240       0,   0,   4,   4,   4,   4,   0,   0,
241       0,   4,   4,   6,   6,   4,   4,   0,
242       0,   4,   6,   8,   8,   6,   4,   0,
243       0,   4,   6,   8,   8,   6,   4,   0,   /* [mg][white][sq] */
244       0,   4,   4,   6,   6,   4,   4,   0,
245       0,   0,   4,   4,   4,   4,   0,   0,
246       0,   0,   0,   0,   0,   0,   0,   0 }},
247 
248    {{ 0,   0,   0,   0,   0,   0,   0,   0,
249       0,   0,   4,   4,   4,   4,   0,   0,
250       0,   4,   4,   6,   6,   4,   4,   0,
251       0,   4,   6,   8,   8,   6,   4,   0,
252       0,   4,   6,   8,   8,   6,   4,   0,   /* [eg][black][sq] */
253       0,   4,   4,   6,   6,   4,   4,   0,
254       0,   0,   4,   4,   4,   4,   0,   0,
255       0,   0,   0,   0,   0,   0,   0,   0 },
256 
257     { 0,   0,   0,   0,   0,   0,   0,   0,
258       0,   0,   4,   4,   4,   4,   0,   0,
259       0,   4,   4,   6,   6,   4,   4,   0,
260       0,   4,   6,   8,   8,   6,   4,   0,
261       0,   4,   6,   8,   8,   6,   4,   0,   /* [eg][white][sq] */
262       0,   4,   4,   6,   6,   4,   4,   0,
263       0,   0,   4,   4,   4,   4,   0,   0,
264       0,   0,   0,   0,   0,   0,   0,   0 }}
265 };
266 /*
267  ************************************************************
268  *                                                          *
269  *  King scoring terms.                                     *
270  *                                                          *
271  ************************************************************
272  */
273 int king_safety[16][16];
274 const int king_safety_mate_threat = 600;
275 const int king_king_tropism       =  10;
276 const int open_file[8]            = { 6, 5, 4, 4, 4, 4, 5, 6 };
277 const int half_open_file[8] = { 4, 4, 3, 3, 3, 3, 4, 4 };
278 const int safety_vector[16] = {
279    0,  7, 14, 21, 28, 35, 42,  49,
280   56, 63, 70, 77, 84, 91, 98, 105
281 };
282 const int tropism_vector[16] = {
283    0,  1,  2,  3,   4,   5,  11,  20,
284   32, 47, 65, 86, 110, 137, 167, 200
285 };
286 const int kval[2][64] = {
287    {-40, -40, -40, -40, -40, -40, -40, -40,
288     -40, -10, -10, -10, -10, -10, -10, -40,
289     -40, -10,  60,  60,  60,  60, -10, -40,
290     -40, -10,  60,  60,  60,  60, -10, -40,
291     -40, -10,  40,  40,  40,  40, -10, -40,   /* [black][sq] */
292     -40, -10,  20,  20,  20,  20, -10, -40,
293     -40, -10, -10, -10, -10, -10, -10, -40,
294     -40, -40, -40, -40, -40, -40, -40, -40 },
295 
296    {-40, -40, -40, -40, -40, -40, -40, -40,
297     -40, -10, -10, -10, -10, -10, -10, -40,
298     -40, -10,  20,  20,  20,  20, -10, -40,
299     -40, -10,  40,  40,  40,  40, -10, -40,
300     -40, -10,  60,  60,  60,  60, -10, -40,   /* [white][sq] */
301     -40, -10,  60,  60,  60,  60, -10, -40,
302     -40, -10, -10, -10, -10, -10, -10, -40,
303     -40, -40, -40, -40, -40, -40, -40, -40 }
304 };
305 /*
306  ************************************************************
307  *                                                          *
308  *  Miscellaneous evaluation constants.                     *
309  *                                                          *
310  ************************************************************
311  */
312 const int bad_trade = 90;
313 const int dark_corner[2] =  { FILEA, FILEH };
314 const int light_corner[2] = { FILEH, FILEA };
315 const int direction[2] =    { -8, 8 };
316 const char square_color[64] = {
317   1, 0, 1, 0, 1, 0, 1, 0,
318   0, 1, 0, 1, 0, 1, 0, 1,
319   1, 0, 1, 0, 1, 0, 1, 0,
320   0, 1, 0, 1, 0, 1, 0, 1,
321   1, 0, 1, 0, 1, 0, 1, 0,
322   0, 1, 0, 1, 0, 1, 0, 1,
323   1, 0, 1, 0, 1, 0, 1, 0,
324   0, 1, 0, 1, 0, 1, 0, 1
325 };
326 /*
327  ************************************************************
328  *                                                          *
329  *  Opening phase development terms.                        *
330  *                                                          *
331  ************************************************************
332  */
333 const int development_thematic      =     12;
334 const int development_losing_castle =     20;
335 const int development_not_castled   =     20;
336 const int wtm_bonus[2]              = { 5, 8 };
337 /*
338  ************************************************************
339  *                                                          *
340  *  Skill command constants (should not be changed)         *
341  *                                                          *
342  ************************************************************
343  */
344 uint64_t burner[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
345 const int burnc[10] = {128000, 64000, 32400, 15200, 7600,
346                          3800,  1960,  1040,   480,  140};
347 /*
348  ************************************************************
349  *                                                          *
350  *  Mop-up scoring terms.  These are used in pawnless end-  *
351  *  games to mate the weaker side.  There is a special PST  *
352  *  B+N vs lone king to make it easier to win with very     *
353  *  shallow search depths.                                  *
354  *                                                          *
355  ************************************************************
356  */
357 const char b_n_mate_dark_squares[64] = {
358   99, 90, 80, 70, 60, 50, 40, 30,
359   90, 80, 70, 60, 50, 40, 30, 40,
360   80, 70, 60, 50, 40, 30, 40, 50,
361   70, 60, 50, 40, 30, 40, 50, 60,
362   60, 50, 40, 30, 40, 50, 60, 70,
363   50, 40, 30, 40, 50, 60, 70, 80,
364   40, 30, 40, 50, 60, 70, 80, 90,
365   30, 40, 50, 60, 70, 80, 90, 99
366 };
367 const char b_n_mate_light_squares[64] = {
368   30, 40, 50, 60, 70, 80, 90, 99,
369   40, 30, 40, 50, 60, 70, 80, 90,
370   50, 40, 30, 40, 50, 60, 70, 80,
371   60, 50, 40, 30, 40, 50, 60, 70,
372   70, 60, 50, 40, 30, 40, 50, 60,
373   80, 70, 60, 50, 40, 30, 40, 50,
374   90, 80, 70, 60, 50, 40, 30, 40,
375   99, 90, 80, 70, 60, 50, 40, 30
376 };
377 const int mate[64] = {
378   200, 180, 160, 140, 140, 160, 180, 200,
379   180, 160, 140, 120, 120, 140, 160, 180,
380   160, 140, 120, 100, 100, 120, 140, 160,
381   140, 120, 100, 100, 100, 100, 120, 140,
382   140, 120, 100, 100, 100, 100, 120, 140,
383   160, 140, 120, 100, 100, 120, 140, 160,
384   180, 160, 140, 120, 120, 140, 160, 180,
385   200, 180, 160, 140, 140, 160, 180, 200
386 };
387 /* *INDENT-ON* */
388