X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposition.cpp;h=80dcdd5724afab805dea2e90fe374baa08f90c71;hb=62cd133b3a0697d7960943bb24704c3120506b71;hp=71556a566e49072d37023c5a07b74613e043303f;hpb=1a20d727019548de69314a90ae59a3b8a76b4ae7;p=stockfish diff --git a/src/position.cpp b/src/position.cpp index 71556a56..80dcdd57 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -36,7 +36,6 @@ #include "position.h" #include "psqtab.h" #include "rkiss.h" -#include "san.h" #include "tt.h" #include "ucioption.h" @@ -205,6 +204,7 @@ void Position::from_fen(const string& fen, bool c960) { */ char token; + int hmc, fmn; std::istringstream ss(fen); Rank rank = RANK_8; File file = FILE_A; @@ -265,12 +265,10 @@ void Position::from_fen(const string& fen, bool c960) { } // 5. Halfmove clock - int hmc; if (ss >> hmc) st->rule50 = hmc; // 6. Fullmove number - int fmn; if (ss >> fmn) startPosPlyCounter = (fmn - 1) * 2 + int(sideToMove == BLACK); @@ -774,6 +772,29 @@ bool Position::move_is_check(Move m, const CheckInfo& ci) const { } +/// Position::do_setup_move() makes a permanent move on the board. +/// It should be used when setting up a position on board. +/// You can't undo the move. + +void Position::do_setup_move(Move m) { + + StateInfo newSt; + + do_move(m, newSt); + + // Reset "game ply" in case we made a non-reversible move. + // "game ply" is used for repetition detection. + if (st->rule50 == 0) + st->gamePly = 0; + + // Update the number of plies played from the starting position + startPosPlyCounter++; + + // Our StateInfo newSt is about going out of scope so copy + // its content inside pos before it disappears. + detach(); +} + /// Position::do_move() makes a move, and saves all information necessary /// to a StateInfo object. The move is assumed to be legal. /// Pseudo-legal moves should be filtered out before this function is called. @@ -788,6 +809,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI assert(is_ok()); assert(move_is_ok(m)); + assert(&newSt != st); nodes++; Key key = st->key; @@ -803,8 +825,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI Value npMaterial[2]; }; - if (&newSt != st) - memcpy(&newSt, st, sizeof(ReducedStateInfo)); + memcpy(&newSt, st, sizeof(ReducedStateInfo)); newSt.previous = st; st = &newSt; @@ -1541,22 +1562,6 @@ void Position::clear() { } -/// Position::reset_game_ply() simply sets gamePly to 0. It is used from the -/// UCI interface code, whenever a non-reversible move is made in a -/// 'position fen moves m1 m2 ...' command. This makes it possible -/// for the program to handle games of arbitrary length, as long as the GUI -/// handles draws by the 50 move rule correctly. - -void Position::reset_game_ply() { - - st->gamePly = 0; -} - -void Position::inc_startpos_ply_counter() { - - startPosPlyCounter++; -} - /// Position::put_piece() puts a piece on the given square of the board, /// updating the board array, pieces list, bitboards, and piece counts. @@ -1691,7 +1696,7 @@ bool Position::is_draw() const { return true; // Draw by the 50 moves rule? - if (st->rule50 > 99 && (st->rule50 > 100 || !is_mate())) + if (st->rule50 > 99 && !is_mate()) return true; // Draw by repetition? @@ -1709,7 +1714,7 @@ bool Position::is_draw() const { bool Position::is_mate() const { MoveStack moves[MOVES_MAX]; - return is_check() && generate_moves(*this, moves) == moves; + return is_check() && generate(*this, moves) == moves; } @@ -1730,8 +1735,8 @@ bool Position::has_mate_threat() { do_null_move(st1); // Then generate pseudo-legal moves that could give check - last = generate_non_capture_checks(*this, mlist); - last = generate_captures(*this, last); + last = generate(*this, mlist); + last = generate(*this, last); // Loop through the moves, and see if one of them gives mate Bitboard pinned = pinned_pieces(sideToMove);