mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33: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:
parent
deee18c758
commit
22ede4442c
3 changed files with 6 additions and 15 deletions
|
@ -274,10 +274,6 @@ void Position::from_fen(const string& fen) {
|
||||||
castleRightsMask[make_square(initialQRFile, RANK_1)] ^= WHITE_OOO;
|
castleRightsMask[make_square(initialQRFile, RANK_1)] ^= WHITE_OOO;
|
||||||
castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO;
|
castleRightsMask[make_square(initialQRFile, RANK_8)] ^= BLACK_OOO;
|
||||||
|
|
||||||
isChess960 = initialKFile != FILE_E
|
|
||||||
|| initialQRFile != FILE_A
|
|
||||||
|| initialKRFile != FILE_H;
|
|
||||||
|
|
||||||
find_checkers();
|
find_checkers();
|
||||||
|
|
||||||
st->key = compute_key();
|
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
|
/// Position::to_fen() returns a FEN representation of the position. In case
|
||||||
/// of Chess960 the Shredder-FEN notation is used. Mainly a debugging function.
|
/// 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;
|
string fen;
|
||||||
Square sq;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,7 @@ public:
|
||||||
|
|
||||||
// Text input/output
|
// Text input/output
|
||||||
void from_fen(const std::string& fen);
|
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;
|
void print(Move m = MOVE_NONE) const;
|
||||||
|
|
||||||
// Copying
|
// Copying
|
||||||
|
@ -258,7 +258,6 @@ public:
|
||||||
// Other properties of the position
|
// Other properties of the position
|
||||||
bool opposite_colored_bishops() const;
|
bool opposite_colored_bishops() const;
|
||||||
bool has_pawn_on_7th(Color c) const;
|
bool has_pawn_on_7th(Color c) const;
|
||||||
bool is_chess960() const;
|
|
||||||
|
|
||||||
// Current thread ID searching on the position
|
// Current thread ID searching on the position
|
||||||
int thread() const;
|
int thread() const;
|
||||||
|
@ -323,7 +322,6 @@ private:
|
||||||
int castleRightsMask[64];
|
int castleRightsMask[64];
|
||||||
StateInfo startState;
|
StateInfo startState;
|
||||||
File initialKFile, initialKRFile, initialQRFile;
|
File initialKFile, initialKRFile, initialQRFile;
|
||||||
bool isChess960;
|
|
||||||
int startPosPlyCounter;
|
int startPosPlyCounter;
|
||||||
int threadID;
|
int threadID;
|
||||||
int64_t nodes;
|
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 {
|
inline bool Position::move_is_capture(Move m) const {
|
||||||
|
|
||||||
// Move must not be MOVE_NONE !
|
// Move must not be MOVE_NONE !
|
||||||
|
|
|
@ -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>();
|
std::string name = Options["Search Log Filename"].value<std::string>();
|
||||||
LogFile.open(name.c_str(), std::ios::out | std::ios::app);
|
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
|
<< "\ninfinite: " << infinite
|
||||||
<< " ponder: " << ponder
|
<< " ponder: " << ponder
|
||||||
<< " time: " << myTime
|
<< " time: " << myTime
|
||||||
|
@ -570,7 +570,7 @@ namespace {
|
||||||
Iteration = 1;
|
Iteration = 1;
|
||||||
|
|
||||||
// Send initial RootMoveList scoring (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
|
<< "info depth " << Iteration
|
||||||
<< "\n" << rml[0].pv_info_to_uci(pos, alpha, beta) << endl;
|
<< "\n" << rml[0].pv_info_to_uci(pos, alpha, beta) << endl;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue