move_list_add(moves, move); \
}
MoveList move_list_generate(MoveList moves, Board board) {
MoveList *move_list_generate(MoveList *moves, Board *board) {
Move move;
Square src, tgt;
eColor color = board_side(board);
if (!moves) moves = move_list_new();
{ // pawn moves
Piece Piece = piece_get(PAWN, color);
U64 bitboard = board_pieceSet(board, Piece);
bitboard_for_each_bit(src, bitboard) {
{ // quiet
int add = (color == WHITE) ? +8 : -8;
tgt = src + add;
if (!board_square_isOccupied(board, tgt)) {
if (pawn_canPromote(color, src)) {
pawn_promote(src, tgt, Piece, 0);
} else {
move_list_add(
moves, move_encode(src, tgt, Piece, 0, 0, 0, 0, 0));
// pawn moves
Piece piece = piece_get(PAWN, color);
U64 bitboard = board_pieceSet(board, piece);
bitboard_for_each_bit(src, bitboard) {
{ // quiet
int add = (color == WHITE) ? +8 : -8;
tgt = src + add;
if (!board_square_isOccupied(board, tgt)) {
if (pawn_canPromote(color, src)) {
pawn_promote(src, tgt, piece, 0);
} else {
move_list_add(moves,
move_encode(src, tgt, piece, 0, 0, 0, 0, 0));
// two ahead
if (pawn_onStart(color, src) &&
!board_square_isOccupied(board, tgt += add))
move_list_add(moves, move_encode(src, tgt, Piece, 0,
0, 1, 0, 0));
}
// two ahead
if (pawn_onStart(color, src) &&
!board_square_isOccupied(board, tgt += add))
move_list_add(
moves, move_encode(src, tgt, piece, 0, 0, 1, 0, 0));
}
}
{ // capture
U64 attack = board_piece_attacks(board, Piece, src) &
board_color(board, !color);
bitboard_for_each_bit(tgt, attack) {
if (pawn_canPromote(color, src)) {
pawn_promote(src, tgt, Piece,
board_square_piece(board, tgt, !color));
} else {
move_list_add(
moves,
move_encode(src, tgt, Piece,
board_square_piece(board, tgt, !color),
0, 0, 0, 0));
}
}
{ // capture
U64 attack = board_piece_attacks(board, piece, src) &
board_color(board, !color);
bitboard_for_each_bit(tgt, attack) {
if (pawn_canPromote(color, src)) {
pawn_promote(src, tgt, piece,
board_square_piece(board, tgt, !color));
} else {
move_list_add(moves, move_encode(src, tgt, piece,
board_square_piece(
board, tgt, !color),
0, 0, 0, 0));
}
}
}
{ // en passant
if (board_enpassant(board) != no_sq &&
board_piece_attacks(board, Piece, src) &
(C64(1) << board_enpassant(board)))
move_list_add(
moves,
move_encode(src, board_enpassant(board), Piece,
board_square_piece(board, tgt, !color), 0,
0, 1, 0));
}
{ // en passant
if (board_enpassant(board) != no_sq &&
board_piece_attacks(board, piece, src) &
(C64(1) << board_enpassant(board)))
move_list_add(
moves, move_encode(src, board_enpassant(board), piece,
board_square_piece(board, tgt, !color),
0, 0, 1, 0));
}
}
// All piece move
for (int piece = 1; piece < 6; piece++) {
Piece Piece = piece_get(piece, color);
U64 bitboard = board_pieceSet(board, Piece);
for (int piece_idx = 1; piece_idx < 6; piece_idx++) {
Piece piece = piece_get(piece_idx, color);
U64 bitboard = board_pieceSet(board, piece);
bitboard_for_each_bit(src, bitboard) {
U64 attack = board_piece_attacks(board, Piece, src) &
U64 attack = board_piece_attacks(board, piece, src) &
~board_color(board, color);
bitboard_for_each_bit(tgt, attack) {
/* int take = bit_get(board_colorBB(board, !color), tgt); */
move_list_add(
moves, move_encode(src, tgt, Piece,
moves, move_encode(src, tgt, piece,
board_square_piece(board, tgt, !color),
0, 0, 0, 0));
}