5 check_futile_score_quies( const tree_t * restrict ptree, unsigned int move,
6 int old_val, int new_val, int turn )
8 const int ifrom = I2From(move);
14 if ( I2PieceMove(move) == king )
17 fsp = new_val - old_val;
22 ipc_cap = -(int)UToCap(move);
26 ipc_cap = (int)UToCap(move);
31 fmt -= p_value_ex[15+ipc_cap];
32 fsp -= estimate_score_diff( ptree, move, turn );
33 if ( fsp > fmg_cap_king ) { fmg_cap_king = fsp; }
35 else if ( fsp > fmg_misc_king ) { fmg_misc_king = fsp; }
37 if ( fmt > fmg_mt ) { fmg_mt = fmt; }
40 fsp = new_val - old_val - estimate_score_diff( ptree, move, turn );
43 fmt = new_val + MATERIAL;
44 ipc_cap = -(int)UToCap(move);
47 fmt = new_val - MATERIAL;
48 ipc_cap = (int)UToCap(move);
50 if ( ifrom >= nsquare )
52 if ( fsp > fmg_drop ) { fmg_drop = fsp; }
55 if ( I2IsPromote(move) )
57 fmt -= p_value_pm[7+I2PieceMove(move)];
62 fmt -= p_value_ex[15+ipc_cap];
63 if ( fsp > fmg_cap ) { fmg_cap = fsp; }
65 else if ( fsp > fmg_misc ) { fmg_misc = fsp; }
68 if ( fmt > fmg_mt ) { fmg_mt = fmt; }
74 eval_max_score( const tree_t * restrict ptree, unsigned int move,
75 int value, int turn, int diff )
77 int score_mt, score_sp, ipc_cap;
81 if ( I2From(move) >= nsquare )
83 score_sp = value + diff + fmg_drop + FMG_MG;
84 score_mt = ( turn ? -MATERIAL : MATERIAL ) + fmg_mt + FMG_MG_MT;
87 score_sp = diff + value;
88 score_mt = fmg_mt + FMG_MG_MT;
92 ipc_cap = -(int)UToCap(move);
96 ipc_cap = (int)UToCap(move);
98 if ( I2PieceMove(move) == king )
102 score_mt += p_value_ex[15+ipc_cap];
103 score_sp += fmg_cap_king;
105 else { score_sp += fmg_misc_king; }
106 score_sp += FMG_MG_KING;
111 score_mt += p_value_ex[15+ipc_cap];
114 else { score_sp += fmg_misc; }
116 if ( I2IsPromote(move) )
118 score_mt += p_value_pm[7+I2PieceMove(move)];
124 return score_mt < score_sp ? score_mt : score_sp;
129 estimate_score_diff( const tree_t * restrict ptree, unsigned int move,
132 const int ibk = SQ_BKING;
133 const int iwk = Inv(SQ_WKING);
134 const int ifrom = I2From(move);
135 const int ito = I2To(move);
136 int diff, ipc_move, ipc_cap, ipro_pc_move;
138 if ( I2PieceMove(move) == king )
140 ipc_cap = (int)UToCap(move);
143 diff = -(int)PcOnSq( ibk, aikpp[15+ipc_cap]+ito );
144 diff += (int)PcOnSq( iwk, aikpp[15-ipc_cap]+Inv(ito) );
146 if ( turn ) { diff -= p_value_ex[15+ipc_cap]; }
147 else { diff += p_value_ex[15-ipc_cap]; }
151 else if ( ifrom >= nsquare )
153 ipc_move = turn ? -(int)From2Drop(ifrom) : (int)From2Drop(ifrom);
154 diff = (int)PcOnSq( ibk, aikpp[15+ipc_move]+ito );
155 diff -= (int)PcOnSq( iwk, aikpp[15-ipc_move]+Inv(ito) );
161 ipc_move = -(int)I2PieceMove(move);
162 ipc_cap = (int)UToCap(move);
163 ipro_pc_move = ipc_move - promote;
166 ipc_move = (int)I2PieceMove(move);
167 ipc_cap = -(int)UToCap(move);
168 ipro_pc_move = ipc_move + promote;
170 if ( I2IsPromote(move) && ipc_cap )
172 diff = -(int)PcOnSq( ibk, aikpp[15+ipc_move] + ifrom );
173 diff += (int)PcOnSq( ibk, aikpp[15+ipro_pc_move] + ito );
174 diff += -(int)PcOnSq( ibk, aikpp[15+ipc_cap] + ito );
175 diff += (int)PcOnSq( iwk, aikpp[15-ipc_move] + Inv(ifrom) );
176 diff += -(int)PcOnSq( iwk, aikpp[15-ipro_pc_move] + Inv(ito) );
177 diff += (int)PcOnSq( iwk, aikpp[15-ipc_cap] + Inv(ito) );
181 diff -= p_value_pm[7+ipc_move];
182 diff -= p_value_ex[15+ipc_cap];
185 diff += p_value_pm[7+ipc_move];
186 diff += p_value_ex[15+ipc_cap];
191 diff = -(int)PcOnSq( ibk, aikpp[15+ipc_move] + ifrom );
192 diff += (int)PcOnSq( ibk, aikpp[15+ipc_move] + ito );
193 diff += -(int)PcOnSq( ibk, aikpp[15+ipc_cap] + ito );
194 diff += (int)PcOnSq( iwk, aikpp[15-ipc_move] + Inv(ifrom) );
195 diff += -(int)PcOnSq( iwk, aikpp[15-ipc_move] + Inv(ito) );
196 diff += (int)PcOnSq( iwk, aikpp[15-ipc_cap] + Inv(ito) );
198 diff += turn ? -p_value_ex[15+ipc_cap] : p_value_ex[15+ipc_cap];
200 else if ( I2IsPromote(move) )
202 diff = -(int)PcOnSq( ibk, aikpp[15+ipc_move] + ifrom );
203 diff += (int)PcOnSq( ibk, aikpp[15+ipro_pc_move] + ito );
204 diff += (int)PcOnSq( iwk, aikpp[15-ipc_move] + Inv(ifrom) );
205 diff += -(int)PcOnSq( iwk, aikpp[15-ipro_pc_move] + Inv(ito) );
207 diff += turn ? -p_value_pm[7+ipc_move] : p_value_pm[7+ipc_move];
210 diff = -(int)PcOnSq( ibk, aikpp[15+ipc_move] + ifrom );
211 diff += (int)PcOnSq( ibk, aikpp[15+ipc_move] + ito );
212 diff += (int)PcOnSq( iwk, aikpp[15-ipc_move] + Inv(ifrom) );
213 diff += -(int)PcOnSq( iwk, aikpp[15-ipc_move] + Inv(ito) );
218 if ( turn ) { diff = -diff; }