- // If the opponent has no attackers we are finished
- stmAttackers = attackers & pieces_of_color(them);
- if (!stmAttackers)
- return seeValues[capture];
-
- attackers &= occ; // Remove the moving piece
-
- // The destination square is defended, which makes things rather more
- // difficult to compute. We proceed by building up a "swap list" containing
- // the material gain or loss at each stop in a sequence of captures to the
- // destination square, where the sides alternately capture, and always
- // capture with the least valuable piece. After each capture, we look for
- // new X-ray attacks from behind the capturing piece.
- int lastCapturingPieceValue = seeValues[piece];
- int swapList[32], n = 1;
- Color c = them;
- PieceType pt;
-
- swapList[0] = seeValues[capture];
-
- do {
- // Locate the least valuable attacker for the side to move. The loop
- // below looks like it is potentially infinite, but it isn't. We know
- // that the side to move still has at least one attacker left.
- for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++)
- assert(pt < KING);
-
- // Remove the attacker we just found from the 'attackers' bitboard,
- // and scan for new X-ray attacks behind the attacker.
- b = stmAttackers & pieces(pt);
- occ ^= (b & (~b + 1));
- attackers |= (rook_attacks_bb(to, occ) & pieces(ROOK, QUEEN))
- | (bishop_attacks_bb(to, occ) & pieces(BISHOP, QUEEN));
-
- attackers &= occ;
-
- // Add the new entry to the swap list
- assert(n < 32);
- swapList[n] = -swapList[n - 1] + lastCapturingPieceValue;
- n++;
-
- // Remember the value of the capturing piece, and change the side to move
- // before beginning the next iteration
- lastCapturingPieceValue = seeValues[pt];
- c = opposite_color(c);
- stmAttackers = attackers & pieces_of_color(c);
-
- // Stop after a king capture
- if (pt == KING && stmAttackers)