Generalize Xiangqi soldier promotion
authorFabian Fichter <ianfab@users.noreply.github.com>
Fri, 10 Apr 2020 13:01:57 +0000 (15:01 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Fri, 10 Apr 2020 13:01:57 +0000 (15:01 +0200)
No functional change.

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

index e638eac..eeaf00c 100644 (file)
@@ -246,7 +246,7 @@ Variant* VariantParser<DoCheck>::parse(Variant* v) {
     parse_attribute("kingPassOnStalemate", v->kingPassOnStalemate);
     parse_attribute("makpongRule", v->makpongRule);
     parse_attribute("flyingGeneral", v->flyingGeneral);
-    parse_attribute("xiangqiSoldier", v->xiangqiSoldier);
+    parse_attribute("soldierPromotionRank", v->soldierPromotionRank);
     // game end
     parse_attribute("nMoveRule", v->nMoveRule);
     parse_attribute("nFoldRule", v->nFoldRule);
index 1619b6f..5582b82 100644 (file)
@@ -985,10 +985,6 @@ bool Position::pseudo_legal(const Move m) const {
   if (type_of(m) != NORMAL || is_gating(m))
       return MoveList<LEGAL>(*this).contains(m);
 
-  // Xiangqi soldier
-  if (type_of(pc) == SOLDIER && unpromoted_soldier(us, from) && file_of(from) != file_of(to))
-      return false;
-
   // Handle the case where a mandatory piece promotion/demotion is not taken
   if (    mandatory_piece_promotion()
       && (is_promoted(from) ? piece_demotion() : promoted_piece_type(type_of(pc)) != NO_PIECE_TYPE)
index e340b5d..05ecc57 100644 (file)
@@ -592,7 +592,7 @@ inline bool Position::king_pass_on_stalemate() const {
 
 inline bool Position::unpromoted_soldier(Color c, Square s) const {
   assert(var != nullptr);
-  return var->xiangqiSoldier && relative_rank(c, s, var->maxRank) <= RANK_5;
+  return relative_rank(c, s, var->maxRank) < var->soldierPromotionRank;
 }
 
 inline bool Position::makpong() const {
index d581ac4..1202da8 100644 (file)
@@ -825,7 +825,7 @@ namespace {
         v->mobilityRegion[BLACK][FERS] = black_castle;
         v->mobilityRegion[WHITE][ELEPHANT] = Rank1BB | Rank2BB | Rank3BB | Rank4BB | Rank5BB;
         v->mobilityRegion[BLACK][ELEPHANT] = Rank6BB | Rank7BB | Rank8BB | Rank9BB | Rank10BB;
-        v->xiangqiSoldier = true;
+        v->soldierPromotionRank = RANK_6;
         return v;
     }
     // Manchu/Yitong chess
@@ -869,7 +869,7 @@ namespace {
                                               SQ_D10, SQ_E10, SQ_F10);
         v->mobilityRegion[WHITE][WAZIR] = white_castle;
         v->mobilityRegion[BLACK][WAZIR] = black_castle;
-        v->xiangqiSoldier = false;
+        v->soldierPromotionRank = RANK_1;
         v->flyingGeneral = false;
         v->bikjangRule = true;
         v->diagonalLines = make_bitboard(SQ_D1, SQ_F1, SQ_E2, SQ_D3, SQ_F3,
index 4f0b3db..a9790c1 100644 (file)
@@ -91,7 +91,7 @@ struct Variant {
   bool kingPassOnStalemate = false;
   bool makpongRule = false;
   bool flyingGeneral = false;
-  bool xiangqiSoldier = false;
+  Rank soldierPromotionRank = RANK_1;
   // game end
   int nMoveRule = 50;
   int nFoldRule = 3;
index a5ae214..96171bc 100644 (file)
 # kingPassOnStalemate: allow passing by king in case of stalemate [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)
+# soldierPromotionRank: restrict soldier to shogi pawn movements until reaching n-th rank [bool] (default: 1)
 # nMoveRule: move count for 50/n-move rule [int] (default: 50)
 # nFoldRule: move count for 3/n-fold repetition rule [int] (default: 3)
 # nFoldValue: result in case of 3/n-fold repetition [Value] (default: draw)