Support casual rules of Janggi
authorFabian Fichter <ianfab@users.noreply.github.com>
Sat, 18 Apr 2020 12:27:54 +0000 (14:27 +0200)
committerFabian Fichter <ianfab@users.noreply.github.com>
Sat, 18 Apr 2020 12:35:24 +0000 (14:35 +0200)
In casual rules, bikjang is a draw, which is enabled for variant `janggicasual`.

Closes #101.

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

index eeaf00c..cc12034 100644 (file)
@@ -257,7 +257,7 @@ Variant* VariantParser<DoCheck>::parse(Variant* v) {
     parse_attribute("checkmateValue", v->checkmateValue);
     parse_attribute("shogiPawnDropMateIllegal", v->shogiPawnDropMateIllegal);
     parse_attribute("shatarMateRule", v->shatarMateRule);
-    parse_attribute("bikjangRule", v->bikjangRule);
+    parse_attribute("bikjangValue", v->bikjangValue);
     parse_attribute("bareKingValue", v->bareKingValue);
     parse_attribute("extinctionValue", v->extinctionValue);
     parse_attribute("bareKingMove", v->bareKingMove);
index c21ed7d..a9225e8 100644 (file)
@@ -499,7 +499,7 @@ void Position::set_check_info(StateInfo* si) const {
       si->checkSquares[pt] = ksq != SQ_NONE ? attacks_bb(~sideToMove, pt, ksq, pieces()) : Bitboard(0);
   si->checkSquares[KING]   = 0;
   si->shak = si->checkersBB & (byTypeBB[KNIGHT] | byTypeBB[ROOK] | byTypeBB[BERS]);
-  si->bikjang = var->bikjangRule && ksq != SQ_NONE ? bool(attacks_bb(sideToMove, ROOK, ksq, pieces()) & pieces(sideToMove, KING)) : false;
+  si->bikjang = var->bikjangValue != VALUE_NONE && ksq != SQ_NONE ? bool(attacks_bb(sideToMove, ROOK, ksq, pieces()) & pieces(sideToMove, KING)) : false;
 }
 
 
@@ -1941,8 +1941,8 @@ bool Position::is_immediate_game_end(Value& result, int ply) const {
       }
   }
   // Check for bikjang rule (Janggi)
-  if (var->bikjangRule && st->pliesFromNull > 0 && (   (st->bikjang && st->previous->bikjang)
-                                                    || (st->pass && st->previous->pass)))
+  if (var->bikjangValue != VALUE_NONE && st->pliesFromNull > 0 && (   (st->bikjang && st->previous->bikjang)
+                                                                   || (st->pass && st->previous->pass)))
   {
       // material counting
       auto weigth_count = [this](PieceType pt, int v){ return v * (count(WHITE, pt) - count(BLACK, pt)); };
@@ -1953,7 +1953,8 @@ bool Position::is_immediate_game_end(Value& result, int ply) const {
                          + weigth_count(WAZIR, 3)
                          + weigth_count(SOLDIER, 2)
                          - 1;
-      result = (sideToMove == WHITE) == (materialCount > 0) ? mate_in(ply) : mated_in(ply);
+      bool stmUpMaterial = (sideToMove == WHITE) == (materialCount > 0);
+      result = convert_mate_value(stmUpMaterial ? var->bikjangValue : -var->bikjangValue, ply);
       return true;
   }
   // Tsume mode: Assume that side with king wins when not in check
index 1202da8..c5ce97b 100644 (file)
@@ -871,7 +871,7 @@ namespace {
         v->mobilityRegion[BLACK][WAZIR] = black_castle;
         v->soldierPromotionRank = RANK_1;
         v->flyingGeneral = false;
-        v->bikjangRule = true;
+        v->bikjangValue = VALUE_MATE;
         v->diagonalLines = make_bitboard(SQ_D1, SQ_F1, SQ_E2, SQ_D3, SQ_F3,
                                          SQ_D8, SQ_F8, SQ_E9, SQ_D10, SQ_F10);
         v->kingPass = true;
@@ -879,6 +879,12 @@ namespace {
         v->perpetualCheckIllegal = true;
         return v;
     }
+    // Casual rules of Janggi, where bikjang is a draw
+    Variant* janggi_casual_variant() {
+        Variant* v = janggi_variant();
+        v->bikjangValue = VALUE_DRAW;
+        return v;
+    }
 #endif
 
 } // namespace
@@ -963,6 +969,7 @@ void VariantMap::init() {
     add("manchu", manchu_variant());
     add("supply", supply_variant());
     add("janggi", janggi_variant());
+    add("janggicasual", janggi_casual_variant());
 #endif
 }
 
index a9790c1..dfcf556 100644 (file)
@@ -103,7 +103,7 @@ struct Variant {
   Value checkmateValue = -VALUE_MATE;
   bool shogiPawnDropMateIllegal = false;
   bool shatarMateRule = false;
-  bool bikjangRule = false;
+  Value bikjangValue = VALUE_NONE;
   Value bareKingValue = VALUE_NONE;
   Value extinctionValue = VALUE_NONE;
   bool bareKingMove = false;
index 96171bc..d65c060 100644 (file)
 # checkmateValue: result in case of checkmate [Value] (default: loss)
 # shogiPawnDropMateIllegal: prohibit checkmate via shogi pawn drops [bool] (default: false)
 # shatarMateRule: enable shatar mating rules [bool] (default: false)
-# bikjangRule: enable Janggi bikjang rule (facing kings) [bool] (default: false)
+# bikjangValue: result in case of Janggi bikjang (facing kings) for the player with more points [Value] (default: <none>)
 # bareKingValue: result when player only has a lone/bare king [Value] (default: <none>)
 # extinctionValue: result when one of extinctionPieceTypes is extinct [Value] (default: <none>)
 # bareKingMove: allow additional move by opponent after lone/bare king position [bool] (default: false)