return moves;
}
void CBoard_piece_pop(CBoard_T self, Piece_T Piece, Square square) {
bit_pop(self->pieceBB[Piece->piece], square);
bit_pop(self->colorBB[Piece->color], square);
}
void CBoard_piece_set(CBoard_T self, Piece_T Piece, Square square) {
bit_set(self->pieceBB[Piece->piece], square);
bit_set(self->colorBB[Piece->color], square);
}
void CBoard_piece_move(CBoard_T self, Piece_T Piece, Square source,
Square target) {
CBoard_piece_pop(self, Piece, source);
CBoard_piece_set(self, Piece, target);
}
int CBoard_move_make(CBoard_T self, Move move, int flag) {
if (flag == 0) {
Square source = Move_source(move);
Square target = Move_target(move);
Piece_T Piece = Piece_fromInex(Move_piece(move));
if (!Move_castle(move))
CBoard_piece_move(self, Piece, source, target);
if (Move_capture(move)) {
bit_pop(self->colorBB[!Piece->color], target);
for (int i = 0; i < 6; i++)
if (i != Piece->piece && bit_get(self->pieceBB[i], target)) {
bit_pop(self->pieceBB[i], target);
break;
}
}
if (Move_promote(move)) {
Piece_T Promote = Piece_fromInex(Move_promote(move));
bit_pop(self->pieceBB[Piece->piece], target);
bit_set(self->pieceBB[Promote->piece], target);
}
if (Move_enpassant(move)) {
target += (Piece->color == WHITE) ? -8 : +8;
CBoard_piece_pop(self, &Pieces[!Piece->color][PAWN], source);
}
if (Move_double(move))
self->enpassant = target + (Piece->color == WHITE ? -8 : +8);
else
self->enpassant = no_sq;
if (Move_castle(move)) {
if (self->side == WHITE) {
Piece_T Rook = &Pieces[WHITE][ROOK];
if (target == g1) {
if (CBoard_square_isAttack(self, f1, BLACK) ||
CBoard_square_isAttack(self, g1, BLACK))
return 0;
CBoard_piece_move(self, Rook, h1, f1);
CBoard_piece_move(self, Piece, source, target);
bit_pop(self->castle, 0);
bit_pop(self->castle, 1);
} else {
if (CBoard_square_isAttack(self, c1, BLACK) ||
CBoard_square_isAttack(self, d1, BLACK))
return 0;
CBoard_piece_move(self, Rook, a1, d1);
CBoard_piece_move(self, Piece, source, target);
bit_pop(self->castle, 0);
bit_pop(self->castle, 1);
}
} else {
Piece_T Rook = &Pieces[BLACK][ROOK];
if (target == g8) {
if (CBoard_square_isAttack(self, f8, WHITE) ||
CBoard_square_isAttack(self, g8, WHITE))
return 0;
CBoard_piece_move(self, Rook, h8, f8);
CBoard_piece_move(self, Piece, source, target);
bit_pop(self->castle, 2);
bit_pop(self->castle, 3);
} else {
if (CBoard_square_isAttack(self, c8, WHITE) ||
CBoard_square_isAttack(self, d8, WHITE))
return 0;
CBoard_piece_move(self, Rook, a8, d8);
CBoard_piece_move(self, Piece, source, target);
bit_pop(self->castle, 2);
bit_pop(self->castle, 3);
}
}
} else {
int add = (self->side == WHITE) ? 0 : 2;
switch (Piece->piece) {
case ROOK: bit_pop(self->castle, (source == h1 ? 0 : 1) + add); break;
case KING:
bit_pop(self->castle, 0 + add);
bit_pop(self->castle, 1 + add);
break;
default: break;
}
}
if (!CBoard_square_isAttack(
self,
bit_lsb_index(self->pieceBB[KING] & self->colorBB[self->side]),
!self->side)) {
self->side = !self->side;
return 1;
} else
return 0;
} else {
if (Move_capture(move)) {
CBoard_move_make(self, move, 0);
return 1;
} else
return 0;
}
return 0;
}
void CBoard_print(CBoard_T self) {
for (int rank = 0; rank < 8; rank++) {
for (int file = 0; file < 8; file++) {