- if (type_of(m) == ENPASSANT)
- {
- occupied ^= to - pawn_push(stm); // Remove the captured pawn
- swapList[0] = PieceValue[MG][PAWN];
- }
-
- // Find all attackers to the destination square, with the moving piece
- // removed, but possibly an X-ray attacker added behind it.
- attackers = attackers_to(to, occupied) & occupied;
-
- // If the opponent has no attackers we are finished
- stm = ~stm;
- stmAttackers = attackers & pieces(stm);
- if (!stmAttackers)
- return swapList[0];
-
- // 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.
- captured = type_of(piece_on(from));
-
- do {
- assert(slIndex < 32);
-
- // Add the new entry to the swap list
- swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured];
- slIndex++;
-
- // Locate and remove the next least valuable attacker
- captured = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
- stm = ~stm;
- stmAttackers = attackers & pieces(stm);
-
- // Stop before processing a king capture
- if (captured == KING && stmAttackers)
- {
- swapList[slIndex++] = QueenValueMg * 16;
- break;
- }
-
- } while (stmAttackers);
-
- // If we are doing asymmetric SEE evaluation and the same side does the first
- // and the last capture, he loses a tempo and gain must be at least worth
- // 'asymmThreshold', otherwise we replace the score with a very low value,
- // before negamaxing.
- if (asymmThreshold)
- for (int i = 0; i < slIndex; i += 2)
- if (swapList[i] < asymmThreshold)
- swapList[i] = - QueenValueMg * 16;
-
- // Having built the swap list, we negamax through it to find the best
- // achievable score from the point of view of the side to move.
- while (--slIndex)
- swapList[slIndex-1] = std::min(-swapList[slIndex], swapList[slIndex-1]);
-
- return swapList[0];
-}