]> git.sesse.net Git - stockfish/commitdiff
Fix Chess960 regression
authorMarco Costalba <mcostalba@gmail.com>
Sun, 2 Jan 2011 23:35:05 +0000 (00:35 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 2 Jan 2011 23:41:39 +0000 (00:41 +0100)
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 <mcostalba@gmail.com>
src/position.cpp
src/position.h
src/search.cpp

index f0301e4ec9308af1a78394c5728b0246b1af30a3..d3ca869b8215e20e22e947f95e946f4fdfb53116 100644 (file)
@@ -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;
 
   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();
   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.
 
 /// 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;
 
   string fen;
   Square sq;
@@ -440,7 +436,8 @@ void Position::print(Move move) const {
           cout << c << pieceLetters.from_piece(piece) << c << '|';
       }
   }
           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;
 }
 
   requestPending = false;
 }
 
index 5b1bc664be7782f713f1b8641e8aafe9058dc8e4..0a6ab136156577d577d840ad6b95694a514c155a 100644 (file)
@@ -138,7 +138,7 @@ public:
 
   // Text input/output
   void from_fen(const std::string& fen);
 
   // 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
   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;
   // 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;
 
   // Current thread ID searching on the position
   int thread() const;
@@ -323,7 +322,6 @@ private:
   int castleRightsMask[64];
   StateInfo startState;
   File initialKFile, initialKRFile, initialQRFile;
   int castleRightsMask[64];
   StateInfo startState;
   File initialKFile, initialKRFile, initialQRFile;
-  bool isChess960;
   int startPosPlyCounter;
   int threadID;
   int64_t nodes;
   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);
 }
 
   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 !
 inline bool Position::move_is_capture(Move m) const {
 
   // Move must not be MOVE_NONE !
index 0e249705fa59a89e00d1f689d714bf33bbe024f9..53a8bec9b15751981c22354e4a02525274c79887 100644 (file)
@@ -484,7 +484,7 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[
       std::string name = Options["Search Log Filename"].value<std::string>();
       LogFile.open(name.c_str(), std::ios::out | std::ios::app);
 
       std::string name = Options["Search Log Filename"].value<std::string>();
       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<bool>())
               << "\ninfinite: " << infinite
               << " ponder: "    << ponder
               << " time: "      << myTime
               << "\ninfinite: " << infinite
               << " ponder: "    << ponder
               << " time: "      << myTime
@@ -570,7 +570,7 @@ namespace {
     Iteration = 1;
 
     // Send initial RootMoveList scoring (iteration 1)
     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<bool>()) // Is enough to set once at the beginning
          << "info depth " << Iteration
          << "\n" << rml[0].pv_info_to_uci(pos, alpha, beta) << endl;
 
          << "info depth " << Iteration
          << "\n" << rml[0].pv_info_to_uci(pos, alpha, beta) << endl;