From: Fabian Fichter Date: Thu, 6 Feb 2020 20:45:34 +0000 (+0100) Subject: Support Makpong (Defensive Chess) X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=4f669c7ae63690882271e2a4a2ff09581757d16f;p=fairystockfish.git Support Makpong (Defensive Chess) 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. --- diff --git a/src/parser.cpp b/src/parser.cpp index a64a1e7..8798b17 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -240,6 +240,7 @@ Variant* VariantParser::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 diff --git a/src/position.cpp b/src/position.cpp index b84d9b6..efd48a9 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -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. diff --git a/src/variant.cpp b/src/variant.cpp index df7f1dc..70a41d4 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -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()); diff --git a/src/variant.h b/src/variant.h index e31b654..ec7712a 100644 --- a/src/variant.h +++ b/src/variant.h @@ -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 diff --git a/src/variants.ini b/src/variants.ini index 059176b..89fe1ef 100644 --- a/src/variants.ini +++ b/src/variants.ini @@ -142,6 +142,7 @@ # 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)