6 swap( const tree_t * restrict ptree, unsigned int move, int root_alpha,
7 int root_beta, int turn )
9 bitboard_t bb, bb_temp, bb_attack;
11 int attacked_piece, from, to, nc, ir0;
12 int piece_cap, piece, value, xvalue, alpha, beta, is_promo;
14 from = (int)I2From( move );
15 to = (int)I2To( move );
17 if ( from >= nsquare )
20 piece = From2Drop( from );
21 attacked_piece = p_value_ex[15+piece];
24 piece = (int)I2PieceMove( move );
25 piece_cap = (int)UToCap( move );
26 is_promo = (int)I2IsPromote( move );
28 value = p_value_ex[15+piece_cap];
29 attacked_piece = p_value_ex[15+piece];
32 value += benefit2promo[7+piece];
33 attacked_piece += benefit2promo[7+piece];
35 xvalue = value - attacked_piece - MT_PRO_PAWN;
36 if ( xvalue >= root_beta ) { return xvalue; }
39 bb_attack = attacks_to_piece( ptree, to );
44 /* remove an attacker, and add a hidden piece to attack bitmap */
47 Xor( from, bb_attack );
48 switch ( adirec[to][from] )
51 ir0 = aslide[from].ir0;
52 uattack = AttackRank( from );
53 if ( from > to ) { uattack &= abb_plus_rays[from].p[ir0]; }
54 else { uattack &= abb_minus_rays[from].p[ir0]; }
55 uattack &= BB_B_RD.p[ir0] | BB_W_RD.p[ir0];
56 bb_attack.p[ir0] |= uattack;
60 bb = AttackFile( from );
61 BBOr( bb_temp, BB_B_RD, BB_W_RD );
64 BBOr( bb_temp, bb_temp, BB_BLANCE );
65 BBAnd( bb, bb, abb_plus_rays[from] );
68 BBOr( bb_temp, bb_temp, BB_WLANCE );
69 BBAnd( bb, bb, abb_minus_rays[from] );
71 BBAnd( bb, bb, bb_temp );
72 BBOr( bb_attack, bb_attack, bb );
76 bb = AttackDiag1( from );
77 if ( from > to ) { BBAnd( bb, bb, abb_plus_rays[from] ); }
78 else { BBAnd( bb, bb, abb_minus_rays[from] ); }
79 BBOr( bb_temp, BB_B_BH, BB_W_BH );
80 BBAnd( bb, bb, bb_temp );
81 BBOr( bb_attack, bb_attack, bb );
85 bb = AttackDiag2( from );
86 if ( from > to ) { BBAnd( bb, bb, abb_plus_rays[from] ); }
87 else { BBAnd( bb, bb, abb_minus_rays[from] ); }
88 BBOr( bb_temp, BB_B_BH, BB_W_BH );
89 BBAnd( bb, bb, bb_temp );
90 BBOr( bb_attack, bb_attack, bb );
95 if ( ! BBToU( bb_attack ) ) { break; }
97 /* find a cheapest piece attacking the target */
99 value = attacked_piece - value;
102 if( BBContract( bb_attack, BB_WPAWN ) )
105 attacked_piece = MT_CAP_PAWN;
108 value += MT_PRO_PAWN;
109 attacked_piece += MT_PRO_PAWN;
113 BBAnd( bb, BB_WLANCE, bb_attack );
116 from = FirstOne( bb );
117 attacked_piece = MT_CAP_LANCE;
120 value += MT_PRO_LANCE;
121 attacked_piece += MT_PRO_LANCE;
125 BBAnd( bb, BB_WKNIGHT, bb_attack );
128 from = FirstOne( bb );
129 attacked_piece = MT_CAP_KNIGHT;
132 value += MT_PRO_KNIGHT;
133 attacked_piece += MT_PRO_KNIGHT;
137 BBAnd( bb, BB_WPRO_PAWN, bb_attack );
140 from = FirstOne( bb );
141 attacked_piece = MT_CAP_PRO_PAWN;
144 BBAnd( bb, BB_WPRO_LANCE, bb_attack );
147 from = FirstOne( bb );
148 attacked_piece = MT_CAP_PRO_LANCE;
151 BBAnd( bb, BB_WPRO_KNIGHT, bb_attack );
154 from = FirstOne( bb );
155 attacked_piece = MT_CAP_PRO_KNIGHT;
158 BBAnd( bb, BB_WSILVER, bb_attack );
161 from = FirstOne( bb );
162 attacked_piece = MT_CAP_SILVER;
163 if ( from > 53 || to > 53 )
165 value += MT_PRO_SILVER;
166 attacked_piece += MT_PRO_SILVER;
170 BBAnd( bb, BB_WPRO_SILVER, bb_attack );
173 from = FirstOne( bb );
174 attacked_piece = MT_CAP_PRO_SILVER;
177 BBAnd( bb, BB_WGOLD, bb_attack );
180 from = FirstOne( bb );
181 attacked_piece = MT_CAP_GOLD;
184 BBAnd( bb, BB_WBISHOP, bb_attack );
187 from = FirstOne( bb );
188 attacked_piece = MT_CAP_BISHOP;
189 if ( from > 53 || to > 53 )
191 value += MT_PRO_BISHOP;
192 attacked_piece += MT_PRO_BISHOP;
196 BBAnd( bb, BB_WHORSE, bb_attack );
199 from = FirstOne( bb );
200 attacked_piece = MT_CAP_HORSE;
203 BBAnd( bb, BB_WROOK, bb_attack );
206 from = FirstOne( bb );
207 attacked_piece = MT_CAP_ROOK;
208 if ( from > 53 || to > 53 )
210 value += MT_PRO_ROOK;
211 attacked_piece += MT_PRO_ROOK;
215 BBAnd( bb, BB_WDRAGON, bb_attack );
218 from = FirstOne( bb );
219 attacked_piece = MT_CAP_DRAGON;
222 if( BBContract( bb_attack, BB_WKING ) )
225 attacked_piece = MT_CAP_KING;
230 if( BBContract( bb_attack, BB_BPAWN ) )
233 attacked_piece = MT_CAP_PAWN;
236 value += MT_PRO_PAWN;
237 attacked_piece += MT_PRO_PAWN;
241 BBAnd( bb, BB_BLANCE, bb_attack );
244 from = FirstOne( bb );
245 attacked_piece = MT_CAP_LANCE;
248 value += MT_PRO_LANCE;
249 attacked_piece += MT_PRO_LANCE;
253 BBAnd( bb, BB_BKNIGHT, bb_attack );
256 from = FirstOne( bb );
257 attacked_piece = MT_CAP_KNIGHT;
260 value += MT_PRO_KNIGHT;
261 attacked_piece += MT_PRO_KNIGHT;
265 BBAnd( bb, BB_BPRO_PAWN, bb_attack );
268 from = FirstOne( bb );
269 attacked_piece = MT_CAP_PRO_PAWN;
272 BBAnd( bb, BB_BPRO_LANCE, bb_attack );
275 from = FirstOne( bb );
276 attacked_piece = MT_CAP_PRO_LANCE;
279 BBAnd( bb, BB_BPRO_KNIGHT, bb_attack );
282 from = FirstOne( bb );
283 attacked_piece = MT_CAP_PRO_KNIGHT;
286 BBAnd( bb, BB_BSILVER, bb_attack );
289 from = FirstOne( bb );
290 attacked_piece = MT_CAP_SILVER;
291 if ( from < 27 || to < 27 )
293 value += MT_PRO_SILVER;
294 attacked_piece += MT_PRO_SILVER;
298 BBAnd( bb, BB_BPRO_SILVER, bb_attack );
301 from = FirstOne( bb );
302 attacked_piece = MT_CAP_PRO_SILVER;
305 BBAnd( bb, BB_BGOLD, bb_attack );
308 from = FirstOne( bb );
309 attacked_piece = MT_CAP_GOLD;
312 BBAnd( bb, BB_BBISHOP, bb_attack );
315 from = FirstOne( bb );
316 attacked_piece = MT_CAP_BISHOP;
317 if ( from < 27 || to < 27 )
319 value += MT_PRO_BISHOP;
320 attacked_piece += MT_PRO_BISHOP;
324 BBAnd( bb, BB_BHORSE, bb_attack );
327 from = FirstOne( bb );
328 attacked_piece = MT_CAP_HORSE;
331 BBAnd( bb, BB_BROOK, bb_attack );
334 from = FirstOne( bb );
335 attacked_piece = MT_CAP_ROOK;
336 if ( from < 27 || to < 27 )
338 value += MT_PRO_ROOK;
339 attacked_piece += MT_PRO_ROOK;
343 BBAnd( bb, BB_BDRAGON, bb_attack );
346 from = FirstOne( bb );
347 attacked_piece = MT_CAP_DRAGON;
350 if( BBContract( bb_attack, BB_BKING ) )
353 attacked_piece = MT_CAP_KING;
362 if ( -value > alpha )
364 if ( -value >= beta ) { return beta; }
365 if ( -value >= root_beta ) { return -value; }
369 xvalue = attacked_piece + MT_PRO_PAWN - value;
370 if ( xvalue <= alpha ) { return alpha; }
371 if ( xvalue <= root_alpha ) { return xvalue; }
377 if ( value <= alpha ) { return alpha; }
378 if ( value <= root_alpha ) { return value; }
382 xvalue = value - attacked_piece - MT_PRO_PAWN;
383 if ( xvalue >= beta ) { return beta; }
384 if ( xvalue >= root_beta ) { return xvalue; }
389 if ( nc & 1 ) { return beta; }
390 else { return alpha; }