mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-19 08:36:33 +08: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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user