From: Fabian Fichter Date: Tue, 2 Jun 2020 18:49:54 +0000 (+0200) Subject: Support Armageddon Chess X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=b8b7e88d5ac9726ed86f750d3959292c6f1dfc4d;p=fairystockfish.git Support Armageddon Chess https://en.wikipedia.org/wiki/Fast_chess#Armageddon Closes #140. --- diff --git a/src/parser.cpp b/src/parser.cpp index 8c6ccea..d89f25c 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -78,8 +78,11 @@ namespace { template <> bool set(const std::string& value, MaterialCounting& target) { target = value == "janggi" ? JANGGI_MATERIAL : value == "unweighted" ? UNWEIGHTED_MATERIAL + : value == "whitedrawodds" ? WHITE_DRAW_ODDS + : value == "blackdrawodds" ? BLACK_DRAW_ODDS : NO_MATERIAL_COUNTING; - return value == "janggi" || value == "unweighted" || value == "none"; + return value == "janggi" || value == "unweighted" + || value == "whitedrawodds" || value == "blackdrawodds" || value == "none"; } template <> bool set(const std::string& value, CountingRule& target) { diff --git a/src/position.h b/src/position.h index 0415312..12df6c1 100644 --- a/src/position.h +++ b/src/position.h @@ -1105,6 +1105,12 @@ inline Value Position::material_counting_result() const { : count(WHITE, ALL_PIECES) < count(BLACK, ALL_PIECES) ? -VALUE_MATE : VALUE_DRAW; break; + case WHITE_DRAW_ODDS: + result = VALUE_MATE; + break; + case BLACK_DRAW_ODDS: + result = -VALUE_MATE; + break; default: assert(false); result = VALUE_DRAW; diff --git a/src/types.h b/src/types.h index 29cc7f4..45ea71c 100644 --- a/src/types.h +++ b/src/types.h @@ -275,7 +275,7 @@ enum CheckCount : int { }; enum MaterialCounting { - NO_MATERIAL_COUNTING, JANGGI_MATERIAL, UNWEIGHTED_MATERIAL + NO_MATERIAL_COUNTING, JANGGI_MATERIAL, UNWEIGHTED_MATERIAL, WHITE_DRAW_ODDS, BLACK_DRAW_ODDS }; enum CountingRule { diff --git a/src/variant.cpp b/src/variant.cpp index 75e3399..0278dcf 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -53,6 +53,13 @@ namespace { v->castling = false; return v; } + // Armageddon Chess + // https://en.wikipedia.org/wiki/Fast_chess#Armageddon + Variant* armageddon_variant() { + Variant* v = fairy_variant_base(); + v->materialCounting = BLACK_DRAW_ODDS; + return v; + } Variant* fairy_variant() { Variant* v = chess_variant(); v->add_piece(SILVER, 's'); @@ -927,6 +934,7 @@ void VariantMap::init() { add("normal", chess_variant()); add("fischerandom", chess960_variant()); add("nocastle", nocastle_variant()); + add("armageddon", armageddon_variant()); add("fairy", fairy_variant()); // fairy variant used for endgame code initialization add("makruk", makruk_variant()); add("makpong", makpong_variant()); diff --git a/src/variants.ini b/src/variants.ini index 5fd0578..6a22b38 100644 --- a/src/variants.ini +++ b/src/variants.ini @@ -93,7 +93,7 @@ # [PieceType]: a piece type [letters defined for pieces, e.g., p] # [Bitboard]: list of squares [e.g., d4 e4 d5 e5]. * can be used as wildcard for files (e.g., *1 is the first rank) # [Value]: game result for the side to move [win, loss, draw] -# [MaterialCounting]: material couting rules for adjudication [janggi, unweighted, none] +# [MaterialCounting]: material couting rules for adjudication [janggi, unweighted, whitedrawodds, blackdrawodds, none] # [CountingRule]: makruk or ASEAN counting rules [makruk, asean, none] ### Rule definition options