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
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.
v->add_piece(FERS, 'f');
return v;
}
+ // Makruk (Thai Chess)
Variant* makruk_variant() {
Variant* v = chess_variant();
v->variantTemplate = "makruk";
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";
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());
bool gating = false;
bool seirawanGating = false;
bool cambodianMoves = false;
+ bool makpongRule = false;
bool flyingGeneral = false;
bool xiangqiSoldier = false;
// game end
# 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)