X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=1fe723aec461e20a303582484349b9696ca9c552;hp=388f91f34172806157a7f44573a6177b7a94193d;hb=dddaeff7d8d4a0c255310d054a53066296e71004;hpb=a806d7c3d65bdea85125aa3611537974c6e0c030 diff --git a/src/position.cpp b/src/position.cpp index 388f91f3..1fe723ae 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1300,13 +1300,13 @@ void Position::undo_null_move() { int Position::see(Square to) const { assert(square_is_ok(to)); - return see(SQ_NONE, to); + return see(SQ_NONE, to, false); } int Position::see(Move m) const { assert(move_is_ok(m)); - return see(move_from(m), move_to(m)); + return see(move_from(m), move_to(m), false); } int Position::see_sign(Move m) const { @@ -1322,10 +1322,10 @@ int Position::see_sign(Move m) const { && type_of_piece_on(from) != KING) return 1; - return see(from, to); + return see(from, to, true); } -int Position::see(Square from, Square to) const { +int Position::see(Square from, Square to, bool shortcut) const { // Material values static const int seeValues[18] = { @@ -1337,7 +1337,9 @@ int Position::see(Square from, Square to) const { }; Bitboard attackers, stmAttackers, b; + int pieceDiff = 0; + assert(!shortcut || from != SQ_NONE); assert(square_is_ok(from) || from == SQ_NONE); assert(square_is_ok(to)); @@ -1350,6 +1352,26 @@ int Position::see(Square from, Square to) const { Piece capture = piece_on(to); Bitboard occ = occupied_squares(); + // King cannot be recaptured + if (type_of_piece(piece) == KING) + return seeValues[capture]; + + // If captured piece is defended by enemy pawns or knights then SEE is negative + // when captured piece value does not compensate the lost of capturing one. + if (shortcut) + { + pieceDiff = seeValues[piece] - seeValues[capture]; + + if ( pieceDiff > seeValues[PAWN] + &&(attacks_from(to, us) & pieces(PAWN, them))) + return -(pieceDiff - seeValues[PAWN] / 2); + + if ( pieceDiff > seeValues[KNIGHT] + && pieces(KNIGHT, them) + &&(pieces(KNIGHT, them) & attacks_from(to))) + return -(pieceDiff - seeValues[KNIGHT] / 2); + } + // Handle en passant moves if (st->epSquare == to && type_of_piece_on(from) == PAWN) { @@ -1420,6 +1442,15 @@ int Position::see(Square from, Square to) const { for (pt = PAWN; !(stmAttackers & pieces(pt)); pt++) assert(pt < KING); + // If captured piece is defended by an enemy piece then SEE is negative + // if captured piece value does not compensate the lost of capturing one. + if (pieceDiff > seeValues[pt]) + { + assert(shortcut); + return -(pieceDiff - seeValues[pt] / 2); + } else + pieceDiff = 0; // Only first cycle + // Remove the attacker we just found from the 'attackers' bitboard, // and scan for new X-ray attacks behind the attacker. b = stmAttackers & pieces(pt);