X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=abe75807e2869044b05aad7b1cdfd696c31594bf;hp=063233111dea59066bffb702c3597ec31ca7b87f;hb=342ceb1c9124ced53650d6c422a8cfa32e0b12ef;hpb=7b05b83bf2f69b1fac0271acd28b2382253f2e37 diff --git a/src/position.cpp b/src/position.cpp index 06323311..abe75807 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1867,21 +1867,6 @@ Value Position::compute_non_pawn_material(Color c) const { } -/// Position::is_mate() returns true or false depending on whether the -/// side to move is checkmated. Note that this function is currently very -/// slow, and shouldn't be used frequently inside the search. - -bool Position::is_mate() const { - - if (is_check()) - { - MovePicker mp = MovePicker(*this, false, MOVE_NONE, EmptySearchStack, Depth(0)); - return mp.get_next_move() == MOVE_NONE; - } - return false; -} - - /// Position::is_draw() tests whether the position is drawn by material, /// repetition, or the 50 moves rule. It does not detect stalemates, this /// must be done by the search. @@ -1906,21 +1891,25 @@ bool Position::is_draw() const { } +/// Position::is_mate() returns true or false depending on whether the +/// side to move is checkmated. + +bool Position::is_mate() const { + + MoveStack moves[256]; + + return is_check() && !generate_evasions(*this, moves, pinned_pieces(sideToMove)); +} + + /// Position::has_mate_threat() tests whether a given color has a mate in one -/// from the current position. This function is quite slow, but it doesn't -/// matter, because it is currently only called from PV nodes, which are rare. +/// from the current position. bool Position::has_mate_threat(Color c) { StateInfo st1, st2; Color stm = side_to_move(); - // The following lines are useless and silly, but prevents gcc from - // emitting a stupid warning stating that u1.lastMove and u1.epSquare might - // be used uninitialized. - st1.lastMove = st->lastMove; - st1.epSquare = st->epSquare; - if (is_check()) return false; @@ -1931,18 +1920,26 @@ bool Position::has_mate_threat(Color c) { MoveStack mlist[120]; int count; bool result = false; + Bitboard dc = discovered_check_candidates(sideToMove); + Bitboard pinned = pinned_pieces(sideToMove); - // Generate legal moves - count = generate_legal_moves(*this, mlist); + // Generate pseudo-legal non-capture and capture check moves + count = generate_non_capture_checks(*this, mlist, dc); + count += generate_captures(*this, mlist + count); // Loop through the moves, and see if one of them is mate for (int i = 0; i < count; i++) { - do_move(mlist[i].move, st2); + Move move = mlist[i].move; + + if (!pl_move_is_legal(move, pinned)) + continue; + + do_move(move, st2); if (is_mate()) result = true; - undo_move(mlist[i].move); + undo_move(move); } // Undo null move, if necessary