};
// clang-format on
int make_move(CBoard_T self, Move move, int flag) {
int make_move(CBoard_T cboard, Move move, int flag) {
if (flag == 0) {
Square source = Move_source(move);
Square target = Move_target(move);
Piece_T Piece = Piece_fromIndex(Move_piece(move));
eColor color = CBoard_side(cboard);
CBoard_piece_move(self, Piece, source, target);
if (Move_capture(move)) {
CBoard_colorBB_pop(self, !Piece_color(Piece), target);
ePiece i;
for (i = 0; i < 6; i++) {
if (i != Piece_piece(Piece) && CBoard_pieceBB_get(self, i, target)) {
CBoard_pieceBB_pop(self, i, target);
break;
}
}
}
if (!Move_capture(move))
CBoard_piece_move(cboard, Piece, source, target);
else
CBoard_piece_capture(cboard, Piece, source, target);
if (Move_promote(move)) {
Piece_T Promote = Piece_fromIndex(Move_promote(move));
CBoard_pieceBB_pop(self, Piece_piece(Piece), target);
CBoard_pieceBB_set(self, Piece_piece(Promote), target);
CBoard_piece_pop(cboard, Piece, target);
CBoard_piece_set(cboard, Promote, target);
}
if (Move_enpassant(move)) {
if (Piece_color(Piece) == WHITE)
CBoard_piece_pop(self, Piece_get(PAWN, !Piece_color(Piece)),
target - 8);
else
CBoard_piece_pop(self, Piece_get(PAWN, !Piece_color(Piece)),
target + 8);
}
{
int ntarget = target + (color == WHITE ? -8 : +8);
if (Move_enpassant(move))
CBoard_piece_pop(cboard, Piece_get(PAWN, !color), ntarget);
if (Move_double(move))
CBoard_enpassant_set(self,
target + (Piece_color(Piece) == WHITE ? -8 : +8));
else
CBoard_enpassant_set(self, no_sq);
CBoard_enpassant_set(cboard, Move_double(move) ? ntarget : no_sq);
}
if (Move_castle(move)) {
if (CBoard_side(self) == WHITE) {
Piece_T Rook = Piece_get(ROOK, WHITE);
if (target == g1)
CBoard_piece_move(self, Rook, h1, f1);
else
CBoard_piece_move(self, Rook, a1, d1);
CBoard_castle_pop(self, WK);
CBoard_castle_pop(self, WQ);
} else {
Piece_T Rook = Piece_get(ROOK, BLACK);
if (target == g8)
CBoard_piece_move(self, Rook, h8, f8);
else
CBoard_piece_move(self, Rook, a8, d8);
CBoard_castle_pop(self, BK);
CBoard_castle_pop(self, BQ);
Piece_T Rook = Piece_get(ROOK, CBoard_side(cboard));
switch (target) {
case g1: CBoard_piece_move(cboard, Rook, h1, f1); break;
case c1: CBoard_piece_move(cboard, Rook, a1, d1); break;
case g8: CBoard_piece_move(cboard, Rook, h8, f8); break;
case c8: CBoard_piece_move(cboard, Rook, a8, d8); break;
default: break;
}
}
CBoard_castle_and(self, castling_rights[source]);
CBoard_castle_and(self, castling_rights[target]);
CBoard_castle_and(cboard, castling_rights[source]);
CBoard_castle_and(cboard, castling_rights[target]);
if (!CBoard_isCheck(self)) {
CBoard_side_switch(self);
if (!CBoard_isCheck(cboard)) {
CBoard_side_switch(cboard);
return 1;
} else
return 0;
} else {
if (Move_capture(move)) {
make_move(self, move, 0);
return 1;
} else
if (Move_capture(move))
return make_move(cboard, move, 0);
else
return 0;
}
return 0;
}
long nodes = 0;