From: Fabian Fichter Date: Mon, 30 Dec 2024 12:54:58 +0000 (+0100) Subject: Handle invalid castling FEN X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=4d8f3d27d156c47d6a3bd35a3a1bfe082fa270eb;p=fairystockfish.git Handle invalid castling FEN Closes #826. --- diff --git a/src/position.cpp b/src/position.cpp index bd4adc8..40fa6e3 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -362,10 +362,10 @@ Position& Position::set(const Variant* v, const string& fenStr, bool isChess960, token = char(toupper(token)); if (castling_enabled() && token == 'K') - for (rsq = make_square(var->castlingRookKingsideFile, castling_rank(c)); !(castling_rook_pieces(c) & type_of(piece_on(rsq))) || color_of(piece_on(rsq)) != c; --rsq) {} + for (rsq = make_square(var->castlingRookKingsideFile, castling_rank(c)); (!(castling_rook_pieces(c) & type_of(piece_on(rsq))) || color_of(piece_on(rsq)) != c) && file_of(rsq) > FILE_A; --rsq) {} else if (castling_enabled() && token == 'Q') - for (rsq = make_square(var->castlingRookQueensideFile, castling_rank(c)); !(castling_rook_pieces(c) & type_of(piece_on(rsq))) || color_of(piece_on(rsq)) != c; ++rsq) {} + for (rsq = make_square(var->castlingRookQueensideFile, castling_rank(c)); (!(castling_rook_pieces(c) & type_of(piece_on(rsq))) || color_of(piece_on(rsq)) != c) && file_of(rsq) < max_file(); ++rsq) {} else if (token >= 'A' && token <= 'A' + max_file()) rsq = make_square(File(token - 'A'), castling_rank(c)); @@ -382,6 +382,12 @@ Position& Position::set(const Variant* v, const string& fenStr, bool isChess960, st->castlingKingSquare[c] = isChess960 && piece_on(rsq) == make_piece(c, castling_king_piece(c)) ? rsq : castlingKings && (!more_than_one(castlingKings) || isChess960) ? lsb(castlingKings) : make_square(castling_king_file(), castling_rank(c)); + // Skip invalid castling rights + if (!(castlingKings & st->castlingKingSquare[c])) + { + st->castlingKingSquare[c] = SQ_NONE; + continue; + } } // Set gates (and skip castling rights) diff --git a/test.py b/test.py index 0999589..9198914 100644 --- a/test.py +++ b/test.py @@ -427,6 +427,12 @@ class TestPyffish(unittest.TestCase): result = sf.get_fen("chess", "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 1 2", []) self.assertEqual(result, "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 1 2") + # invalid castling rights + result = sf.get_fen("chess", "8/rnbqkbnr/pppppppp/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", []) + self.assertEqual(result, "8/rnbqkbnr/pppppppp/8/8/8/PPPPPPPP/RNBQKBNR w KQ - 0 1") + result = sf.get_fen("chess", "r7/1nbqkbnr/pppppppp/8/8/P6P/RPPPPPPR/1NBQKBN1 w KQkq - 0 1", []) + self.assertEqual(result, "r7/1nbqkbnr/pppppppp/8/8/P6P/RPPPPPPR/1NBQKBN1 w - - 0 1") + # alternative piece symbols result = sf.get_fen("janggi", "rhea1aehr/4k4/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/4K4/RHEA1AEHR w - - 0 1", []) self.assertEqual(result, JANGGI)