+/// Position::do_capture_move() is a private method used to update captured
+/// piece info. It is called from the main Position::do_move function.
+
+void Position::do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep) {
+
+ assert(capture != KING);
+
+ Square capsq = to;
+
+ // If the captured piece was a pawn, update pawn hash key,
+ // otherwise update non-pawn material.
+ if (capture == PAWN)
+ {
+ 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;
+ }
+ st->pawnKey ^= zobrist[them][PAWN][capsq];
+ }
+ else
+ st->npMaterial[them] -= piece_value_midgame(capture);
+
+ // Remove captured piece
+ clear_bit(&(byColorBB[them]), capsq);
+ clear_bit(&(byTypeBB[capture]), capsq);
+ clear_bit(&(byTypeBB[0]), capsq);
+
+ // Update hash key
+ key ^= zobrist[them][capture][capsq];
+
+ // Update incremental scores
+ st->value -= pst(them, capture, capsq);
+
+ // Update piece count
+ pieceCount[them][capture]--;
+
+ // Update material hash key
+ st->materialKey ^= zobrist[them][capture][pieceCount[them][capture]];
+
+ // Update piece list, move the last piece at index[capsq] position
+ //
+ // WARNING: This is a not perfectly revresible operation. When we
+ // will reinsert the captured piece in undo_move() we will put it
+ // at the end of the list and not in its original place, it means
+ // index[] and pieceList[] are not guaranteed to be invariant to a
+ // do_move() + undo_move() sequence.
+ Square lastPieceSquare = pieceList[them][capture][pieceCount[them][capture]];
+ index[lastPieceSquare] = index[capsq];
+ pieceList[them][capture][index[lastPieceSquare]] = lastPieceSquare;
+ pieceList[them][capture][pieceCount[them][capture]] = SQ_NONE;
+
+ // Reset rule 50 counter
+ st->rule50 = 0;
+}
+
+