VariantMap variants; // Global object
// Define variant rules
- const Variant* chess_variant() {
+ Variant* fairy_variant_base() {
Variant* v = new Variant();
+ v->endgameEval = false;
+ return v;
+ }
+ Variant* chess_variant() {
+ Variant* v = fairy_variant_base();
v->endgameEval = true;
return v;
}
- const Variant* makruk_variant() {
- Variant* v = new Variant();
+ Variant* makruk_variant() {
+ Variant* v = chess_variant();
v->remove_piece(BISHOP);
v->remove_piece(QUEEN);
v->add_piece(KHON, 's');
v->startFen = "rnsmksnr/8/pppppppp/8/8/PPPPPPPP/8/RNSKMSNR w - - 0 1";
v->promotionRank = RANK_6;
v->promotionPieceTypes = {MET};
- v->endgameEval = true;
v->doubleStep = false;
v->castling = false;
return v;
}
- const Variant* asean_variant() {
- Variant* v = new Variant();
+ Variant* asean_variant() {
+ Variant* v = chess_variant();
v->remove_piece(BISHOP);
v->remove_piece(QUEEN);
v->add_piece(KHON, 'b');
v->add_piece(MET, 'q');
v->startFen = "rnbqkbnr/8/pppppppp/8/8/PPPPPPPP/8/RNBQKBNR w - - 0 1";
v->promotionPieceTypes = {ROOK, KNIGHT, KHON, MET};
- v->endgameEval = true;
v->doubleStep = false;
v->castling = false;
return v;
}
- const Variant* aiwok_variant() {
- Variant* v = new Variant();
- v->remove_piece(BISHOP);
- v->remove_piece(QUEEN);
- v->add_piece(KHON, 's');
+ Variant* aiwok_variant() {
+ Variant* v = makruk_variant();
+ v->remove_piece(MET);
v->add_piece(AIWOK, 'a');
v->startFen = "rnsaksnr/8/pppppppp/8/8/PPPPPPPP/8/RNSKASNR w - - 0 1";
- v->promotionRank = RANK_6;
v->promotionPieceTypes = {AIWOK};
- v->endgameEval = true;
- v->doubleStep = false;
- v->castling = false;
return v;
}
- const Variant* shatranj_variant() {
- Variant* v = new Variant();
+ Variant* shatranj_variant() {
+ Variant* v = fairy_variant_base();
v->remove_piece(BISHOP);
v->remove_piece(QUEEN);
v->add_piece(ALFIL, 'b');
v->add_piece(FERS, 'q');
v->startFen = "rnbkqbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBKQBNR w - - 0 1";
v->promotionPieceTypes = {FERS};
- v->endgameEval = false;
v->doubleStep = false;
v->castling = false;
v->bareKingValue = -VALUE_MATE;
v->stalemateValue = -VALUE_MATE;
return v;
}
- const Variant* amazon_variant() {
- Variant* v = new Variant();
+ Variant* amazon_variant() {
+ Variant* v = chess_variant();
v->remove_piece(QUEEN);
v->add_piece(AMAZON, 'a');
v->startFen = "rnbakbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBAKBNR w KQkq - 0 1";
v->promotionPieceTypes = {AMAZON, ROOK, BISHOP, KNIGHT};
- v->endgameEval = true;
return v;
}
- const Variant* hoppelpoppel_variant() {
- Variant* v = new Variant();
+ Variant* hoppelpoppel_variant() {
+ Variant* v = chess_variant();
v->remove_piece(KNIGHT);
v->remove_piece(BISHOP);
v->add_piece(KNIBIS, 'n');
v->add_piece(BISKNI, 'b');
v->promotionPieceTypes = {QUEEN, ROOK, BISKNI, KNIBIS};
- v->endgameEval = true;
return v;
}
- const Variant* kingofthehill_variant() {
- Variant* v = new Variant();
+ Variant* kingofthehill_variant() {
+ Variant* v = fairy_variant_base();
v->flagPiece = KING;
v->whiteFlag = make_bitboard(SQ_D4, SQ_E4, SQ_D5, SQ_E5);
v->blackFlag = make_bitboard(SQ_D4, SQ_E4, SQ_D5, SQ_E5);
v->flagMove = false;
return v;
}
- const Variant* racingkings_variant() {
- Variant* v = new Variant();
+ Variant* racingkings_variant() {
+ Variant* v = fairy_variant_base();
v->startFen = "8/8/8/8/8/8/krbnNBRK/qrbnNBRQ w - - 0 1";
v->flagPiece = KING;
v->whiteFlag = Rank8BB;
v->checking = false;
return v;
}
- const Variant* losers_variant() {
- Variant* v = new Variant();
+ Variant* losers_variant() {
+ Variant* v = fairy_variant_base();
v->checkmateValue = VALUE_MATE;
v->stalemateValue = VALUE_MATE;
v->bareKingValue = VALUE_MATE;
v->mustCapture = true;
return v;
}
- const Variant* giveaway_variant() {
- Variant* v = new Variant();
+ Variant* giveaway_variant() {
+ Variant* v = fairy_variant_base();
v->remove_piece(KING);
v->add_piece(COMMONER, 'k');
- v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
v->promotionPieceTypes = {COMMONER, QUEEN, ROOK, BISHOP, KNIGHT};
v->stalemateValue = VALUE_MATE;
v->extinctionValue = VALUE_MATE;
v->mustCapture = true;
return v;
}
- const Variant* antichess_variant() {
- Variant* v = new Variant();
- v->remove_piece(KING);
- v->add_piece(COMMONER, 'k');
+ Variant* antichess_variant() {
+ Variant* v = giveaway_variant();
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 0 1";
- v->promotionPieceTypes = {COMMONER, QUEEN, ROOK, BISHOP, KNIGHT};
- v->stalemateValue = VALUE_MATE;
- v->extinctionValue = VALUE_MATE;
- v->extinctionPieceTypes = {ALL_PIECES};
v->castling = false;
- v->mustCapture = true;
return v;
}
- const Variant* codrus_variant() {
- Variant* v = new Variant();
- v->remove_piece(KING);
- v->add_piece(COMMONER, 'k');
- v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
+ Variant* codrus_variant() {
+ Variant* v = giveaway_variant();
v->promotionPieceTypes = {QUEEN, ROOK, BISHOP, KNIGHT};
- v->extinctionValue = VALUE_MATE;
v->extinctionPieceTypes = {COMMONER};
- v->mustCapture = true;
return v;
}
- const Variant* extinction_variant() {
- Variant* v = new Variant();
+ Variant* extinction_variant() {
+ Variant* v = fairy_variant_base();
v->remove_piece(KING);
v->add_piece(COMMONER, 'k');
- v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
v->promotionPieceTypes = {COMMONER, QUEEN, ROOK, BISHOP, KNIGHT};
v->extinctionValue = -VALUE_MATE;
v->extinctionPieceTypes = {COMMONER, QUEEN, ROOK, BISHOP, KNIGHT, PAWN};
return v;
}
- const Variant* kinglet_variant() {
- Variant* v = new Variant();
- v->remove_piece(KING);
- v->add_piece(COMMONER, 'k');
- v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
+ Variant* kinglet_variant() {
+ Variant* v = extinction_variant();
v->promotionPieceTypes = {COMMONER};
- v->extinctionValue = -VALUE_MATE;
v->extinctionPieceTypes = {PAWN};
return v;
}
- const Variant* horde_variant() {
- Variant* v = new Variant();
+ Variant* horde_variant() {
+ Variant* v = fairy_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/1PP2PP1/PPPPPPPP/PPPPPPPP/PPPPPPPP/PPPPPPPP w kq - 0 1";
v->firstRankDoubleSteps = true;
v->extinctionValue = -VALUE_MATE;
v->extinctionPieceTypes = {ALL_PIECES};
return v;
}
- const Variant* threecheck_variant() {
- Variant* v = new Variant();
+ Variant* threecheck_variant() {
+ Variant* v = fairy_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 3+3 0 1";
v->maxCheckCount = CheckCount(3);
return v;
}
- const Variant* fivecheck_variant() {
- Variant* v = new Variant();
+ Variant* fivecheck_variant() {
+ Variant* v = fairy_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 5+5 0 1";
v->maxCheckCount = CheckCount(5);
return v;
}
- const Variant* crazyhouse_variant() {
- Variant* v = new Variant();
+ Variant* crazyhouse_variant() {
+ Variant* v = fairy_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1";
v->pieceDrops = true;
v->capturesToHand = true;
return v;
}
- const Variant* loop_variant() {
- Variant* v = new Variant();
- v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1";
- v->pieceDrops = true;
- v->capturesToHand = true;
+ Variant* loop_variant() {
+ Variant* v = crazyhouse_variant();
v->dropLoop = true;
return v;
}
- const Variant* chessgi_variant() {
- Variant* v = new Variant();
- v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1";
- v->pieceDrops = true;
- v->dropLoop = true;
- v->capturesToHand = true;
+ Variant* chessgi_variant() {
+ Variant* v = loop_variant();
v->firstRankDrops = true;
return v;
}
- const Variant* pocketknight_variant() {
- Variant* v = new Variant();
+ Variant* pocketknight_variant() {
+ Variant* v = fairy_variant_base();
v->startFen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[Nn] w KQkq - 0 1";
v->pieceDrops = true;
v->capturesToHand = false;
return v;
}
- const Variant* euroshogi_variant() {
- Variant* v = new Variant();
+ Variant* euroshogi_variant() {
+ Variant* v = fairy_variant_base();
v->reset_pieces();
v->add_piece(SHOGI_PAWN, 'p');
v->add_piece(EUROSHOGI_KNIGHT, 'n');
v->shogiPawnDropMateIllegal = true;
return v;
}
- const Variant* judkinsshogi_variant() {
- Variant* v = new Variant();
+ Variant* judkinsshogi_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_6;
v->maxFile = FILE_F;
v->reset_pieces();
v->shogiPawnDropMateIllegal = true;
return v;
}
- const Variant* minishogi_variant() {
- Variant* v = new Variant();
+ Variant* minishogi_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_5;
v->maxFile = FILE_E;
v->reset_pieces();
v->shogiPawnDropMateIllegal = true;
return v;
}
- const Variant* losalamos_variant() {
- Variant* v = new Variant();
+ Variant* losalamos_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_6;
v->maxFile = FILE_F;
v->remove_piece(BISHOP);
v->castling = false;
return v;
}
- const Variant* almost_variant() {
- Variant* v = new Variant();
+ Variant* almost_variant() {
+ Variant* v = chess_variant();
v->remove_piece(QUEEN);
v->add_piece(CHANCELLOR, 'c');
v->startFen = "rnbckbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBCKBNR w KQkq - 0 1";
v->promotionPieceTypes = {CHANCELLOR, ROOK, BISHOP, KNIGHT};
- v->endgameEval = true;
return v;
}
- const Variant* chigorin_variant() {
- Variant* v = new Variant();
+ Variant* chigorin_variant() {
+ Variant* v = chess_variant();
v->add_piece(CHANCELLOR, 'c');
v->startFen = "rbbqkbbr/pppppppp/8/8/8/8/PPPPPPPP/RNNCKNNR w KQkq - 0 1";
v->promotionPieceTypes = {QUEEN, CHANCELLOR, ROOK, BISHOP, KNIGHT};
- v->endgameEval = true;
return v;
}
- const Variant* shatar_variant() {
- Variant* v = new Variant();
+ Variant* shatar_variant() {
+ Variant* v = chess_variant();
v->remove_piece(QUEEN);
v->add_piece(BERS, 'j');
v->startFen = "rnbjkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBJKBNR w - - 0 1";
v->promotionPieceTypes = {BERS};
- v->endgameEval = true;
v->doubleStep = false;
v->castling = false;
v->bareKingValue = VALUE_DRAW; // Robado
v->shatarMateRule = true;
return v;
}
- const Variant* clobber_variant() {
- Variant* v = new Variant();
+ Variant* clobber_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_6;
v->maxFile = FILE_E;
v->reset_pieces();
v->immobilityIllegal = false;
return v;
}
- const Variant* breakthrough_variant() {
- Variant* v = new Variant();
+ Variant* breakthrough_variant() {
+ Variant* v = fairy_variant_base();
v->reset_pieces();
v->add_piece(BREAKTHROUGH_PIECE, 'p');
v->startFen = "pppppppp/pppppppp/8/8/8/8/PPPPPPPP/PPPPPPPP w 0 1";
v->blackFlag = Rank1BB;
return v;
}
- const Variant* connect4_variant() {
- Variant* v = new Variant();
+ Variant* connect4_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_6;
v->maxFile = FILE_G;
v->reset_pieces();
v->connectN = 4;
return v;
}
- const Variant* tictactoe_variant() {
- Variant* v = new Variant();
+ Variant* tictactoe_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_3;
v->maxFile = FILE_C;
v->reset_pieces();
return v;
}
#ifdef LARGEBOARDS
- const Variant* shogi_variant() {
- Variant* v = new Variant();
+ Variant* shogi_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_9;
v->maxFile = FILE_I;
v->reset_pieces();
v->shogiPawnDropMateIllegal = true;
return v;
}
- const Variant* capablanca_variant() {
- Variant* v = new Variant();
+ Variant* capablanca_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_8;
v->maxFile = FILE_J;
v->castlingKingsideFile = FILE_I;
v->promotionPieceTypes = {ARCHBISHOP, CHANCELLOR, QUEEN, ROOK, BISHOP, KNIGHT};
return v;
}
- const Variant* janus_variant() {
- Variant* v = new Variant();
+ Variant* janus_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_8;
v->maxFile = FILE_J;
v->castlingKingsideFile = FILE_I;
v->promotionPieceTypes = {ARCHBISHOP, QUEEN, ROOK, BISHOP, KNIGHT};
return v;
}
- const Variant* embassy_variant() {
- Variant* v = new Variant();
+ Variant* embassy_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_8;
v->maxFile = FILE_J;
v->castlingKingsideFile = FILE_H;
v->promotionPieceTypes = {ARCHBISHOP, CHANCELLOR, QUEEN, ROOK, BISHOP, KNIGHT};
return v;
}
- const Variant* jesonmor_variant() {
- Variant* v = new Variant();
+ Variant* jesonmor_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_9;
v->maxFile = FILE_I;
v->reset_pieces();
v->flagMove = true;
return v;
}
- const Variant* courier_variant() {
- Variant* v = new Variant();
+ Variant* courier_variant() {
+ Variant* v = fairy_variant_base();
v->maxRank = RANK_8;
v->maxFile = FILE_L;
v->remove_piece(QUEEN);