#define MOVES_INTERNAL #include "engine/moves.h" void get_queen_moves(moves_t* moves, position_t position) { assert_valid_position(position); bitboard_t friendly_queens; bitboard_t friendly_pieces; bitboard_t enemy_pieces; if (position.turn == WHITE_TURN) { friendly_pieces = whites(position); enemy_pieces = blacks(position); friendly_queens = position.bitboards[WHITE_QUEEN]; } else { friendly_pieces = blacks(position); enemy_pieces = whites(position); friendly_queens = position.bitboards[BLACK_QUEEN]; } 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); } } }