Test with SEE shortcut
authorMarco Costalba <mcostalba@gmail.com>
Sat, 25 Oct 2008 19:44:10 +0000 (20:44 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 26 Oct 2008 09:11:13 +0000 (10:11 +0100)
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp

index f0d15d734aa0c2625dacaa3210c9480835911fc8..0b45099c8e669a5c75ea0adec4d341f5fa812b12 100644 (file)
@@ -1629,16 +1629,23 @@ int Position::see(Square from, Square to) const {
              | (pawn_attacks(WHITE, to)    & pawns(BLACK))
              | (pawn_attacks(BLACK, to)    & pawns(WHITE));
 
-  attackers &= occ; // Re-add removed piece
-
   // If the opponent has no attackers, we are finished
   if ((attackers & pieces_of_color(them)) == EmptyBoardBB)
       return seeValues[capture];
 
+  attackers &= occ; // Remove the moving piece
+
+  // If we don't have any attacker but the moving piece (common case)
+  // then we loose our piece and gain the opponent attacked one.
+  // Note that this is not perfect! It does not detect x-rays of
+  // an our piece behind an opposite one. But is a very rare case.
+  if ((attackers & pieces_of_color(us)) == EmptyBoardBB)
+      return seeValues[capture] - seeValues[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
-  // destianation square, where the sides alternately capture, and always
+  // 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];