From: Fabian Fichter Date: Thu, 24 Dec 2020 19:44:38 +0000 (+0100) Subject: Make racing kings rules fully lichess compliant X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=e5bd30f07ee1798a5b3f3471e263e83f50e292cf;p=fairystockfish.git Make racing kings rules fully lichess compliant racingkings STC LLR: 2.97 (-2.94,2.94) [-10.00,5.00] Total: 1512 W: 500 L: 459 D: 553 http://www.variantfishtest.org:6543/tests/view/5fe4c2e76e23db221d9e96ac racingkings LTC LLR: 2.95 (-2.94,2.94) [-10.00,5.00] Total: 1509 W: 452 L: 413 D: 644 http://www.variantfishtest.org:6543/tests/view/5fe4c8c86e23db221d9e96af --- diff --git a/src/position.cpp b/src/position.cpp index e548a7e..38b2cc6 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -2128,13 +2128,6 @@ bool Position::is_immediate_game_end(Value& result, int ply) const { } // capture the flag if ( capture_the_flag_piece() - && !flag_move() - && (capture_the_flag(~sideToMove) & pieces(~sideToMove, capture_the_flag_piece()))) - { - result = mated_in(ply); - return true; - } - if ( capture_the_flag_piece() && flag_move() && (capture_the_flag(sideToMove) & pieces(sideToMove, capture_the_flag_piece()))) { @@ -2142,6 +2135,30 @@ bool Position::is_immediate_game_end(Value& result, int ply) const { && sideToMove == WHITE ? VALUE_DRAW : mate_in(ply); return true; } + if ( capture_the_flag_piece() + && (!flag_move() || capture_the_flag_piece() == KING) + && (capture_the_flag(~sideToMove) & pieces(~sideToMove, capture_the_flag_piece()))) + { + bool gameEnd = true; + // Check whether king can move to CTF zone + if ( flag_move() && sideToMove == BLACK && !checkers() && count(sideToMove) + && (capture_the_flag(sideToMove) & attacks_from(sideToMove, KING, square(sideToMove)))) + { + assert(capture_the_flag_piece() == KING); + gameEnd = true; + for (const auto& m : MoveList(*this)) + if (type_of(moved_piece(m)) == KING && (capture_the_flag(sideToMove) & to_sq(m)) && legal(m)) + { + gameEnd = false; + break; + } + } + if (gameEnd) + { + result = mated_in(ply); + return true; + } + } // nCheck if (check_counting() && checks_remaining(~sideToMove) == 0) { diff --git a/tests/perft.sh b/tests/perft.sh index 261e565..b32f495 100755 --- a/tests/perft.sh +++ b/tests/perft.sh @@ -44,7 +44,9 @@ if [[ $1 == "" || $1 == "variant" ]]; then expect perft.exp newzealand startpos 5 4987426 > /dev/null expect perft.exp loop startpos 5 4888832 > /dev/null expect perft.exp chessgi startpos 5 4889167 > /dev/null - expect perft.exp racingkings startpos 5 9472927 > /dev/null + expect perft.exp racingkings startpos 4 296242 > /dev/null + expect perft.exp racingkings "fen 6r1/2K5/5k2/8/3R4/8/8/8 w - - 0 1" 4 86041 > /dev/null + expect perft.exp racingkings "fen 6R1/2k5/5K2/8/3r4/8/8/8 b - - 0 1" 4 86009 > /dev/null expect perft.exp knightmate startpos 5 3249033 > /dev/null expect perft.exp losers startpos 5 2723795 > /dev/null expect perft.exp antichess startpos 5 2732672 > /dev/null