Fix a subtle bug in Position::move_is_capture()
authorMarco Costalba <mcostalba@gmail.com>
Fri, 13 Feb 2009 13:17:39 +0000 (14:17 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 13 Feb 2009 19:56:26 +0000 (20:56 +0100)
Currently fails if we test with a move that is not of
from the side to move but from the opponent.

This is the typical case of the threat from null move
search. The result is an erroneus prune of the defending
moves, see PruneDefendingMoves in ok_to_prune()

Fix the test to work also with threat moves.

Bug was always in but was unhidden by a patch of 17/12/2008
"Trigger of PawnEndgameExtension if capture is not a pawn"

Until then it was hidden by a tricky check in the prune
conditions instead of the natural move_is_capture()

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp

index 275dace2a033fe259052c09d800ffc64593ae4f9..a6f70c082cc99cb01d5b970047ab462959af117e 100644 (file)
@@ -665,7 +665,7 @@ bool Position::move_is_capture(Move m) const {
   assert(m != MOVE_NONE);
 
   return (   !square_is_empty(move_to(m))
-          && (color_of_piece_on(move_to(m)) == opposite_color(side_to_move()))
+          && (color_of_piece_on(move_to(m)) != color_of_piece_on(move_from(m)))
          )
          || move_is_ep(m);
 }