From: Marco Costalba Date: Sun, 2 Jan 2011 23:35:05 +0000 (+0100) Subject: Fix Chess960 regression X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=22ede4442cd285d7365b9497c3be65fb2c66b4be;ds=sidebyside Fix Chess960 regression Introduced by me in before 1.9 and found by Tord that says: The 'isChess960' slot in the 'Position' class is currently set depending on the initial files of the rooks, and not on the value of the UCI_Chess960 parameter. This is incorrect, as there are lots of Chess960 positions where the rooks start on the usual files. As a consequence (unless I am missing something), Stockfish will occasionally output castling moves as e1g1/e1c1 rather than the correct e1h1/e1a1 format in Chess960 games. It is possible that some or even most GUIs are robust enough to accept both notations, but I wouldn't bet on it. And in any case, Stockfish's behavior clearly violates the protocol. Signed-off-by: Marco Costalba --- diff --git a/src/position.cpp b/src/position.cpp index f0301e4e..d3ca869b 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -274,10 +274,6 @@ void Position::from_fen(const string& fen) { castleRightsMask[make_square(initialQRFile, RANK_1)] ^= WHITE_OOO; castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO; - isChess960 = initialKFile != FILE_E - || initialQRFile != FILE_A - || initialKRFile != FILE_H; - find_checkers(); st->key = compute_key(); @@ -353,7 +349,7 @@ bool Position::set_castling_rights(char token) { /// Position::to_fen() returns a FEN representation of the position. In case /// of Chess960 the Shredder-FEN notation is used. Mainly a debugging function. -const string Position::to_fen() const { +const string Position::to_fen(bool isChess960) const { string fen; Square sq; @@ -440,7 +436,8 @@ void Position::print(Move move) const { cout << c << pieceLetters.from_piece(piece) << c << '|'; } } - cout << dottedLine << "Fen is: " << to_fen() << "\nKey is: " << st->key << endl; + bool chess960 = (cout.iword(0) != 0); // See set960() + cout << dottedLine << "Fen is: " << to_fen(chess960) << "\nKey is: " << st->key << endl; requestPending = false; } diff --git a/src/position.h b/src/position.h index 5b1bc664..0a6ab136 100644 --- a/src/position.h +++ b/src/position.h @@ -138,7 +138,7 @@ public: // Text input/output void from_fen(const std::string& fen); - const std::string to_fen() const; + const std::string to_fen(bool isChess960) const; void print(Move m = MOVE_NONE) const; // Copying @@ -258,7 +258,6 @@ public: // Other properties of the position bool opposite_colored_bishops() const; bool has_pawn_on_7th(Color c) const; - bool is_chess960() const; // Current thread ID searching on the position int thread() const; @@ -323,7 +322,6 @@ private: int castleRightsMask[64]; StateInfo startState; File initialKFile, initialKRFile, initialQRFile; - bool isChess960; int startPosPlyCounter; int threadID; int64_t nodes; @@ -553,10 +551,6 @@ inline bool Position::has_pawn_on_7th(Color c) const { return pieces(PAWN, c) & relative_rank_bb(c, RANK_7); } -inline bool Position::is_chess960() const { - return isChess960; -} - inline bool Position::move_is_capture(Move m) const { // Move must not be MOVE_NONE ! diff --git a/src/search.cpp b/src/search.cpp index 0e249705..53a8bec9 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -484,7 +484,7 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[ std::string name = Options["Search Log Filename"].value(); LogFile.open(name.c_str(), std::ios::out | std::ios::app); - LogFile << "Searching: " << pos.to_fen() + LogFile << "Searching: " << pos.to_fen(Options["UCI_Chess960"].value()) << "\ninfinite: " << infinite << " ponder: " << ponder << " time: " << myTime @@ -570,7 +570,7 @@ namespace { Iteration = 1; // Send initial RootMoveList scoring (iteration 1) - cout << set960(pos.is_chess960()) // Is enough to set once at the beginning + cout << set960(Options["UCI_Chess960"].value()) // Is enough to set once at the beginning << "info depth " << Iteration << "\n" << rml[0].pv_info_to_uci(pos, alpha, beta) << endl;