Make racing kings rules fully lichess compliant
authorFabian Fichter <ianfab@users.noreply.github.com>
Thu, 24 Dec 2020 19:44:38 +0000 (20:44 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Thu, 24 Dec 2020 19:44:38 +0000 (20:44 +0100)
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

src/position.cpp
tests/perft.sh

index e548a7e..38b2cc6 100644 (file)
@@ -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<KING>(sideToMove)
+          && (capture_the_flag(sideToMove) & attacks_from(sideToMove, KING, square<KING>(sideToMove))))
+      {
+          assert(capture_the_flag_piece() == KING);
+          gameEnd = true;
+          for (const auto& m : MoveList<NON_EVASIONS>(*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)
   {
index 261e565..b32f495 100755 (executable)
@@ -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