1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

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 <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-01-03 00:35:05 +01:00
parent deee18c758
commit 22ede4442c
3 changed files with 6 additions and 15 deletions

View 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;
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;
}

View file

@ -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 !

View 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);
LogFile << "Searching: " << pos.to_fen()
LogFile << "Searching: " << pos.to_fen(Options["UCI_Chess960"].value<bool>())
<< "\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<bool>()) // Is enough to set once at the beginning
<< "info depth " << Iteration
<< "\n" << rml[0].pv_info_to_uci(pos, alpha, beta) << endl;