#include "chess.h" /* *INDENT-OFF* */ /* ************************************************************ * * * Pawn scoring terms. * * * ************************************************************ */ const int pawn_can_promote = 525; const int pawn_file_width = 8; const int pawn_unsupported[2] = { -8, -4 }; const int pawn_defects[2][8] = { { 0, 0, 0, 1, 2, 3, 0, 0 }, /* [black][8] */ { 0, 0, 3, 2, 1, 0, 0, 0 } /* [white][8] */ }; const int passed_pawn[8] = { 0, 0, 0, 2, 6, 12, 21, 0 }; const int passed_pawn_base[2] = { 4, 8 }; const int passed_pawn_free_advance = 8; const int passed_pawn_free_advance_1 = 5; const int passed_pawn_defended = 3; const int passed_pawn_defended_1 = 2; const int passed_pawn_candidate[2][8] = { { 0, 2, 2, 6, 13, 32, 0, 0 }, /* [mg][rank] */ { 0, 5, 5, 11, 27, 65, 0, 0 } /* [eg][rank] */ }; const int pawn_doubled[2][8] = { { 5, 8, 9, 9, 9, 9, 8, 5}, {17, 19, 19, 19, 19, 19, 19, 17} }; const int pawn_isolated[2][8] = { {14, 21, 23, 23, 23, 23, 21, 14}, {10, 14, 16, 16, 16, 16, 14, 10} }; const int pawn_backward[2][8] = { {12, 17, 19, 19, 19, 19, 17, 12}, { 8, 11, 16, 16, 16, 16, 11, 8} }; const int pawn_connected[8][8] = { { 0, 0, 0, 0, 0, 0, 0, 0}, { 0, 1, 1, 2, 2, 1, 1, 0}, { 1, 2, 2, 3, 3, 2, 2, 1}, { 3, 5, 5, 6, 6, 5, 5, 3}, { 11, 13, 13, 14, 14, 13, 13, 11}, { 25, 27, 27, 28, 28, 27, 27, 25}, { 48, 52, 52, 53, 53, 52, 52, 48}, { 0, 0, 0, 0, 0, 0, 0, 0} }; const int pval[2][2][64] = { {{ 0, 0, 0, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, 0, 0, 0, 0, -10, -10, 0, 6, 10, 10, 6, 0, -10, /* [mg][black][64] */ -10, 0, 10, 21, 21, 10, 0, -10, -10, 0, 7, 11, 11, 7, 0, -10, -10, 0, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, -10, -10, 0, 7, 11, 11, 7, 0, -10, -10, 0, 10, 21, 21, 10, 0, -10, /* [mg][white][64] */ -10, 0, 6, 10, 10, 6, 0, -10, -10, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0 }}, {{ 0, 0, 0, 0, 0, 0, 0, 0, -4, 1, 1, 1, 1, 1, 1, -4, -4, 1, 1, 1, 1, 1, 1, -4, -4, 1, 4, 6, 6, 4, 1, -4, /* [eg][black][64] */ -4, 1, 6, 12, 12, 6, 1, -4, -4, 1, 5, 7, 7, 5, 1, -4, -4, 1, 1, 1, 1, 1, 1, -4, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, -4, 1, 1, 1, 1, 1, 1, -4, -4, 1, 5, 7, 7, 5, 1, -4, -4, 1, 6, 12, 12, 6, 1, -4, /* [eg][white][64] */ -4, 1, 4, 6, 6, 4, 1, -4, -4, 1, 1, 1, 1, 1, 1, -4, -4, 1, 1, 1, 1, 1, 1, -4, 0, 0, 0, 0, 0, 0, 0, 0 }} }; /* ************************************************************ * * * Knight scoring terms. * * * ************************************************************ */ const int king_tropism_n[8] = { 3, 3, 3, 2, 1, 0, 0, 0 }; const int knight_outpost[2][64] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 4, 1, 0, 0, 2, 6, 8, 8, 6, 2, 0, 0, 1, 4, 4, 4, 4, 1, 0, /* [black][64] */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 4, 1, 0, 0, 2, 6, 8, 8, 6, 2, 0, /* [white][64] */ 0, 1, 4, 4, 4, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; const int nval[2][2][64] = { {{ -41, -29, -27, -15, -15, -27, -29, -41, -9, 4, 14, 20, 20, 14, 4, -9, -7, 10, 23, 29, 29, 23, 10, -7, -5, 12, 25, 32, 32, 25, 12, -5, /* [mg][black][64] */ -5, 10, 23, 28, 28, 23, 10, -5, -7, -2, 19, 19, 19, 19, -2, -7, -9, -6, -2, 0, 0, -2, -6, -9, -31, -29, -27, -25, -25, -27, -29, -31 }, { -31, -29, -27, -25, -25, -27, -29, -31, -9, -6, -2, 0, 0, -2, -6, -9, -7, -2, 19, 19, 19, 19, -2, -7, -5, 10, 23, 28, 28, 23, 10, -5, /* [mg][white][64] */ -5, 12, 25, 32, 32, 25, 12, -5, -7, 10, 23, 29, 29, 23, 10, -7, -9, 4, 14, 20, 20, 14, 4, -9, -41, -29, -27, -15, -15, -27, -29, -41 }}, {{ -41, -29, -27, -15, -15, -27, -29, -41, -9, 4, 14, 20, 20, 14, 4, -9, -7, 10, 23, 29, 29, 23, 10, -7, -5, 12, 25, 32, 32, 25, 12, -5, /* [eg][black][64] */ -5, 10, 23, 28, 28, 23, 10, -5, -7, -2, 19, 19, 19, 19, -2, -7, -9, -6, -2, 0, 0, -2, -6, -9, -31, -29, -27, -25, -25, -27, -29, -31 }, { -31, -29, -27, -25, -25, -27, -29, -31, -9, -6, -2, 0, 0, -2, -6, -9, -7, -2, 19, 19, 19, 19, -2, -7, -5, 10, 23, 28, 28, 23, 10, -5, /* [eg][white][64] */ -5, 12, 25, 32, 32, 25, 12, -5, -7, 10, 23, 29, 29, 23, 10, -7, -9, 4, 14, 20, 20, 14, 4, -9, -41, -29, -27, -15, -15, -27, -29, -41 }} }; /* ************************************************************ * * * Bishop scoring terms. * * * ************************************************************ */ const int bishop_trapped = 174; const int bishop_pawns_on_color[2] = { 4, 6 }; const int bishop_wing_pawns[2] = { 18, 36 }; const int bishop_pair[2] = { 38, 56 }; const int king_tropism_b[8] = { 2, 2, 2, 1, 0, 0, 0, 0 }; const int bishop_outpost[2][64] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 3, 5, 5, 5, 5, 3, 0, 0, 1, 2, 2, 2, 2, 1, 0, /* [black][64] */ 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 2, 2, 2, 2, 1, 0, 0, 3, 5, 5, 5, 5, 3, 0, /* [white][64] */ 0, 1, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; const int bval[2][2][64] = { {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, /* [mg][black][64] */ 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 4, 4, 4, 4, 4, 0, -15, -15, -15, -15, -15, -15, -15, -15}, {-15, -15, -15, -15, -15, -15, -15, -15, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, /* [mg][white][64] */ 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, /* [eg][black][64] */ 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 4, 4, 4, 4, 4, 0, -15, -15, -15, -15, -15, -15, -15, -15}, {-15, -15, -15, -15, -15, -15, -15, -15, 0, 4, 4, 4, 4, 4, 4, 0, 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, 0, 4, 8, 12, 12, 8, 4, 0, /* [eg][white][64] */ 0, 4, 8, 8, 8, 8, 4, 0, 0, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0}} }; /* ************************************************************ * * * Rook scoring terms. * * * ************************************************************ */ const int rook_on_7th[2] = { 25, 35 }; const int rook_connected_7th[2] = { 6, 10 }; const int rook_open_file[2] = { 35, 20 }; const int rook_half_open_file[2] = { 10, 10 }; const int king_tropism_r[8] = { 4, 4, 3, 2, 1, 1, 1, 1 }; /* ************************************************************ * * * Queen scoring terms. * * * ************************************************************ */ const int king_tropism_q[8] = { 6, 6, 5, 4, 3, 2, 2, 2 }; const int qval[2][2][64] = { {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 6, 6, 4, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, /* [mg][black][64] */ 0, 4, 4, 6, 6, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 6, 6, 4, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, /* [mg][white][64] */ 0, 4, 4, 6, 6, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}, {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 6, 6, 4, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, /* [eg][black][64] */ 0, 4, 4, 6, 6, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 4, 4, 6, 6, 4, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, 0, 4, 6, 8, 8, 6, 4, 0, /* [eg][white][64] */ 0, 4, 4, 6, 6, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }} }; /* ************************************************************ * * * King scoring terms. * * * ************************************************************ */ int king_safety[16][16]; const int king_safety_mate_threat = 600; const int king_king_tropism = 10; const int open_file[8] = { 6, 5, 4, 4, 4, 4, 5, 6 }; const int half_open_file[8] = { 4, 4, 3, 3, 3, 3, 4, 4 }; const int safety_vector[16] = { 0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98, 105 }; const int tropism_vector[16] = { 0, 1, 2, 3, 4, 5, 11, 20, 32, 47, 65, 86, 110, 137, 167, 200 }; const int kval[2][64] = { {-40, -40, -40, -40, -40, -40, -40, -40, -40, -10, -10, -10, -10, -10, -10, -40, -40, -10, 60, 60, 60, 60, -10, -40, -40, -10, 60, 60, 60, 60, -10, -40, -40, -10, 40, 40, 40, 40, -10, -40, /* [black][64] */ -40, -10, 20, 20, 20, 20, -10, -40, -40, -10, -10, -10, -10, -10, -10, -40, -40, -40, -40, -40, -40, -40, -40, -40 }, {-40, -40, -40, -40, -40, -40, -40, -40, -40, -10, -10, -10, -10, -10, -10, -40, -40, -10, 20, 20, 20, 20, -10, -40, -40, -10, 40, 40, 40, 40, -10, -40, -40, -10, 60, 60, 60, 60, -10, -40, /* [white][64] */ -40, -10, 60, 60, 60, 60, -10, -40, -40, -10, -10, -10, -10, -10, -10, -40, -40, -40, -40, -40, -40, -40, -40, -40 } }; /* ************************************************************ * * * Miscellaneous evaluation constants. * * * ************************************************************ */ const int bad_trade = 90; const int dark_corner[2] = { FILEA, FILEH }; const int light_corner[2] = { FILEH, FILEA }; const int direction[2] = { -8, 8 }; const char square_color[64] = { 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1 }; /* ************************************************************ * * * Opening phase development terms. * * * ************************************************************ */ const int development_thematic = 12; const int development_losing_castle = 20; const int development_not_castled = 20; const int wtm_bonus[2] = { 5, 8 }; /* ************************************************************ * * * Skill command constants (should not be changed) * * * ************************************************************ */ uint64_t burner[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; const int burnc[10] = {128000, 64000, 32400, 15200, 7600, 3800, 1960, 1040, 480, 140}; /* ************************************************************ * * * Mop-up scoring terms. These are used in pawnless end- * * games to mate the weaker side. There is a special PST * * B+N vs lone king to make it easier to win with very * * shallow search depths. * * * ************************************************************ */ const char b_n_mate_dark_squares[64] = { 99, 90, 80, 70, 60, 50, 40, 30, 90, 80, 70, 60, 50, 40, 30, 40, 80, 70, 60, 50, 40, 30, 40, 50, 70, 60, 50, 40, 30, 40, 50, 60, 60, 50, 40, 30, 40, 50, 60, 70, 50, 40, 30, 40, 50, 60, 70, 80, 40, 30, 40, 50, 60, 70, 80, 90, 30, 40, 50, 60, 70, 80, 90, 99 }; const char b_n_mate_light_squares[64] = { 30, 40, 50, 60, 70, 80, 90, 99, 40, 30, 40, 50, 60, 70, 80, 90, 50, 40, 30, 40, 50, 60, 70, 80, 60, 50, 40, 30, 40, 50, 60, 70, 70, 60, 50, 40, 30, 40, 50, 60, 80, 70, 60, 50, 40, 30, 40, 50, 90, 80, 70, 60, 50, 40, 30, 40, 99, 90, 80, 70, 60, 50, 40, 30 }; const int mate[64] = { 200, 180, 160, 140, 140, 160, 180, 200, 180, 160, 140, 120, 120, 140, 160, 180, 160, 140, 120, 100, 100, 120, 140, 160, 140, 120, 100, 100, 100, 100, 120, 140, 140, 120, 100, 100, 100, 100, 120, 140, 160, 140, 120, 100, 100, 120, 140, 160, 180, 160, 140, 120, 120, 140, 160, 180, 200, 180, 160, 140, 140, 160, 180, 200 }; /* *INDENT-ON* */