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