movegen: separate all captures (easier later handling)
This commit is contained in:
@@ -189,40 +189,58 @@ int pos_gen_pseudomoves(pos_t *pos)
|
|||||||
/* king - MUST BE FIRST ! */
|
/* king - MUST BE FIRST ! */
|
||||||
from = pos->king[us];
|
from = pos->king[us];
|
||||||
movebits = bb_king_moves(not_my_pieces, from);
|
movebits = bb_king_moves(not_my_pieces, from);
|
||||||
bit_for_each64(to, tmp1, movebits) {
|
bit_for_each64(to, tmp1, movebits & empty) {
|
||||||
moves[nmoves++] = move_make(from, to);
|
moves[nmoves++] = move_make(from, to);
|
||||||
}
|
}
|
||||||
|
bit_for_each64(to, tmp1, movebits & enemy_pieces) {
|
||||||
|
moves[nmoves++] = move_make_capture(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
if (popcount64(pos->checkers) > 1) /* double check, we stop here */
|
if (popcount64(pos->checkers) > 1) /* double check, we stop here */
|
||||||
return (pos->moves.nmoves = nmoves);
|
return (pos->moves.nmoves = nmoves);
|
||||||
|
|
||||||
/* sliding pieces */
|
/* sliding pieces */
|
||||||
bit_for_each64(from, tmp1, pos->bb[us][BISHOP]) {
|
bit_for_each64(from, tmp1, pos->bb[us][BISHOP] | pos->bb[us][QUEEN]) {
|
||||||
movebits = hyperbola_bishop_moves(occ, from) & not_my_pieces;
|
movebits = hyperbola_bishop_moves(occ, from) & not_my_pieces;
|
||||||
bit_for_each64(to, tmp2, movebits) {
|
bit_for_each64(to, tmp2, movebits & empty) {
|
||||||
moves[nmoves++] = move_make(from, to);
|
moves[nmoves++] = move_make(from, to);
|
||||||
}
|
}
|
||||||
|
bit_for_each64(to, tmp2, movebits & enemy_pieces) {
|
||||||
|
moves[nmoves++] = move_make_capture(from, to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bit_for_each64(from, tmp1, pos->bb[us][ROOK]) {
|
bit_for_each64(from, tmp1, pos->bb[us][ROOK] | pos->bb[us][QUEEN]) {
|
||||||
// printf("rook=%d/%s\n", from, sq_to_string(from));
|
// printf("rook=%d/%s\n", from, sq_to_string(from));
|
||||||
movebits = hyperbola_rook_moves(occ, from) & not_my_pieces;
|
movebits = hyperbola_rook_moves(occ, from) & not_my_pieces;
|
||||||
bit_for_each64(to, tmp2, movebits) {
|
bit_for_each64(to, tmp2, movebits & empty) {
|
||||||
moves[nmoves++] = move_make(from, to);
|
moves[nmoves++] = move_make(from, to);
|
||||||
}
|
}
|
||||||
|
bit_for_each64(to, tmp2, movebits & enemy_pieces) {
|
||||||
|
moves[nmoves++] = move_make_capture(from, to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* TODO: remove this one, after movegen is validated */
|
/* TODO: remove this one, after movegen is validated */
|
||||||
bit_for_each64(from, tmp1, pos->bb[us][QUEEN]) {
|
/*
|
||||||
movebits = hyperbola_queen_moves(occ, from) & not_my_pieces;
|
* bit_for_each64(from, tmp1, pos->bb[us][QUEEN]) {
|
||||||
bit_for_each64(to, tmp2, movebits) {
|
* movebits = hyperbola_queen_moves(occ, from) & not_my_pieces;
|
||||||
moves[nmoves++] = move_make(from, to);
|
* bit_for_each64(to, tmp2, movebits & empty) {
|
||||||
}
|
* moves[nmoves++] = move_make(from, to);
|
||||||
}
|
* }
|
||||||
|
* bit_for_each64(to, tmp2, movebits & enemy_pieces) {
|
||||||
|
* moves[nmoves++] = move_make_capture(from, to);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
/* knight */
|
/* knight */
|
||||||
bit_for_each64(from, tmp1, pos->bb[us][KNIGHT]) {
|
bit_for_each64(from, tmp1, pos->bb[us][KNIGHT]) {
|
||||||
movebits = bb_knight_moves(not_my_pieces, from);
|
movebits = bb_knight_moves(not_my_pieces, from);
|
||||||
bit_for_each64(to, tmp2, movebits) {
|
bit_for_each64(to, tmp2, movebits & empty) {
|
||||||
moves[nmoves++] = move_make(from, to);
|
moves[nmoves++] = move_make(from, to);
|
||||||
}
|
}
|
||||||
|
bit_for_each64(to, tmp2, movebits & enemy_pieces) {
|
||||||
|
moves[nmoves++] = move_make_capture(from, to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pawn: relative rank and files */
|
/* pawn: relative rank and files */
|
||||||
|
Reference in New Issue
Block a user