X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=42c1adff71591a270148adb43b37d2588cd2fe29;hp=49935904bdc5b03afa2418bd342140a000861fe6;hb=652199d8403bec5e534581715b58b0d11de915a2;hpb=e551afbab7767ddf79d33c24f8307a8cb291e3cd diff --git a/src/position.cpp b/src/position.cpp index 49935904..42c1adff 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -272,7 +272,7 @@ Position& Position::set(const string& fenStr, bool isChess960, StateInfo* si, Th // 5-6. Halfmove clock and fullmove number ss >> std::skipws >> st->rule50 >> gamePly; - // Convert from fullmove starting from 1 to ply starting from 0, + // Convert from fullmove starting from 1 to gamePly starting from 0, // handle also common incorrect FEN with fullmove = 0. gamePly = std::max(2 * (gamePly - 1), 0) + (sideToMove == BLACK); @@ -993,10 +993,8 @@ bool Position::see_ge(Move m, Value threshold) const { assert(is_ok(m)); - // Castling moves are implemented as king capturing the rook so cannot be - // handled correctly. Simply assume the SEE value is VALUE_ZERO that is always - // correct unless in the rare case the rook ends up under attack. - if (type_of(m) == CASTLING) + // Only deal with normal moves, assume others pass a simple see + if (type_of(m) != NORMAL) return VALUE_ZERO >= threshold; Square from = from_sq(m), to = to_sq(m); @@ -1005,30 +1003,18 @@ bool Position::see_ge(Move m, Value threshold) const { Value balance; // Values of the pieces taken by us minus opponent's ones Bitboard occupied, stmAttackers; - if (type_of(m) == ENPASSANT) - { - occupied = SquareBB[to - pawn_push(~stm)]; // Remove the captured pawn - balance = PieceValue[MG][PAWN]; - } - else - { - balance = PieceValue[MG][piece_on(to)]; - occupied = 0; - } + balance = PieceValue[MG][piece_on(to)]; if (balance < threshold) return false; - if (nextVictim == KING) - return true; - balance -= PieceValue[MG][nextVictim]; - if (balance >= threshold) + if (balance >= threshold) // Always true if nextVictim == KING return true; bool relativeStm = true; // True if the opponent is to move - occupied ^= pieces() ^ from ^ to; + occupied = pieces() ^ from ^ to; // Find all attackers to the destination square, with the moving piece removed, // but possibly an X-ray attacker added behind it. @@ -1085,11 +1071,10 @@ bool Position::is_draw(int ply) const { { stp = stp->previous->previous; - // At root position ply is 1, so return a draw score if a position - // repeats once earlier but strictly after the root, or repeats twice - // before or at the root. + // Return a draw score if a position repeats once earlier but strictly + // after the root, or repeats twice before or at the root. if ( stp->key == st->key - && ++cnt + (ply - 1 > i) == 2) + && ++cnt + (ply > i) == 2) return true; }