The games currently supported besides chess are listed below. Fairy-Stockfish can also play user-defined variants loaded via a variant configuration file, see the file [`src/variants.ini`](https://github.com/ianfab/Fairy-Stockfish/blob/master/src/variants.ini).
### Regional and historical games
-- [Xiangqi](https://en.wikipedia.org/wiki/Xiangqi), [Manchu](https://en.wikipedia.org/wiki/Manchu_chess), [Minixiangqi](http://mlwi.magix.net/bg/minixiangqi.htm)
-- [Shogi](https://en.wikipedia.org/wiki/Shogi)
+- [Xiangqi](https://en.wikipedia.org/wiki/Xiangqi), [Manchu](https://en.wikipedia.org/wiki/Manchu_chess), [Minixiangqi](http://mlwi.magix.net/bg/minixiangqi.htm), [Supply chess](https://en.wikipedia.org/wiki/Xiangqi#Variations)
+- [Shogi](https://en.wikipedia.org/wiki/Shogi), [Shogi variants](https://github.com/ianfab/Fairy-Stockfish#shogi-variants)
- [Makruk](https://en.wikipedia.org/wiki/Makruk), [Ouk Chatrang](https://en.wikipedia.org/wiki/Makruk#Cambodian_chess), [Kar Ouk](https://en.wikipedia.org/wiki/Makruk#Cambodian_chess), [ASEAN](http://hgm.nubati.net/rules/ASEAN.html), Ai-Wok
- [Sittuyin](https://en.wikipedia.org/wiki/Sittuyin)
- [Shatar](https://en.wikipedia.org/wiki/Shatar), [Jeson Mor](https://en.wikipedia.org/wiki/Jeson_Mor)
assert(board_bb() & to);
// Illegal checks
- if ((!checking_permitted() || (sittuyin_promotion() && type_of(m) == PROMOTION)) && gives_check(m))
+ if ((!checking_permitted() || (sittuyin_promotion() && type_of(m) == PROMOTION) || (!drop_checks() && type_of(m) == DROP)) && gives_check(m))
return false;
// Illegal quiet moves
PieceType castling_rook_piece() const;
PieceType king_type() const;
bool checking_permitted() const;
+ bool drop_checks() const;
bool must_capture() const;
bool must_drop() const;
bool piece_drops() const;
return var->checking;
}
+inline bool Position::drop_checks() const {
+ assert(var != nullptr);
+ return var->dropChecks;
+}
+
inline bool Position::must_capture() const {
assert(var != nullptr);
return var->mustCapture;
v->xiangqiSoldier = true;
return v;
}
+ // Manchu/Yitong chess
+ // https://en.wikipedia.org/wiki/Manchu_chess
Variant* manchu_variant() {
Variant* v = xiangqi_variant();
v->pieceToCharTable = "PN.R.AB..K.C....M.....pn.r.ab..k.c..........";
v->startFen = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/9/9/M1BAKAB2 w - - 0 1";
return v;
}
+ // Supply chess
+ // https://en.wikipedia.org/wiki/Xiangqi#Variations
+ Variant* supply_variant() {
+ Variant* v = xiangqi_variant();
+ v->variantTemplate = "bughouse";
+ v->startFen = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR[] w - - 0 1";
+ v->twoBoards = true;
+ v->pieceDrops = true;
+ v->dropChecks = false;
+ v->whiteDropRegion = v->mobilityRegion[WHITE][ELEPHANT];
+ v->blackDropRegion = v->mobilityRegion[BLACK][ELEPHANT];
+ return v;
+ }
#endif
} // namespace
add("clobber10", clobber10_variant());
add("xiangqi", xiangqi_variant());
add("manchu", manchu_variant());
+ add("supply", supply_variant());
#endif
}
PieceType castlingRookPiece = ROOK;
PieceType kingType = KING;
bool checking = true;
+ bool dropChecks = true;
bool mustCapture = false;
bool mustDrop = false;
bool pieceDrops = false;
# castlingRookPiece: piece type that participates in castling [PieceType] (default: r)
# kingType: piece type defining moves of king/royal piece (default: k)
# checking: allow checks [bool] (default: true)
+# dropChecks: allow checks by piece drops [bool] (default: true)
# mustCapture: captures are mandatory (check evasion still takes precedence) [bool] (default: false)
# mustDrop: drops are mandatory (e.g., for Sittuyin setup phase) [bool] (default: false)
# pieceDrops: enable piece drops [bool] (default: false)
[xiangqihouse:xiangqi]
pieceDrops = true
capturesToHand = true
+dropChecks = false
whiteDropRegion = *1 *2 *3 *4 *5
blackDropRegion = *6 *7 *8 *9 *10