diff options
Diffstat (limited to 'src/engine/moves/queen.c')
| -rw-r--r-- | src/engine/moves/queen.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/src/engine/moves/queen.c b/src/engine/moves/queen.c index 3e0b8ef..bd3f564 100644 --- a/src/engine/moves/queen.c +++ b/src/engine/moves/queen.c @@ -16,17 +16,18 @@ void get_queen_moves(moves_t* moves, position_t position) { enemy_pieces = whites(position); friendly_queens = position.bitboards[BLACK_QUEEN]; } - - __forloop_rook_moves_gen( - moves, - friendly_queens, - friendly_pieces, - enemy_pieces - ); - __forloop_bishop_moves_gen( - moves, - friendly_queens, - friendly_pieces, - enemy_pieces - ); + + bitboard_t all_occupied = friendly_pieces | enemy_pieces; + bitboard_t queens = friendly_queens; + while (queens) { + int from = __builtin_ctzll(queens); + queens &= queens - 1; + bitboard_t attacks = (get_rook_attacks(from, all_occupied) | + get_bishop_attacks(from, all_occupied)) & ~friendly_pieces; + while (attacks) { + int to = __builtin_ctzll(attacks); + attacks &= attacks - 1; + add_move(moves, from, to, .flags = ((enemy_pieces >> to) & 1) ? MOVE_CAPTURE : 0); + } + } } |
