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