X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=be4e234d99d9b937036ee9d6fabb9cec170a0e40;hp=1fe723aec461e20a303582484349b9696ca9c552;hb=deecb3757ca03fa2c9ebc87fd9efe4c2ba05f740;hpb=dddaeff7d8d4a0c255310d054a53066296e71004 diff --git a/src/position.cpp b/src/position.cpp index 1fe723ae..be4e234d 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -470,7 +470,6 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { assert(is_ok()); assert(move_is_ok(m)); assert(pinned == pinned_pieces(side_to_move())); - assert(!is_check()); // Castling moves are checked for legality during move generation. if (move_is_castle(m)) @@ -482,7 +481,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const { assert(color_of_piece_on(from) == us); assert(piece_on(king_square(us)) == piece_of_color_and_type(us, KING)); - // En passant captures are a tricky special case. Because they are + // En passant captures are a tricky special case. Because they are // rather uncommon, we do it simply by testing whether the king is attacked // after the move is made if (move_is_ep(m)) @@ -1300,13 +1299,13 @@ void Position::undo_null_move() { int Position::see(Square to) const { assert(square_is_ok(to)); - return see(SQ_NONE, to, false); + return see(SQ_NONE, to); } int Position::see(Move m) const { assert(move_is_ok(m)); - return see(move_from(m), move_to(m), false); + return see(move_from(m), move_to(m)); } int Position::see_sign(Move m) const { @@ -1322,10 +1321,10 @@ int Position::see_sign(Move m) const { && type_of_piece_on(from) != KING) return 1; - return see(from, to, true); + return see(from, to); } -int Position::see(Square from, Square to, bool shortcut) const { +int Position::see(Square from, Square to) const { // Material values static const int seeValues[18] = { @@ -1337,7 +1336,6 @@ int Position::see(Square from, Square to, bool shortcut) const { }; Bitboard attackers, stmAttackers, b; - int pieceDiff = 0; assert(!shortcut || from != SQ_NONE); assert(square_is_ok(from) || from == SQ_NONE); @@ -1356,22 +1354,6 @@ int Position::see(Square from, Square to, bool shortcut) const { 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) { @@ -1442,15 +1424,6 @@ int Position::see(Square from, Square to, bool shortcut) 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); @@ -1732,8 +1705,7 @@ bool Position::is_draw() const { bool Position::is_mate() const { MoveStack moves[256]; - - return is_check() && (generate_evasions(*this, moves, pinned_pieces(sideToMove)) == moves); + return is_check() && (generate_moves(*this, moves, false) == moves); }