5 static bitboard_t add_behind_attacks( int idirec, int ik, bitboard_t bb );
\r
9 b_gen_checks( tree_t * restrict __ptree__, unsigned int * restrict pmove )
\r
11 bitboard_t bb_piece, bb_rook_chk, bb_bishop_chk, bb_chk, bb_move_to;
\r
12 bitboard_t bb_diag1_chk, bb_diag2_chk, bb_file_chk, bb_drop_to, bb_desti;
\r
13 const tree_t * restrict ptree = __ptree__;
\r
14 unsigned int u0, u1, u2;
\r
15 int from, to, sq_wk, idirec;
\r
18 bb_rook_chk = bb_file_chk = AttackFile( sq_wk );
\r
19 bb_rook_chk.p[aslide[sq_wk].ir0] |= AttackRank( sq_wk );
\r
20 bb_diag1_chk = AttackDiag1( sq_wk );
\r
21 bb_diag2_chk = AttackDiag2( sq_wk );
\r
22 BBOr( bb_bishop_chk, bb_diag1_chk, bb_diag2_chk );
\r
23 BBNot( bb_move_to, BB_BOCCUPY );
\r
24 BBOr( bb_drop_to, BB_BOCCUPY, BB_WOCCUPY );
\r
25 BBNot( bb_drop_to, bb_drop_to );
\r
28 idirec = (int)adirec[sq_wk][from];
\r
29 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
32 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
33 BBAnd( bb_chk, bb_chk, abb_king_attacks[from] );
\r
34 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
36 while( BBToU( bb_chk ) )
\r
38 to = LastOne( bb_chk );
\r
40 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(king)
\r
41 | Cap2Move(-BOARD[to]);
\r
46 bb_piece = BB_BDRAGON;
\r
47 while( BBToU( bb_piece ) )
\r
49 from = LastOne( bb_piece );
\r
50 Xor( from, bb_piece );
\r
52 BBOr( bb_chk, bb_rook_chk, abb_king_attacks[sq_wk] );
\r
53 idirec = (int)adirec[sq_wk][from];
\r
54 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
56 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
59 AttackDragon( bb_desti, from );
\r
60 BBAnd( bb_chk, bb_chk, bb_desti );
\r
61 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
63 while( BBToU( bb_chk ) )
\r
65 to = LastOne( bb_chk );
\r
67 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(dragon)
\r
68 | Cap2Move(-BOARD[to]);
\r
72 bb_piece = BB_BHORSE;
\r
73 while( BBToU( bb_piece ) )
\r
75 from = LastOne( bb_piece );
\r
76 Xor( from, bb_piece );
\r
78 BBOr( bb_chk, bb_bishop_chk, abb_king_attacks[sq_wk] );
\r
79 idirec = (int)adirec[sq_wk][from];
\r
80 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
82 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
85 AttackHorse( bb_desti, from );
\r
86 BBAnd( bb_chk, bb_chk, bb_desti );
\r
87 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
89 while( BBToU( bb_chk ) )
\r
91 to = LastOne( bb_chk );
\r
93 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(horse)
\r
94 | Cap2Move(-BOARD[to]);
\r
102 from = last_one12( u1, u2 );
\r
103 u1 ^= abb_mask[from].p[1];
\r
104 u2 ^= abb_mask[from].p[2];
\r
106 AttackRook( bb_desti, from );
\r
108 idirec = (int)adirec[sq_wk][from];
\r
109 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
111 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
114 bb_chk = bb_rook_chk;
\r
115 bb_chk.p[0] |= abb_king_attacks[sq_wk].p[0];
\r
116 BBAnd( bb_chk, bb_chk, bb_desti );
\r
117 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
120 while ( bb_chk.p[0] )
\r
122 to = last_one0( bb_chk.p[0] );
\r
123 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
124 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(rook)
\r
125 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
128 while( bb_chk.p[1] | bb_chk.p[2] )
\r
130 to = last_one12( bb_chk.p[1], bb_chk.p[2] );
\r
131 bb_chk.p[1] ^= abb_mask[to].p[1];
\r
132 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
133 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(rook)
\r
134 | Cap2Move(-BOARD[to]);
\r
138 u0 = BB_BROOK.p[0];
\r
141 from = last_one0( u0 );
\r
142 u0 ^= abb_mask[from].p[0];
\r
144 AttackRook( bb_desti, from );
\r
146 idirec = (int)adirec[sq_wk][from];
\r
147 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
149 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
152 BBOr( bb_chk, bb_rook_chk, abb_king_attacks[sq_wk] );
\r
153 BBAnd( bb_chk, bb_chk, bb_desti );
\r
154 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
157 while( BBToU( bb_chk ) )
\r
159 to = LastOne( bb_chk );
\r
161 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(rook)
\r
162 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
166 u1 = BB_BBISHOP.p[1];
\r
167 u2 = BB_BBISHOP.p[2];
\r
170 from = last_one12( u1, u2 );
\r
171 u1 ^= abb_mask[from].p[1];
\r
172 u2 ^= abb_mask[from].p[2];
\r
174 AttackBishop( bb_desti, from );
\r
176 idirec = (int)adirec[sq_wk][from];
\r
177 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
179 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
182 bb_chk = bb_bishop_chk;
\r
183 bb_chk.p[0] |= abb_king_attacks[sq_wk].p[0];
\r
184 BBAnd( bb_chk, bb_chk, bb_desti );
\r
185 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
188 while ( bb_chk.p[0] )
\r
190 to = last_one0( bb_chk.p[0] );
\r
191 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
192 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(bishop)
\r
193 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
196 while( bb_chk.p[1] | bb_chk.p[2] )
\r
198 to = last_one12( bb_chk.p[1], bb_chk.p[2] );
\r
199 bb_chk.p[1] ^= abb_mask[to].p[1];
\r
200 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
201 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(bishop)
\r
202 | Cap2Move(-BOARD[to]);
\r
206 u0 = BB_BBISHOP.p[0];
\r
209 from = last_one0( u0 );
\r
210 u0 ^= abb_mask[from].p[0];
\r
212 AttackBishop( bb_desti, from );
\r
214 idirec = (int)adirec[sq_wk][from];
\r
215 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
217 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
220 BBOr( bb_chk, bb_bishop_chk, abb_king_attacks[sq_wk] );
\r
221 BBAnd( bb_chk, bb_chk, bb_desti );
\r
222 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
225 while( BBToU( bb_chk ) )
\r
227 to = LastOne( bb_chk );
\r
229 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(bishop)
\r
230 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
235 bb_piece = BB_BTGOLD;
\r
236 while( BBToU( bb_piece ) )
\r
238 from = LastOne( bb_piece );
\r
239 Xor( from, bb_piece );
\r
241 bb_chk = abb_w_gold_attacks[sq_wk];
\r
243 idirec = (int)adirec[sq_wk][from];
\r
244 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
246 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
249 BBAnd( bb_chk, bb_chk, abb_b_gold_attacks[from] );
\r
250 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
252 while( BBToU( bb_chk ) )
\r
254 to = LastOne( bb_chk );
\r
256 *pmove++ = ( To2Move(to) | From2Move(from)
\r
257 | Piece2Move(BOARD[from])
\r
258 | Cap2Move(-BOARD[to]) );
\r
263 u0 = BB_BSILVER.p[0];
\r
266 from = last_one0( u0 );
\r
267 u0 ^= abb_mask[from].p[0];
\r
269 bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
\r
270 bb_chk.p[1] = abb_w_gold_attacks[sq_wk].p[1];
\r
273 idirec = (int)adirec[sq_wk][from];
\r
274 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
276 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
279 bb_chk.p[0] &= bb_move_to.p[0] & abb_b_silver_attacks[from].p[0];
\r
280 bb_chk.p[1] &= bb_move_to.p[1] & abb_b_silver_attacks[from].p[1];
\r
282 while( bb_chk.p[0] | bb_chk.p[1] )
\r
284 to = last_one01( bb_chk.p[0], bb_chk.p[1] );
\r
285 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
286 bb_chk.p[1] ^= abb_mask[to].p[1];
\r
287 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(silver)
\r
288 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
293 u1 = BB_BSILVER.p[1] & 0x7fc0000U;
\r
296 from = last_one1( u1 );
\r
297 u1 ^= abb_mask[from].p[1];
\r
299 bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
\r
300 bb_chk.p[1] = bb_chk.p[2] = 0;
\r
302 idirec = (int)adirec[sq_wk][from];
\r
303 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
305 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
308 bb_chk.p[0] &= bb_move_to.p[0] & abb_b_silver_attacks[from].p[0];
\r
309 while ( bb_chk.p[0] )
\r
311 to = last_one0( bb_chk.p[0] );
\r
312 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
313 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(silver)
\r
314 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
319 bb_piece = BB_BSILVER;
\r
320 while( BBToU( bb_piece ) )
\r
322 from = LastOne( bb_piece );
\r
323 Xor( from, bb_piece );
\r
325 bb_chk = abb_w_silver_attacks[sq_wk];
\r
327 idirec = (int)adirec[sq_wk][from];
\r
328 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
330 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
333 BBAnd( bb_chk, bb_chk, abb_b_silver_attacks[from] );
\r
334 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
336 while( BBToU( bb_chk ) )
\r
338 to = LastOne( bb_chk );
\r
340 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(silver)
\r
341 | Cap2Move(-BOARD[to]);
\r
346 u0 = BB_BKNIGHT.p[0];
\r
347 u1 = BB_BKNIGHT.p[1] & 0x7fffe00U;
\r
350 from = last_one01( u0, u1 );
\r
351 u0 ^= abb_mask[from].p[0];
\r
352 u1 ^= abb_mask[from].p[1];
\r
354 bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
\r
355 bb_chk.p[1] = bb_chk.p[2] = 0;
\r
357 idirec = (int)adirec[sq_wk][from];
\r
358 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
360 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
363 bb_chk.p[0] &= abb_b_knight_attacks[from].p[0] & bb_move_to.p[0];
\r
365 while( bb_chk.p[0] )
\r
367 to = last_one0( bb_chk.p[0] );
\r
368 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
369 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(knight)
\r
370 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
375 u2 = BB_BKNIGHT.p[2];
\r
376 u1 = BB_BKNIGHT.p[1] & 0x3ffffU;
\r
379 from = last_one12( u1, u2 );
\r
380 u2 ^= abb_mask[from].p[2];
\r
381 u1 ^= abb_mask[from].p[1];
\r
383 bb_chk = abb_w_knight_attacks[sq_wk];
\r
385 idirec = (int)adirec[sq_wk][from];
\r
386 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
388 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
391 BBAnd( bb_chk, bb_chk, abb_b_knight_attacks[from] );
\r
392 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
394 while( BBToU( bb_chk ) )
\r
396 to = LastOne( bb_chk );
\r
398 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(knight)
\r
399 | Cap2Move(-BOARD[to]);
\r
404 bb_piece = BB_BLANCE;
\r
405 while( BBToU( bb_piece ) )
\r
407 from = LastOne( bb_piece );
\r
408 Xor( from, bb_piece );
\r
410 bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
\r
411 bb_chk.p[1] = bb_chk.p[2] = 0;
\r
413 idirec = (int)adirec[sq_wk][from];
\r
414 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
416 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
419 BBAnd( bb_chk, bb_chk, AttackFile( from ) );
\r
420 BBAnd( bb_chk, bb_chk, abb_minus_rays[from] );
\r
421 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
423 while( BBToU( bb_chk ) )
\r
425 to = LastOne( bb_chk );
\r
427 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(lance)
\r
428 | Cap2Move(-BOARD[to]) | FLAG_PROMO;
\r
433 u1 = BB_BLANCE.p[1];
\r
434 u2 = BB_BLANCE.p[2];
\r
437 from = last_one12( u1, u2 );
\r
438 u1 ^= abb_mask[from].p[1];
\r
439 u2 ^= abb_mask[from].p[2];
\r
441 bb_chk = bb_file_chk;
\r
442 idirec = (int)adirec[sq_wk][from];
\r
443 if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
\r
445 bb_chk = add_behind_attacks( idirec, sq_wk, bb_chk );
\r
446 BBAnd( bb_chk, bb_chk, abb_minus_rays[from] );
\r
448 else { BBAnd( bb_chk, bb_file_chk, abb_plus_rays[sq_wk] );}
\r
450 BBAnd( bb_chk, bb_chk, AttackFile( from ) );
\r
451 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
452 bb_chk.p[0] = bb_chk.p[0] & 0x1ffU;
\r
454 while( BBToU( bb_chk ) )
\r
456 to = LastOne( bb_chk );
\r
458 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(lance)
\r
459 | Cap2Move(-BOARD[to]);
\r
464 BBAnd( bb_piece, bb_diag1_chk, BB_BPAWN );
\r
465 while ( BBToU(bb_piece) )
\r
467 from = LastOne( bb_piece );
\r
468 Xor( from, bb_piece );
\r
471 if ( BOARD[to] != empty ) { continue; }
\r
473 bb_desti = AttackDiag1( from );
\r
474 if ( BBContract( bb_desti, BB_B_BH ) )
\r
476 *pmove = To2Move(to) | From2Move(from)
\r
477 | Piece2Move(pawn) | Cap2Move(-BOARD[to]);
\r
478 if ( from < A5 ) { *pmove |= FLAG_PROMO; }
\r
483 BBAnd( bb_piece, bb_diag2_chk, BB_BPAWN );
\r
484 while ( BBToU(bb_piece) )
\r
486 from = LastOne( bb_piece );
\r
487 Xor( from, bb_piece );
\r
490 if ( BOARD[to] != empty ) { continue; }
\r
492 bb_desti = AttackDiag2( from );
\r
493 if ( BBContract( bb_desti, BB_B_BH ) )
\r
495 *pmove = To2Move(to) | From2Move(from)
\r
496 | Piece2Move(pawn) | Cap2Move(-BOARD[to]);
\r
497 if ( from < A5 ) { *pmove |= FLAG_PROMO; }
\r
503 bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
\r
504 if ( sq_wk < A2 ) { BBOr( bb_chk, bb_chk, abb_mask[sq_wk+nfile] ); };
\r
505 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
506 BBAnd( bb_chk, bb_chk, BB_BPAWN_ATK );
\r
507 while ( BBToU(bb_chk) )
\r
509 to = LastOne( bb_chk );
\r
513 *pmove = To2Move(to) | From2Move(from)
\r
514 | Piece2Move(pawn) | Cap2Move(-BOARD[to]);
\r
515 if ( from < A5 ) { *pmove |= FLAG_PROMO; }
\r
520 if ( IsHandGold(HAND_B) )
\r
522 BBAnd( bb_chk, bb_drop_to, abb_w_gold_attacks[sq_wk] );
\r
523 while( BBToU( bb_chk ) )
\r
525 to = LastOne( bb_chk );
\r
527 *pmove++ = To2Move(to) | Drop2Move(gold);
\r
532 if ( IsHandSilver(HAND_B) )
\r
534 BBAnd( bb_chk, bb_drop_to, abb_w_silver_attacks[sq_wk] );
\r
535 while( BBToU( bb_chk ) )
\r
537 to = LastOne( bb_chk );
\r
539 *pmove++ = To2Move(to) | Drop2Move(silver);
\r
544 if ( IsHandKnight(HAND_B) && sq_wk < A2 )
\r
546 to = sq_wk + 2*nfile - 1;
\r
547 if ( aifile[sq_wk] != file1 && BOARD[to] == empty )
\r
549 *pmove++ = To2Move(to) | Drop2Move(knight);
\r
552 to = sq_wk + 2*nfile + 1;
\r
553 if ( aifile[sq_wk] != file9 && BOARD[to] == empty )
\r
555 *pmove++ = To2Move(to) | Drop2Move(knight);
\r
560 if ( IsHandPawn(HAND_B)
\r
562 && ! ( BBToU(BB_BPAWN) & ( mask_file1 >> aifile[sq_wk] ) ) )
\r
564 to = sq_wk + nfile;
\r
565 if ( BOARD[to] == empty && ! is_mate_b_pawn_drop( __ptree__, to ) )
\r
567 *pmove++ = To2Move(to) | Drop2Move(pawn);
\r
572 if ( IsHandLance(HAND_B) )
\r
575 int dist, min_dist;
\r
577 if ( (int)aifile[sq_wk] == file1
\r
578 || (int)aifile[sq_wk] == file9 ) { min_dist = 2; }
\r
579 else { min_dist = 3; }
\r
581 for ( to = sq_wk+nfile, dist = 1; to < nsquare && BOARD[to] == empty;
\r
582 to += nfile, dist += 1 )
\r
584 move = To2Move(to) | Drop2Move(lance);
\r
585 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
586 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
592 if ( IsHandRook(HAND_B) )
\r
595 int file, dist, min_dist;
\r
597 if ( (int)aifile[sq_wk] == file1
\r
598 || (int)aifile[sq_wk] == file9 ) { min_dist = 2; }
\r
599 else { min_dist = 3; }
\r
601 for ( to = sq_wk+nfile, dist = 1; to < nsquare && BOARD[to] == empty;
\r
602 to += nfile, dist += 1 )
\r
604 move = To2Move(to) | Drop2Move(rook);
\r
605 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
606 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
610 for ( file = (int)aifile[sq_wk]-1, to = sq_wk-1, dist = 1;
\r
611 file >= file1 && BOARD[to] == empty;
\r
612 file -= 1, to -= 1, dist += 1 )
\r
614 move = To2Move(to) | Drop2Move(rook);
\r
615 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
616 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
620 if ( sq_wk < A8 || I2 < sq_wk ) { min_dist = 2; }
\r
621 else { min_dist = 3; }
\r
623 for ( file = (int)aifile[sq_wk]+1, to = sq_wk+1, dist = 1;
\r
624 file <= file9 && BOARD[to] == empty;
\r
625 file += 1, to += 1, dist += 1 )
\r
627 move = To2Move(to) | Drop2Move(rook);
\r
628 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
629 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
633 for ( to = sq_wk-nfile, dist = 1; to >= 0 && BOARD[to] == empty;
\r
634 to -= nfile, dist += 1 )
\r
636 move = To2Move(to) | Drop2Move(rook);
\r
637 if ( (int)airank[to] == rank3 ) { move |= MOVE_CHK_CLEAR; }
\r
638 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
639 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
645 if ( IsHandBishop(HAND_B) )
\r
648 int file, rank, dist;
\r
651 file = (int)aifile[sq_wk];
\r
652 rank = (int)airank[sq_wk];
\r
653 for ( to -= 10, file -= 1, rank -= 1, dist = 1;
\r
654 file >= 0 && rank >= 0 && BOARD[to] == empty;
\r
655 to -= 10, file -= 1, rank -= 1, dist += 1 )
\r
657 move = To2Move(to) | Drop2Move(bishop);
\r
658 if ( rank == rank3 ) { move |= MOVE_CHK_CLEAR; }
\r
659 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
660 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
665 file = (int)aifile[sq_wk];
\r
666 rank = (int)airank[sq_wk];
\r
667 for ( to -= 8, file += 1, rank -= 1, dist = 1;
\r
668 file <= file9 && rank >= 0 && BOARD[to] == empty;
\r
669 to -= 8, file += 1, rank -= 1, dist += 1 )
\r
671 move = To2Move(to) | Drop2Move(bishop);
\r
672 if ( rank == rank3 ) { move |= MOVE_CHK_CLEAR; }
\r
673 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
674 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
679 file = (int)aifile[sq_wk];
\r
680 rank = (int)airank[sq_wk];
\r
681 for ( to += 8, file -= 1, rank += 1, dist = 1;
\r
682 file >= 0 && rank <= rank9 && BOARD[to] == empty;
\r
683 to += 8, file -= 1, rank += 1, dist += 1 )
\r
685 move = To2Move(to) | Drop2Move(bishop);
\r
686 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
687 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
692 file = (int)aifile[sq_wk];
\r
693 rank = (int)airank[sq_wk];
\r
694 for ( to += 10, file += 1, rank += 1, dist = 1;
\r
695 file <= file9 && rank <= rank9 && BOARD[to] == empty;
\r
696 to += 10, file += 1, rank += 1, dist += 1 )
\r
698 move = To2Move(to) | Drop2Move(bishop);
\r
699 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
700 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
711 w_gen_checks( tree_t * restrict __ptree__, unsigned int * restrict pmove )
\r
713 bitboard_t bb_piece, bb_rook_chk, bb_bishop_chk, bb_chk, bb_move_to;
\r
714 bitboard_t bb_diag1_chk, bb_diag2_chk, bb_file_chk, bb_drop_to, bb_desti;
\r
715 const tree_t * restrict ptree = __ptree__;
\r
716 unsigned int u0, u1, u2;
\r
717 int from, to, sq_bk, idirec;
\r
720 bb_rook_chk = bb_file_chk = AttackFile( sq_bk );
\r
721 bb_rook_chk.p[aslide[sq_bk].ir0] |= AttackRank( sq_bk );
\r
722 bb_diag1_chk = AttackDiag1( sq_bk );
\r
723 bb_diag2_chk = AttackDiag2( sq_bk );
\r
724 AttackBishop( bb_bishop_chk, sq_bk );
\r
725 BBNot( bb_move_to, BB_WOCCUPY );
\r
726 BBOr( bb_drop_to, BB_BOCCUPY, BB_WOCCUPY );
\r
727 BBNot( bb_drop_to, bb_drop_to );
\r
731 idirec = (int)adirec[sq_bk][from];
\r
732 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
735 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
736 BBAnd( bb_chk, bb_chk, abb_king_attacks[from] );
\r
737 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
739 while( BBToU( bb_chk ) )
\r
741 to = FirstOne( bb_chk );
\r
743 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(king)
\r
744 | Cap2Move(BOARD[to]);
\r
749 bb_piece = BB_WDRAGON;
\r
750 while( BBToU( bb_piece ) )
\r
752 from = FirstOne( bb_piece );
\r
753 Xor( from, bb_piece );
\r
755 BBOr( bb_chk, bb_rook_chk, abb_king_attacks[sq_bk] );
\r
756 idirec = (int)adirec[sq_bk][from];
\r
757 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
759 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
762 AttackDragon( bb_desti, from );
\r
763 BBAnd( bb_chk, bb_chk, bb_desti );
\r
764 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
766 while( BBToU( bb_chk ) )
\r
768 to = LastOne( bb_chk );
\r
770 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(dragon)
\r
771 | Cap2Move(BOARD[to]);
\r
776 bb_piece = BB_WHORSE;
\r
777 while( BBToU( bb_piece ) )
\r
779 from = FirstOne( bb_piece );
\r
780 Xor( from, bb_piece );
\r
782 BBOr( bb_chk, bb_bishop_chk, abb_king_attacks[sq_bk] );
\r
783 idirec = (int)adirec[sq_bk][from];
\r
784 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
786 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
789 AttackHorse( bb_desti, from );
\r
790 BBAnd( bb_chk, bb_chk, bb_desti );
\r
791 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
793 while( BBToU( bb_chk ) )
\r
795 to = FirstOne( bb_chk );
\r
797 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(horse)
\r
798 | Cap2Move(BOARD[to]);
\r
802 u0 = BB_WROOK.p[0];
\r
803 u1 = BB_WROOK.p[1];
\r
806 from = first_one01( u0, u1 );
\r
807 u0 ^= abb_mask[from].p[0];
\r
808 u1 ^= abb_mask[from].p[1];
\r
810 AttackRook( bb_desti, from );
\r
812 idirec = (int)adirec[sq_bk][from];
\r
813 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
815 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
818 bb_chk = bb_rook_chk;
\r
819 bb_chk.p[2] |= abb_king_attacks[sq_bk].p[2];
\r
820 BBAnd( bb_chk, bb_chk, bb_desti );
\r
821 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
824 while ( bb_chk.p[2] )
\r
826 to = first_one2( bb_chk.p[2] );
\r
827 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
828 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(rook)
\r
829 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
832 while( bb_chk.p[0] | bb_chk.p[1] )
\r
834 to = first_one01( bb_chk.p[0], bb_chk.p[1] );
\r
835 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
836 bb_chk.p[1] ^= abb_mask[to].p[1];
\r
837 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(rook)
\r
838 | Cap2Move(BOARD[to]);
\r
842 u2 = BB_WROOK.p[2];
\r
845 from = first_one2( u2 );
\r
846 u2 ^= abb_mask[from].p[2];
\r
848 AttackRook( bb_desti, from );
\r
850 idirec = (int)adirec[sq_bk][from];
\r
851 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
853 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
856 BBOr( bb_chk, bb_rook_chk, abb_king_attacks[sq_bk] );
\r
857 BBAnd( bb_chk, bb_chk, bb_desti );
\r
858 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
861 while( BBToU( bb_chk ) )
\r
863 to = FirstOne( bb_chk );
\r
865 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(rook)
\r
866 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
870 u0 = BB_WBISHOP.p[0];
\r
871 u1 = BB_WBISHOP.p[1];
\r
874 from = first_one01( u0, u1 );
\r
875 u0 ^= abb_mask[from].p[0];
\r
876 u1 ^= abb_mask[from].p[1];
\r
878 AttackBishop( bb_desti, from );
\r
880 idirec = (int)adirec[sq_bk][from];
\r
881 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
883 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
886 bb_chk = bb_bishop_chk;
\r
887 bb_chk.p[2] |= abb_king_attacks[sq_bk].p[2];
\r
888 BBAnd( bb_chk, bb_chk, bb_desti );
\r
889 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
892 while ( bb_chk.p[2] )
\r
894 to = first_one2( bb_chk.p[2] );
\r
895 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
896 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(bishop)
\r
897 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
900 while( bb_chk.p[0] | bb_chk.p[1] )
\r
902 to = first_one01( bb_chk.p[0], bb_chk.p[1] );
\r
903 bb_chk.p[0] ^= abb_mask[to].p[0];
\r
904 bb_chk.p[1] ^= abb_mask[to].p[1];
\r
905 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(bishop)
\r
906 | Cap2Move(BOARD[to]);
\r
910 u2 = BB_WBISHOP.p[2];
\r
913 from = first_one2( u2 );
\r
914 u2 ^= abb_mask[from].p[2];
\r
916 AttackBishop( bb_desti, from );
\r
918 idirec = (int)adirec[sq_bk][from];
\r
919 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
921 BBAnd( bb_chk, bb_desti, bb_move_to );
\r
924 BBOr( bb_chk, bb_bishop_chk, abb_king_attacks[sq_bk] );
\r
925 BBAnd( bb_chk, bb_chk, bb_desti );
\r
926 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
929 while( BBToU( bb_chk ) )
\r
931 to = FirstOne( bb_chk );
\r
933 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(bishop)
\r
934 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
939 bb_piece = BB_WTGOLD;
\r
940 while( BBToU( bb_piece ) )
\r
942 from = FirstOne( bb_piece );
\r
943 Xor( from, bb_piece );
\r
945 bb_chk = abb_b_gold_attacks[sq_bk];
\r
947 idirec = (int)adirec[sq_bk][from];
\r
948 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
950 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
953 BBAnd( bb_chk, bb_chk, abb_w_gold_attacks[from] );
\r
954 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
956 while( BBToU( bb_chk ) )
\r
958 to = FirstOne( bb_chk );
\r
960 *pmove++ = ( To2Move(to) | From2Move(from)
\r
961 | Piece2Move(-BOARD[from])
\r
962 | Cap2Move(BOARD[to]) );
\r
967 u2 = BB_WSILVER.p[2];
\r
970 from = first_one2( u2 );
\r
971 u2 ^= abb_mask[from].p[2];
\r
973 bb_chk.p[2] = abb_b_gold_attacks[sq_bk].p[2];
\r
974 bb_chk.p[1] = abb_b_gold_attacks[sq_bk].p[1];
\r
977 idirec = (int)adirec[sq_bk][from];
\r
978 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
980 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
983 bb_chk.p[2] &= bb_move_to.p[2] & abb_w_silver_attacks[from].p[2];
\r
984 bb_chk.p[1] &= bb_move_to.p[1] & abb_w_silver_attacks[from].p[1];
\r
986 while( bb_chk.p[2] | bb_chk.p[1] )
\r
988 to = first_one12( bb_chk.p[1], bb_chk.p[2] );
\r
989 bb_chk.p[1] ^= abb_mask[to].p[1];
\r
990 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
991 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(silver)
\r
992 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
997 u1 = BB_WSILVER.p[1] & 0x1ffU;
\r
1000 from = first_one1( u1 );
\r
1001 u1 ^= abb_mask[from].p[1];
\r
1003 bb_chk.p[2] = abb_b_gold_attacks[sq_bk].p[2];
\r
1004 bb_chk.p[1] = bb_chk.p[0] = 0;
\r
1006 idirec = (int)adirec[sq_bk][from];
\r
1007 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
1009 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
1012 bb_chk.p[2] &= bb_move_to.p[2] & abb_w_silver_attacks[from].p[2];
\r
1013 while ( bb_chk.p[2] )
\r
1015 to = first_one2( bb_chk.p[2] );
\r
1016 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
1017 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(silver)
\r
1018 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
1023 bb_piece = BB_WSILVER;
\r
1024 while( BBToU( bb_piece ) )
\r
1026 from = FirstOne( bb_piece );
\r
1027 Xor( from, bb_piece );
\r
1029 bb_chk = abb_b_silver_attacks[sq_bk];
\r
1031 idirec = (int)adirec[sq_bk][from];
\r
1032 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
1034 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
1037 BBAnd( bb_chk, bb_chk, abb_w_silver_attacks[from] );
\r
1038 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
1040 while( BBToU( bb_chk ) )
\r
1042 to = FirstOne( bb_chk );
\r
1043 Xor( to, bb_chk );
\r
1044 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(silver)
\r
1045 | Cap2Move(BOARD[to]);
\r
1050 u2 = BB_WKNIGHT.p[2];
\r
1051 u1 = BB_WKNIGHT.p[1] & 0x3ffffU;
\r
1054 from = first_one12( u1, u2 );
\r
1055 u2 ^= abb_mask[from].p[2];
\r
1056 u1 ^= abb_mask[from].p[1];
\r
1058 bb_chk.p[2] = abb_b_gold_attacks[sq_bk].p[2];
\r
1059 bb_chk.p[1] = bb_chk.p[0] = 0;
\r
1061 idirec = (int)adirec[sq_bk][from];
\r
1062 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
1064 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
1067 bb_chk.p[2] &= abb_w_knight_attacks[from].p[2] & bb_move_to.p[2];
\r
1069 while( bb_chk.p[2] )
\r
1071 to = first_one2( bb_chk.p[2] );
\r
1072 bb_chk.p[2] ^= abb_mask[to].p[2];
\r
1073 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(knight)
\r
1074 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
1079 u0 = BB_WKNIGHT.p[0];
\r
1080 u1 = BB_WKNIGHT.p[1] & 0x7fffe00U;
\r
1083 from = first_one01( u0, u1 );
\r
1084 u0 ^= abb_mask[from].p[0];
\r
1085 u1 ^= abb_mask[from].p[1];
\r
1087 bb_chk = abb_b_knight_attacks[sq_bk];
\r
1089 idirec = (int)adirec[sq_bk][from];
\r
1090 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
1092 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
1095 BBAnd( bb_chk, bb_chk, abb_w_knight_attacks[from] );
\r
1096 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
1098 while( BBToU( bb_chk ) )
\r
1100 to = FirstOne( bb_chk );
\r
1101 Xor( to, bb_chk );
\r
1102 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(knight)
\r
1103 | Cap2Move(BOARD[to]);
\r
1108 bb_piece = BB_WLANCE;
\r
1109 while( BBToU( bb_piece ) )
\r
1111 from = FirstOne( bb_piece );
\r
1112 Xor( from, bb_piece );
\r
1114 bb_chk.p[2] = abb_b_gold_attacks[sq_bk].p[2];
\r
1115 bb_chk.p[1] = bb_chk.p[0] = 0;
\r
1117 idirec = (int)adirec[sq_bk][from];
\r
1118 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
1120 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
1123 BBAnd( bb_chk, bb_chk, AttackFile( from ) );
\r
1124 BBAnd( bb_chk, bb_chk, abb_plus_rays[from] );
\r
1125 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
1127 while( BBToU( bb_chk ) )
\r
1129 to = FirstOne( bb_chk );
\r
1130 Xor( to, bb_chk );
\r
1131 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(lance)
\r
1132 | Cap2Move(BOARD[to]) | FLAG_PROMO;
\r
1137 u0 = BB_WLANCE.p[0];
\r
1138 u1 = BB_WLANCE.p[1];
\r
1141 from = first_one01( u0, u1 );
\r
1142 u0 ^= abb_mask[from].p[0];
\r
1143 u1 ^= abb_mask[from].p[1];
\r
1145 bb_chk = bb_file_chk;
\r
1146 idirec = (int)adirec[sq_bk][from];
\r
1147 if ( idirec && is_pinned_on_black_king( ptree, from, idirec ) )
\r
1149 bb_chk = add_behind_attacks( idirec, sq_bk, bb_chk );
\r
1150 BBAnd( bb_chk, bb_chk, abb_plus_rays[from] );
\r
1152 else { BBAnd( bb_chk, bb_file_chk, abb_minus_rays[sq_bk] ); }
\r
1154 BBAnd( bb_chk, bb_chk, AttackFile( from ) );
\r
1155 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
1156 bb_chk.p[2] = bb_chk.p[2] & 0x7fc0000U;
\r
1158 while( BBToU( bb_chk ) )
\r
1160 to = FirstOne( bb_chk );
\r
1161 Xor( to, bb_chk );
\r
1162 *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(lance)
\r
1163 | Cap2Move(BOARD[to]);
\r
1168 BBAnd( bb_piece, bb_diag1_chk, BB_WPAWN );
\r
1169 while ( BBToU(bb_piece) )
\r
1171 from = FirstOne( bb_piece );
\r
1172 Xor( from, bb_piece );
\r
1174 to = from + nfile;
\r
1175 if ( BOARD[to] != empty ) { continue; }
\r
1177 bb_desti = AttackDiag1( from );
\r
1178 if ( BBContract( bb_desti, BB_W_BH ) )
\r
1180 *pmove = To2Move(to) | From2Move(from)
\r
1181 | Piece2Move(pawn) | Cap2Move(BOARD[to]);
\r
1182 if ( from > I5 ) { *pmove |= FLAG_PROMO; }
\r
1187 BBAnd( bb_piece, bb_diag2_chk, BB_WPAWN );
\r
1188 while ( BBToU(bb_piece) )
\r
1190 from = FirstOne( bb_piece );
\r
1191 Xor( from, bb_piece );
\r
1193 to = from + nfile;
\r
1194 if ( BOARD[to] != empty ) { continue; }
\r
1196 bb_desti = AttackDiag2( from );
\r
1197 if ( BBContract( bb_desti, BB_W_BH ) )
\r
1199 *pmove = To2Move(to) | From2Move(from)
\r
1200 | Piece2Move(pawn) | Cap2Move(BOARD[to]);
\r
1201 if ( from > I5 ) { *pmove |= FLAG_PROMO; }
\r
1207 bb_chk.p[2] = abb_b_gold_attacks[sq_bk].p[2];
\r
1208 if ( sq_bk > I8 ) { BBOr( bb_chk, bb_chk, abb_mask[sq_bk-nfile] ); };
\r
1209 BBAnd( bb_chk, bb_chk, bb_move_to );
\r
1210 BBAnd( bb_chk, bb_chk, BB_WPAWN_ATK );
\r
1211 while ( BBToU(bb_chk) )
\r
1213 to = FirstOne( bb_chk );
\r
1214 Xor( to, bb_chk );
\r
1216 from = to - nfile;
\r
1217 *pmove = To2Move(to) | From2Move(from) | Piece2Move(pawn)
\r
1218 | Cap2Move(BOARD[to]);
\r
1219 if ( from > I5 ) { *pmove |= FLAG_PROMO; }
\r
1224 if ( IsHandGold(HAND_W) )
\r
1226 BBAnd( bb_chk, bb_drop_to, abb_b_gold_attacks[sq_bk] );
\r
1227 while( BBToU( bb_chk ) )
\r
1229 to = FirstOne( bb_chk );
\r
1230 Xor( to, bb_chk );
\r
1231 *pmove++ = To2Move(to) | Drop2Move(gold);
\r
1236 if ( IsHandSilver(HAND_W) )
\r
1238 BBAnd( bb_chk, bb_drop_to, abb_b_silver_attacks[sq_bk] );
\r
1239 while( BBToU( bb_chk ) )
\r
1241 to = FirstOne( bb_chk );
\r
1242 Xor( to, bb_chk );
\r
1243 *pmove++ = To2Move(to) | Drop2Move(silver);
\r
1248 if ( IsHandKnight(HAND_W) && sq_bk > I8 )
\r
1250 to = sq_bk - 2*nfile - 1;
\r
1251 if ( aifile[sq_bk] != file1 && BOARD[to] == empty )
\r
1253 *pmove++ = To2Move(to) | Drop2Move(knight);
\r
1256 to = sq_bk - 2*nfile + 1;
\r
1257 if ( aifile[sq_bk] != file9 && BOARD[to] == empty )
\r
1259 *pmove++ = To2Move(to) | Drop2Move(knight);
\r
1264 if ( IsHandPawn(HAND_W)
\r
1266 && ! ( BBToU(BB_WPAWN) & ( mask_file1 >> aifile[sq_bk] ) ) )
\r
1268 to = sq_bk - nfile;
\r
1269 if ( BOARD[to] == empty && ! is_mate_w_pawn_drop( __ptree__, to ) )
\r
1271 *pmove++ = To2Move(to) | Drop2Move(pawn);
\r
1276 if ( IsHandLance(HAND_W) )
\r
1278 unsigned int move;
\r
1279 int dist, min_dist;
\r
1281 if ( (int)aifile[sq_bk] == file1
\r
1282 || (int)aifile[sq_bk] == file9 ) { min_dist = 2; }
\r
1283 else { min_dist = 3; }
\r
1285 for ( to = sq_bk-nfile, dist = 1; to >= 0 && BOARD[to] == empty;
\r
1286 to -= nfile, dist += 1 )
\r
1288 move = To2Move(to) | Drop2Move(lance);
\r
1289 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1290 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
1296 if ( IsHandRook(HAND_W) )
\r
1298 unsigned int move;
\r
1299 int file, dist, min_dist;
\r
1301 if ( (int)aifile[sq_bk] == file1
\r
1302 || (int)aifile[sq_bk] == file9 ) { min_dist = 2; }
\r
1303 else { min_dist = 3; }
\r
1305 for ( to = sq_bk-nfile, dist = 1; to >= 0 && BOARD[to] == empty;
\r
1306 to -= nfile, dist += 1 )
\r
1308 move = To2Move(to) | Drop2Move(rook);
\r
1309 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1310 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
1314 for ( to = sq_bk+nfile, dist = 1; to < nsquare && BOARD[to] == empty;
\r
1315 to += nfile, dist += 1 )
\r
1317 move = To2Move(to) | Drop2Move(rook);
\r
1318 if ( (int)airank[to] == rank7 ) { move |= MOVE_CHK_CLEAR; }
\r
1319 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1320 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
1325 if ( sq_bk < A8 || I2 < sq_bk ) { min_dist = 2; }
\r
1326 else { min_dist = 3; }
\r
1328 for ( file = (int)aifile[sq_bk]+1, to = sq_bk+1, dist = 1;
\r
1329 file <= file9 && BOARD[to] == empty;
\r
1330 file += 1, to += 1, dist += 1 )
\r
1332 move = To2Move(to) | Drop2Move(rook);
\r
1333 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1334 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
1338 for ( file = (int)aifile[sq_bk]-1, to = sq_bk-1, dist = 1;
\r
1339 file >= file1 && BOARD[to] == empty;
\r
1340 file -= 1, to -= 1, dist += 1 )
\r
1342 move = To2Move(to) | Drop2Move(rook);
\r
1343 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1344 else if ( dist > min_dist ) { move |= MOVE_CHK_SET; }
\r
1350 if ( IsHandBishop(HAND_W) )
\r
1352 unsigned int move;
\r
1353 int file, rank, dist;
\r
1356 file = (int)aifile[sq_bk];
\r
1357 rank = (int)airank[sq_bk];
\r
1358 for ( to += 10, file += 1, rank += 1, dist = 1;
\r
1359 file <= file9 && rank <= rank9 && BOARD[to] == empty;
\r
1360 to += 10, file += 1, rank += 1, dist += 1 )
\r
1362 move = To2Move(to) | Drop2Move(bishop);
\r
1363 if ( rank == rank7 ) { move |= MOVE_CHK_CLEAR; }
\r
1364 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1365 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
1370 file = (int)aifile[sq_bk];
\r
1371 rank = (int)airank[sq_bk];
\r
1372 for ( to += 8, file -= 1, rank += 1, dist = 1;
\r
1373 file >= 0 && rank <= rank9 && BOARD[to] == empty;
\r
1374 to += 8, file -= 1, rank += 1, dist += 1 )
\r
1376 move = To2Move(to) | Drop2Move(bishop);
\r
1377 if ( rank == rank7 ) { move |= MOVE_CHK_CLEAR; }
\r
1378 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1379 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
1384 file = (int)aifile[sq_bk];
\r
1385 rank = (int)airank[sq_bk];
\r
1386 for ( to -= 8, file += 1, rank -= 1, dist = 1;
\r
1387 file <= file9 && rank >= 0 && BOARD[to] == empty;
\r
1388 to -= 8, file += 1, rank -= 1, dist += 1 )
\r
1390 move = To2Move(to) | Drop2Move(bishop);
\r
1391 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1392 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
1397 file = (int)aifile[sq_bk];
\r
1398 rank = (int)airank[sq_bk];
\r
1399 for ( to -= 10, file -= 1, rank -= 1, dist = 1;
\r
1400 file >= 0 && rank >= 0 && BOARD[to] == empty;
\r
1401 to -= 10, file -= 1, rank -= 1, dist += 1 )
\r
1403 move = To2Move(to) | Drop2Move(bishop);
\r
1404 if ( dist == 1 ) { move |= MOVE_CHK_CLEAR; }
\r
1405 else if ( dist > 2 ) { move |= MOVE_CHK_SET; }
\r
1416 add_behind_attacks( int idirec, int ik, bitboard_t bb )
\r
1418 bitboard_t bb_tmp;
\r
1420 if ( idirec == direc_diag1 )
\r
1422 bb_tmp = abb_bishop_attacks_rr45[ik][0];
\r
1424 else if ( idirec == direc_diag2 )
\r
1426 bb_tmp = abb_bishop_attacks_rl45[ik][0];
\r
1428 else if ( idirec == direc_file )
\r
1430 bb_tmp = abb_file_attacks[ik][0];
\r
1433 assert( idirec == direc_rank );
\r
1435 bb_tmp.p[aslide[ik].ir0] = ai_rook_attacks_r0[ik][0];
\r
1437 BBNot( bb_tmp, bb_tmp );
\r
1438 BBOr( bb, bb, bb_tmp );
\r