Support Makpong (Defensive Chess)
authorFabian Fichter <ianfab@users.noreply.github.com>
Thu, 6 Feb 2020 20:45:34 +0000 (21:45 +0100)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 7 Feb 2020 15:22:16 +0000 (16:22 +0100)
https://www.mayhematics.com/v/vol8/vc64b.pdf
https://books.google.de/books?id=0O02DwAAQBAJ&pg=PA81&lpg=PA81&dq=makpong

Closes #72.

No functional change for other variants.

src/parser.cpp
src/position.cpp
src/variant.cpp
src/variant.h
src/variants.ini

index a64a1e7..8798b17 100644 (file)
@@ -240,6 +240,7 @@ Variant* VariantParser<DoCheck>::parse(Variant* v) {
     parse_attribute("gating", v->gating);
     parse_attribute("seirawanGating", v->seirawanGating);
     parse_attribute("cambodianMoves", v->cambodianMoves);
+    parse_attribute("makpongRule", v->makpongRule);
     parse_attribute("flyingGeneral", v->flyingGeneral);
     parse_attribute("xiangqiSoldier", v->xiangqiSoldier);
     // game end
index b84d9b6..efd48a9 100644 (file)
@@ -891,6 +891,10 @@ bool Position::legal(Move m) const {
           return false;
   }
 
+  // Makpong rule
+  if (var->makpongRule && checkers() && type_of(moved_piece(m)) == KING && (checkers() ^ to))
+      return false;
+
   // If the moving piece is a king, check whether the destination
   // square is attacked by the opponent. Castling moves are checked
   // for legality during move generation.
index df7f1dc..70a41d4 100644 (file)
@@ -59,6 +59,7 @@ namespace {
         v->add_piece(FERS, 'f');
         return v;
     }
+    // Makruk (Thai Chess)
     Variant* makruk_variant() {
         Variant* v = chess_variant();
         v->variantTemplate = "makruk";
@@ -76,6 +77,14 @@ namespace {
         v->countingRule = MAKRUK_COUNTING;
         return v;
     }
+    // Makpong (Defensive Chess)
+    // A Makruk variant used for tie-breaks
+    // https://www.mayhematics.com/v/vol8/vc64b.pdf, p. 177
+    Variant* makpong_variant() {
+        Variant* v = makruk_variant();
+        v->makpongRule = true;
+        return v;
+    }
     Variant* cambodian_variant() {
         Variant* v = makruk_variant();
         v->startFen = "rnsmksnr/8/pppppppp/8/8/PPPPPPPP/8/RNSKMSNR w DEde - 0 1";
@@ -830,6 +839,7 @@ void VariantMap::init() {
     add("nocastle", nocastle_variant());
     add("fairy", fairy_variant()); // fairy variant used for endgame code initialization
     add("makruk", makruk_variant());
+    add("makpong", makpong_variant());
     add("cambodian", cambodian_variant());
     add("karouk", karouk_variant());
     add("asean", asean_variant());
index e31b654..ec7712a 100644 (file)
@@ -85,6 +85,7 @@ struct Variant {
   bool gating = false;
   bool seirawanGating = false;
   bool cambodianMoves = false;
+  bool makpongRule = false;
   bool flyingGeneral = false;
   bool xiangqiSoldier = false;
   // game end
index 059176b..89fe1ef 100644 (file)
 # gating: maintain squares on backrank with extra rights in castling field of FEN [bool] (default: false)
 # seirawanGating: allow gating of pieces in hand like in S-Chess, requires "gating = true" [bool] (default: false)
 # cambodianMoves: enable special moves of cambodian chess, requires "gating = true" [bool] (default: false)
+# makpongRule: the king may not move away from check [bool] (default: false)
 # flyingGeneral: disallow general face-off like in xiangqi [bool] (default: false)
 # xiangqiSoldier: restrict soldier to shogi pawn movements on first five ranks [bool] (default: false)
 # nMoveRule: move count for 50/n-move rule [int] (default: 50)