parse_attribute("shogiPawnDropMateIllegal", v->shogiPawnDropMateIllegal);
parse_attribute("shatarMateRule", v->shatarMateRule);
parse_attribute("bikjangRule", v->bikjangRule);
- parse_attribute("bareKingValue", v->bareKingValue);
parse_attribute("extinctionValue", v->extinctionValue);
- parse_attribute("bareKingMove", v->bareKingMove);
+ parse_attribute("extinctionClaim", v->extinctionClaim);
// extinction piece types
const auto& it_ext = config.find("extinctionPieceTypes");
if (it_ext != config.end())
bool Position::is_immediate_game_end(Value& result, int ply) const {
- // bare king rule
- if ( bare_king_value() != VALUE_NONE
- && !bare_king_move()
- && !(count<ALL_PIECES>(sideToMove) - count<KING>(sideToMove)))
- {
- result = bare_king_value(ply);
- return true;
- }
- if ( bare_king_value() != VALUE_NONE
- && bare_king_move()
- && !(count<ALL_PIECES>(~sideToMove) - count<KING>(~sideToMove)))
- {
- result = -bare_king_value(ply);
- return true;
- }
// extinction
if (extinction_value() != VALUE_NONE)
{
for (Color c : { WHITE, BLACK })
for (PieceType pt : extinction_piece_types())
if ( count_with_hand( c, pt) <= var->extinctionPieceCount
- && count_with_hand(~c, pt) >= var->extinctionOpponentPieceCount)
+ && count_with_hand(~c, pt) >= var->extinctionOpponentPieceCount + (extinction_claim() && c == sideToMove))
{
result = c == sideToMove ? extinction_value(ply) : -extinction_value(ply);
return true;
int n_fold_rule() const;
Value stalemate_value(int ply = 0) const;
Value checkmate_value(int ply = 0) const;
- Value bare_king_value(int ply = 0) const;
Value extinction_value(int ply = 0) const;
- bool bare_king_move() const;
+ bool extinction_claim() const;
const std::set<PieceType>& extinction_piece_types() const;
int extinction_piece_count() const;
int extinction_opponent_piece_count() const;
return convert_mate_value(var->checkmateValue, ply);
}
-inline Value Position::bare_king_value(int ply) const {
- assert(var != nullptr);
- return convert_mate_value(var->bareKingValue, ply);
-}
-
inline Value Position::extinction_value(int ply) const {
assert(var != nullptr);
return convert_mate_value(var->extinctionValue, ply);
}
-inline bool Position::bare_king_move() const {
+inline bool Position::extinction_claim() const {
assert(var != nullptr);
- return var->bareKingMove;
+ return var->extinctionClaim;
}
inline const std::set<PieceType>& Position::extinction_piece_types() const {
if ( v->extinctionValue == VALUE_MATE
&& v->extinctionPieceTypes.find(ALL_PIECES) != v->extinctionPieceTypes.end())
score = -make_score(mg_value(score) / 8, eg_value(score) / 8 / (1 + !pi->sliderCapture.size()));
- else if (v->bareKingValue == VALUE_MATE)
- score = -make_score(mg_value(score) / 8, eg_value(score) / 8 / (1 + !pi->sliderCapture.size()));
for (Square s = SQ_A1; s <= SQ_MAX; ++s)
{
v->promotionPieceTypes = {FERS};
v->doubleStep = false;
v->castling = false;
- v->bareKingValue = -VALUE_MATE;
- v->bareKingMove = true;
+ v->extinctionValue = -VALUE_MATE;
+ v->extinctionClaim = true;
+ v->extinctionPieceTypes = {ALL_PIECES};
+ v->extinctionPieceCount = 1;
+ v->extinctionOpponentPieceCount = 2;
v->stalemateValue = -VALUE_MATE;
v->nMoveRule = 70;
return v;
Variant* v = fairy_variant_base();
v->checkmateValue = VALUE_MATE;
v->stalemateValue = VALUE_MATE;
- v->bareKingValue = VALUE_MATE;
- v->bareKingMove = false;
+ v->extinctionValue = VALUE_MATE;
+ v->extinctionPieceTypes = {ALL_PIECES};
+ v->extinctionPieceCount = 1;
v->mustCapture = true;
return v;
}
v->promotionPieceTypes = {BERS};
v->doubleStep = false;
v->castling = false;
- v->bareKingValue = VALUE_DRAW; // Robado
+ v->extinctionValue = VALUE_DRAW; // Robado
+ v->extinctionPieceTypes = {ALL_PIECES};
+ v->extinctionPieceCount = 1;
v->shatarMateRule = true;
return v;
}
v->promotionPieceTypes = {FERS};
v->doubleStep = false;
v->castling = false;
- v->bareKingValue = -VALUE_MATE;
- v->bareKingMove = true;
+ v->extinctionValue = -VALUE_MATE;
+ v->extinctionClaim = true;
+ v->extinctionPieceTypes = {ALL_PIECES};
+ v->extinctionPieceCount = 1;
+ v->extinctionOpponentPieceCount = 2;
v->stalemateValue = -VALUE_MATE;
return v;
}
bool shogiPawnDropMateIllegal = false;
bool shatarMateRule = false;
bool bikjangRule = false;
- Value bareKingValue = VALUE_NONE;
Value extinctionValue = VALUE_NONE;
- bool bareKingMove = false;
+ bool extinctionClaim = false;
std::set<PieceType> extinctionPieceTypes = {};
int extinctionPieceCount = 0;
int extinctionOpponentPieceCount = 0;
# shogiPawnDropMateIllegal: prohibit checkmate via shogi pawn drops [bool] (default: false)
# shatarMateRule: enable shatar mating rules [bool] (default: false)
# bikjangRule: consider Janggi bikjang (facing kings) rule [bool] (default: false)
-# 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)
+# extinctionClaim: extinction of opponent pieces can only be claimed as side to move [bool] (default: false)
# extinctionPieceTypes: list of piece types for extinction rules, e.g., pnbrq (* means all) (default: )
# extinctionPieceCount: piece count at which the game is decided by extinction rule (default: 0)
# extinctionOpponentPieceCount: opponent piece count required to adjudicate by extinction rule (default: 0)