- // Update piece lists:
- pieceList[us][piece][index[from]] = to;
- index[to] = index[from];
-
- // Update castle rights:
- key ^= zobCastle[castleRights];
- castleRights &= castleRightsMask[from];
- castleRights &= castleRightsMask[to];
- key ^= zobCastle[castleRights];
-
- // Update checkers bitboard:
- checkersBB = EmptyBoardBB;
- Square ksq = king_square(them);
-
- switch(piece) {
-
- case PAWN:
- if(bit_is_set(pawn_attacks(them, ksq), to))
- set_bit(&checkersBB, to);
- if(bit_is_set(dcCandidates, from))
- checkersBB |=
- ((piece_attacks<ROOK>(ksq) & rooks_and_queens(us)) |
- (piece_attacks<BISHOP>(ksq) & bishops_and_queens(us)));
- break;
-
- case KNIGHT:
- if(bit_is_set(piece_attacks<KNIGHT>(ksq), to))
- set_bit(&checkersBB, to);
- if(bit_is_set(dcCandidates, from))
- checkersBB |=
- ((piece_attacks<ROOK>(ksq) & rooks_and_queens(us)) |
- (piece_attacks<BISHOP>(ksq) & bishops_and_queens(us)));
- break;
-
- case BISHOP:
- if(bit_is_set(piece_attacks<BISHOP>(ksq), to))
- set_bit(&checkersBB, to);
- if(bit_is_set(dcCandidates, from))
- checkersBB |=
- (piece_attacks<ROOK>(ksq) & rooks_and_queens(us));
- break;
-
- case ROOK:
- if(bit_is_set(piece_attacks<ROOK>(ksq), to))
- set_bit(&checkersBB, to);
- if(bit_is_set(dcCandidates, from))
- checkersBB |=
- (piece_attacks<BISHOP>(ksq) & bishops_and_queens(us));
- break;
-
- case QUEEN:
- if(bit_is_set(piece_attacks<QUEEN>(ksq), to))
- set_bit(&checkersBB, to);
- break;
-
- case KING:
- if(bit_is_set(dcCandidates, from))
- checkersBB |=
- ((piece_attacks<ROOK>(ksq) & rooks_and_queens(us)) |
- (piece_attacks<BISHOP>(ksq) & bishops_and_queens(us)));
- break;
-
- default:
- assert(false);
- break;
+ if (ep) // en passant ?
+ {
+ capsq = (them == BLACK)? (to - DELTA_N) : (to - DELTA_S);
+
+ assert(to == st->epSquare);
+ assert(relative_rank(opposite_color(them), to) == RANK_6);
+ assert(piece_on(to) == EMPTY);
+ assert(piece_on(capsq) == piece_of_color_and_type(them, PAWN));
+
+ board[capsq] = EMPTY;