namespace {
// Define variant rules
- Variant* fairy_variant_base() {
+ Variant* variant_base() {
Variant* v = new Variant();
+ return v;
+ }
+ Variant* chess_variant_base() {
+ Variant* v = variant_base();
v->pieceToCharTable = "PNBRQ................Kpnbrq................k";
- v->endgameEval = false;
return v;
}
Variant* chess_variant() {
- Variant* v = fairy_variant_base();
- v->endgameEval = true;
+ Variant* v = chess_variant_base();
v->nnueFeatures = NNUE_CHESS;
return v;
}
// Armageddon Chess
// https://en.wikipedia.org/wiki/Fast_chess#Armageddon
Variant* armageddon_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant();
v->materialCounting = BLACK_DRAW_ODDS;
return v;
}
Variant* fairy_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->add_piece(SILVER, 's');
v->add_piece(FERS, 'f');
return v;
}
// Makruk (Thai Chess)
Variant* makruk_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->variantTemplate = "makruk";
v->pieceToCharTable = "PN.R.M....SKpn.r.m....sk";
v->remove_piece(BISHOP);
return v;
}
Variant* asean_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->remove_piece(BISHOP);
v->remove_piece(QUEEN);
v->add_piece(KHON, 'b');
return v;
}
Variant* shatranj_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->variantTemplate = "shatranj";
v->pieceToCharTable = "PN.R.QB....Kpn.r.qb....k";
v->remove_piece(BISHOP);
return v;
}
Variant* amazon_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBR..............AKpnbr..............ak";
v->remove_piece(QUEEN);
v->add_piece(AMAZON, 'a');
return v;
}
Variant* hoppelpoppel_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->remove_piece(KNIGHT);
v->remove_piece(BISHOP);
v->add_piece(KNIBIS, 'n');
return v;
}
Variant* newzealand_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->remove_piece(ROOK);
v->remove_piece(KNIGHT);
v->add_piece(ROOKNI, 'r');
return v;
}
Variant* kingofthehill_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->flagPiece = KING;
v->whiteFlag = (Rank4BB | Rank5BB) & (FileDBB | FileEBB);
v->blackFlag = (Rank4BB | Rank5BB) & (FileDBB | FileEBB);
return v;
}
Variant* racingkings_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->startFen = "8/8/8/8/8/8/krbnNBRK/qrbnNBRQ w - - 0 1";
v->flagPiece = KING;
v->whiteFlag = Rank8BB;
return v;
}
Variant* knightmate_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->add_piece(COMMONER, 'm');
v->remove_piece(KNIGHT);
v->startFen = "rmbqkbmr/pppppppp/8/8/8/8/PPPPPPPP/RMBQKBMR w KQkq - 0 1";
return v;
}
Variant* losers_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->checkmateValue = VALUE_MATE;
v->stalemateValue = VALUE_MATE;
v->extinctionValue = VALUE_MATE;
return v;
}
Variant* giveaway_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->variantTemplate = "giveaway";
v->remove_piece(KING);
v->add_piece(COMMONER, 'k');
return v;
}
Variant* extinction_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->remove_piece(KING);
v->add_piece(COMMONER, 'k');
v->castlingKingPiece = COMMONER;
// Three Kings Chess
// https://github.com/cutechess/cutechess/blob/master/projects/lib/src/board/threekingsboard.h
Variant* threekings_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->remove_piece(KING);
v->add_piece(COMMONER, 'k');
v->castlingKingPiece = COMMONER;
// Horde chess
// https://en.wikipedia.org/wiki/Dunsany%27s_chess#Horde_chess
Variant* horde_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/1PP2PP1/PPPPPPPP/PPPPPPPP/PPPPPPPP/PPPPPPPP w kq - 0 1";
v->doubleStepRankMin = RANK_1;
v->enPassantRegion = Rank3BB | Rank6BB; // exclude en passant on second rank
// Atomic chess without checks (ICC rules)
// https://www.chessclub.com/help/atomic
Variant* nocheckatomic_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->variantTemplate = "atomic";
v->remove_piece(KING);
v->add_piece(COMMONER, 'k');
return v;
}
Variant* threecheck_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 3+3 0 1";
v->checkCounting = true;
return v;
return v;
}
Variant* crazyhouse_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->variantTemplate = "crazyhouse";
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1";
v->pieceDrops = true;
return v;
}
Variant* pocketknight_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->variantTemplate = "bughouse";
v->pocketSize = 2;
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[Nn] w KQkq - 0 1";
return v;
}
Variant* placement_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->variantTemplate = "bughouse";
v->startFen = "8/pppppppp/8/8/8/8/PPPPPPPP/8[KQRRBBNNkqrrbbnn] w - - 0 1";
v->mustDrop = true;
return v;
}
Variant* seirawan_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->variantTemplate = "seirawan";
v->pieceToCharTable = "PNBRQ.E..........H...Kpnbrq.e..........h...k";
v->add_piece(ARCHBISHOP, 'h');
return v;
}
Variant* minishogi_variant_base() {
- Variant* v = fairy_variant_base();
+ Variant* v = variant_base();
v->variantTemplate = "shogi";
v->maxRank = RANK_5;
v->maxFile = FILE_E;
return v;
}
Variant* losalamos_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PN.RQ................Kpn.rq................k";
v->maxRank = RANK_6;
v->maxFile = FILE_F;
return v;
}
Variant* gardner_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->maxRank = RANK_5;
v->maxFile = FILE_E;
v->startFen = "rnbqk/ppppp/5/PPPPP/RNBQK w - - 0 1";
return v;
}
Variant* almost_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBR............CKpnbr............ck";
v->remove_piece(QUEEN);
v->add_piece(CHANCELLOR, 'c');
return v;
}
Variant* chigorin_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBR............CKpnbrq............k";
v->add_piece(CHANCELLOR, 'c');
v->startFen = "rbbqkbbr/pppppppp/8/8/8/8/PPPPPPPP/RNNCKNNR w KQkq - 0 1";
return v;
}
Variant* shatar_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBR..........J......Kpnbr..........j......k";
v->remove_piece(QUEEN);
v->add_piece(BERS, 'j');
return v;
}
Variant* coregal_variant() {
- Variant* v = fairy_variant();
+ Variant* v = chess_variant_base();
v->extinctionValue = -VALUE_MATE;
v->extinctionPieceTypes = {QUEEN};
v->extinctionPseudoRoyal = true;
return v;
}
Variant* clobber_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "P.................p.................";
v->maxRank = RANK_6;
v->maxFile = FILE_E;
return v;
}
Variant* breakthrough_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "P.................p.................";
v->reset_pieces();
v->add_piece(BREAKTHROUGH_PIECE, 'p');
return v;
}
Variant* ataxx_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "P.................p.................";
v->maxRank = RANK_7;
v->maxFile = FILE_G;
return v;
}
Variant* minixiangqi_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->variantTemplate = "xiangqi";
v->pieceToCharTable = "PN.R.....K.C.pn.r.....k.c.";
v->maxRank = RANK_7;
return v;
}
Variant* capablanca_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ..AC............Kpnbrq..ac............k";
v->maxRank = RANK_8;
v->maxFile = FILE_J;
v->startFen = "rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1";
v->pieceDrops = true;
v->capturesToHand = true;
- v->endgameEval = false;
return v;
}
Variant* caparandom_variant() {
return v;
}
Variant* janus_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ............J...Kpnbrq............j...k";
v->maxRank = RANK_8;
v->maxFile = FILE_J;
return v;
}
Variant* modern_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ..M.............Kpnbrq..m.............k";
v->maxRank = RANK_9;
v->maxFile = FILE_I;
return v;
}
Variant* chancellor_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ...........CKpnbrq...........ck";
v->maxRank = RANK_9;
v->maxFile = FILE_I;
return v;
}
Variant* centaur_variant() {
- Variant* v = chess_variant();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ...............CKpnbrq...............ck";
v->maxRank = RANK_8;
v->maxFile = FILE_J;
return v;
}
Variant* jesonmor_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->maxRank = RANK_9;
v->maxFile = FILE_I;
v->reset_pieces();
return v;
}
Variant* courier_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->maxRank = RANK_8;
v->maxFile = FILE_L;
v->remove_piece(QUEEN);
return v;
}
Variant* grand_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ..AC............Kpnbrq..ac............k";
v->maxRank = RANK_10;
v->maxFile = FILE_J;
return v;
}
Variant* shako_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "PNBRQ.E....C.........Kpnbrq.e....c.........k";
v->maxRank = RANK_10;
v->maxFile = FILE_J;
// Game of the Amazons
// https://en.wikipedia.org/wiki/Game_of_the_Amazons
Variant* amazons_variant() {
- Variant* v = fairy_variant_base();
+ Variant* v = chess_variant_base();
v->pieceToCharTable = "P...Q.................p...q.................";
v->maxRank = RANK_10;
v->maxFile = FILE_J;