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);
11 if ( I2PieceMove(move) == king )
14 fsp = new_val - old_val;
19 ipc_cap = -(int)UToCap(move);
23 ipc_cap = (int)UToCap(move);
28 fmt -= p_value_ex[15+ipc_cap];
29 fsp -= estimate_score_diff( ptree, move, turn );
30 if ( fsp > fmg_cap_king ) { fmg_cap_king = fsp; }
32 else if ( fsp > fmg_misc_king ) { fmg_misc_king = fsp; }
34 if ( fmt > fmg_mt ) { fmg_mt = fmt; }
37 fsp = new_val - old_val - estimate_score_diff( ptree, move, turn );
40 fmt = new_val + MATERIAL;
41 ipc_cap = -(int)UToCap(move);
44 fmt = new_val - MATERIAL;
45 ipc_cap = (int)UToCap(move);
47 if ( ifrom >= nsquare )
49 if ( fsp > fmg_drop ) { fmg_drop = fsp; }
52 if ( I2IsPromote(move) )
54 fmt -= benefit2promo[7+I2PieceMove(move)];
59 fmt -= p_value_ex[15+ipc_cap];
60 if ( fsp > fmg_cap ) { fmg_cap = fsp; }
62 else if ( fsp > fmg_misc ) { fmg_misc = fsp; }
65 if ( fmt > fmg_mt ) { fmg_mt = fmt; }
71 eval_max_score( const tree_t * restrict ptree, unsigned int move,
72 int stand_pat, int turn, int diff )
74 int score_mt, score_sp, ipc_cap;
76 if ( I2From(move) >= nsquare )
78 score_sp = stand_pat + diff + fmg_drop + FMG_MG;
79 score_mt = ( turn ? -MATERIAL : MATERIAL ) + fmg_mt + FMG_MG_MT;
82 score_sp = diff + stand_pat;
83 score_mt = fmg_mt + FMG_MG_MT;
87 ipc_cap = -(int)UToCap(move);
91 ipc_cap = (int)UToCap(move);
93 if ( I2PieceMove(move) == king )
97 score_mt += p_value_ex[15+ipc_cap];
98 score_sp += fmg_cap_king;
100 else { score_sp += fmg_misc_king; }
101 score_sp += FMG_MG_KING;
106 score_mt += p_value_ex[15+ipc_cap];
109 else { score_sp += fmg_misc; }
111 if ( I2IsPromote(move) )
113 score_mt += benefit2promo[7+I2PieceMove(move)];
119 return score_mt < score_sp ? score_mt : score_sp;
124 estimate_score_diff( const tree_t * restrict ptree, unsigned int move,
127 const int ibk = SQ_BKING;
128 const int iwk = Inv(SQ_WKING);
129 const int ifrom = I2From(move);
130 const int ito = I2To(move);
131 int diff, ipc_move, ipc_cap, ipro_pc_move;
133 if ( I2PieceMove(move) == king )
135 ipc_cap = (int)UToCap(move);
138 diff = -(int)PcOnSq( ibk, aipos[15+ipc_cap]+ito );
139 diff += (int)PcOnSq( iwk, aipos[15-ipc_cap]+Inv(ito) );
141 if ( turn ) { diff -= p_value_ex[15+ipc_cap]; }
142 else { diff += p_value_ex[15-ipc_cap]; }
146 else if ( ifrom >= nsquare )
148 ipc_move = turn ? -(int)From2Drop(ifrom) : (int)From2Drop(ifrom);
149 diff = (int)PcOnSq( ibk, aipos[15+ipc_move]+ito );
150 diff -= (int)PcOnSq( iwk, aipos[15-ipc_move]+Inv(ito) );
156 ipc_move = -(int)I2PieceMove(move);
157 ipc_cap = (int)UToCap(move);
158 ipro_pc_move = ipc_move - promote;
161 ipc_move = (int)I2PieceMove(move);
162 ipc_cap = -(int)UToCap(move);
163 ipro_pc_move = ipc_move + promote;
165 if ( I2IsPromote(move) && ipc_cap )
167 diff = -(int)PcOnSq( ibk, aipos[15+ipc_move] + ifrom );
168 diff += (int)PcOnSq( ibk, aipos[15+ipro_pc_move] + ito );
169 diff += -(int)PcOnSq( ibk, aipos[15+ipc_cap] + ito );
170 diff += (int)PcOnSq( iwk, aipos[15-ipc_move] + Inv(ifrom) );
171 diff += -(int)PcOnSq( iwk, aipos[15-ipro_pc_move] + Inv(ito) );
172 diff += (int)PcOnSq( iwk, aipos[15-ipc_cap] + Inv(ito) );
176 diff -= benefit2promo[7+ipc_move];
177 diff -= p_value_ex[15+ipc_cap];
180 diff += benefit2promo[7+ipc_move];
181 diff += p_value_ex[15+ipc_cap];
186 diff = -(int)PcOnSq( ibk, aipos[15+ipc_move] + ifrom );
187 diff += (int)PcOnSq( ibk, aipos[15+ipc_move] + ito );
188 diff += -(int)PcOnSq( ibk, aipos[15+ipc_cap] + ito );
189 diff += (int)PcOnSq( iwk, aipos[15-ipc_move] + Inv(ifrom) );
190 diff += -(int)PcOnSq( iwk, aipos[15-ipc_move] + Inv(ito) );
191 diff += (int)PcOnSq( iwk, aipos[15-ipc_cap] + Inv(ito) );
193 diff += turn ? -p_value_ex[15+ipc_cap] : p_value_ex[15+ipc_cap];
195 else if ( I2IsPromote(move) )
197 diff = -(int)PcOnSq( ibk, aipos[15+ipc_move] + ifrom );
198 diff += (int)PcOnSq( ibk, aipos[15+ipro_pc_move] + ito );
199 diff += (int)PcOnSq( iwk, aipos[15-ipc_move] + Inv(ifrom) );
200 diff += -(int)PcOnSq( iwk, aipos[15-ipro_pc_move] + Inv(ito) );
202 diff += turn ? -benefit2promo[7+ipc_move] : benefit2promo[7+ipc_move];
205 diff = -(int)PcOnSq( ibk, aipos[15+ipc_move] + ifrom );
206 diff += (int)PcOnSq( ibk, aipos[15+ipc_move] + ito );
207 diff += (int)PcOnSq( iwk, aipos[15-ipc_move] + Inv(ifrom) );
208 diff += -(int)PcOnSq( iwk, aipos[15-ipc_move] + Inv(ito) );
213 if ( turn ) { diff = -diff; }