From: Fabian Fichter Date: Fri, 10 Apr 2020 13:01:57 +0000 (+0200) Subject: Generalize Xiangqi soldier promotion X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=c456f3e1b207a10a03b8460288108fac99f59c1f;p=fairystockfish.git Generalize Xiangqi soldier promotion No functional change. --- diff --git a/src/parser.cpp b/src/parser.cpp index e638eac..eeaf00c 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -246,7 +246,7 @@ Variant* VariantParser::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); diff --git a/src/position.cpp b/src/position.cpp index 1619b6f..5582b82 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -985,10 +985,6 @@ bool Position::pseudo_legal(const Move m) const { if (type_of(m) != NORMAL || is_gating(m)) return MoveList(*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) diff --git a/src/position.h b/src/position.h index e340b5d..05ecc57 100644 --- a/src/position.h +++ b/src/position.h @@ -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 { diff --git a/src/variant.cpp b/src/variant.cpp index d581ac4..1202da8 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -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, diff --git a/src/variant.h b/src/variant.h index 4f0b3db..a9790c1 100644 --- a/src/variant.h +++ b/src/variant.h @@ -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; diff --git a/src/variants.ini b/src/variants.ini index a5ae214..96171bc 100644 --- a/src/variants.ini +++ b/src/variants.ini @@ -150,7 +150,7 @@ # 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)