In casual rules, bikjang is a draw, which is enabled for variant `janggicasual`.
Closes #101.
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);
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;
}
}
}
// 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)); };
+ 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
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;
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
add("manchu", manchu_variant());
add("supply", supply_variant());
add("janggi", janggi_variant());
+ add("janggicasual", janggi_casual_variant());
#endif
}
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;
# 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)