Promotion rules, pawn drop restrictions, and perpetuals not implemented yet.
{ -17, -15, -10, -6, 6, 10, 15, 17 }, // amazon
{}, // knibis
{ -17, -15, -10, -6, 6, 10, 15, 17 }, // biskni
+ { 8 }, // shogi pawn
+ {}, // lance
+ { 15, 17 }, // shogi knight
+ { -1, 1, 15, 17 }, // euroshogi knight
+ { -8, -1, 1, 7, 8, 9 }, // gold
{ -9, -8, -7, -1, 1, 7, 8, 9 } // king
};
int stepsQuiet[][13] = {
{ -17, -15, -10, -6, 6, 10, 15, 17 }, // amazon
{ -17, -15, -10, -6, 6, 10, 15, 17 }, // knibis
{}, // biskni
+ { 8 }, // shogi pawn
+ {}, // lance
+ { 15, 17 }, // shogi knight
+ { -1, 1, 15, 17 }, // euroshogi knight
+ { -8, -1, 1, 7, 8, 9 }, // gold
{ -9, -8, -7, -1, 1, 7, 8, 9 } // king
};
Direction sliderCapture[][9] = {
{ NORTH, EAST, SOUTH, WEST, NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // amazon
{ NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // knibis
{}, // biskni
+ {}, // shogi pawn
+ { NORTH }, // lance
+ {}, // shogi knight
+ {}, // euroshogi knight
+ {}, // gold
{} // king
};
Direction sliderQuiet[][9] = {
{ NORTH, EAST, SOUTH, WEST, NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // amazon
{}, // knibis
{ NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }, // biskni
+ {}, // shogi pawn
+ { NORTH }, // lance
+ {}, // shogi knight
+ {}, // euroshogi knight
+ {}, // gold
{} // king
};
int sliderDistCapture[] = {
7, // amazon
7, // knibis
0, // biskni
+ 0, // shogi pawn
+ 7, // lance
+ 0, // shogi knight
+ 0, // euroshogi knight
+ 0, // gold
0 // king
};
int sliderDistQuiet[] = {
7, // amazon
0, // knibis
7, // biskni
+ 0, // shogi pawn
+ 7, // lance
+ 0, // shogi knight
+ 0, // euroshogi knight
+ 0, // gold
0 // king
};
Value PieceValue[PHASE_NB][PIECE_NB] = {
{ VALUE_ZERO, PawnValueMg, KnightValueMg, BishopValueMg, RookValueMg, QueenValueMg,
- FersValueMg, AlfilValueMg, SilverValueMg, AiwokValueMg, AmazonValueMg, KnibisValueMg, BiskniValueMg },
+ FersValueMg, AlfilValueMg, SilverValueMg, AiwokValueMg, AmazonValueMg, KnibisValueMg, BiskniValueMg,
+ ShogiPawnValueMg, LanceValueMg, ShogiKnightValueMg, EuroShogiKnightValueMg, GoldValueMg },
{ VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg,
- FersValueEg, AlfilValueEg, SilverValueEg, AiwokValueEg, AmazonValueEg, KnibisValueMg, BiskniValueMg }
+ FersValueEg, AlfilValueEg, SilverValueEg, AiwokValueEg, AmazonValueEg, KnibisValueMg, BiskniValueMg,
+ ShogiPawnValueEg, LanceValueEg, ShogiKnightValueEg, EuroShogiKnightValueEg, GoldValueEg }
};
namespace PSQT {
AmazonValueMg = 3000, AmazonValueEg = 3000,
KnibisValueMg = 800, KnibisValueEg = 800,
BiskniValueMg = 800, BiskniValueEg = 800,
+ ShogiPawnValueMg = 100, ShogiPawnValueEg = 100,
+ LanceValueMg = 300, LanceValueEg = 300,
+ ShogiKnightValueMg = 300, ShogiKnightValueEg = 300,
+ EuroShogiKnightValueMg = 400, EuroShogiKnightValueEg = 400,
+ GoldValueMg = 600, GoldValueEg = 600,
MidgameLimit = 15258, EndgameLimit = 3915
};
enum PieceType {
NO_PIECE_TYPE, PAWN, KNIGHT, BISHOP, ROOK,
QUEEN, FERS, MET = FERS, ALFIL, SILVER, KHON = SILVER, AIWOK,
- AMAZON, KNIBIS, BISKNI, KING,
+ AMAZON, KNIBIS, BISKNI, SHOGI_PAWN, LANCE, SHOGI_KNIGHT, EUROSHOGI_KNIGHT, GOLD, KING,
ALL_PIECES = 0,
PIECE_TYPE_NB = 1 << PIECE_TYPE_BITS
v->dropLoop = true;
return v;
} ();
+ const Variant* euroshogi = [&]{
+ Variant* v = new Variant();
+ v->reset_pieces();
+ v->set_piece(SHOGI_PAWN, 'p');
+ v->set_piece(EUROSHOGI_KNIGHT, 'n');
+ v->set_piece(GOLD, 'g');
+ v->set_piece(BISHOP, 'b');
+ v->set_piece(ROOK, 'r');
+ v->set_piece(KING, 'k');
+ v->startFen = "1nbgkgn1/1r4b1/pppppppp/8/8/PPPPPPPP/1B4R1/1NGKGBN1[-] w 0 1";
+ v->pieceDrops = true;
+ v->promotionPieceTypes = {};
+ v->doubleStep = false;
+ v->castling = false;
+ // TODO: piece promotions, illegal pawn drops
+ return v;
+ } ();
insert(std::pair<std::string, const Variant*>(std::string("chess"), chess));
insert(std::pair<std::string, const Variant*>(std::string("makruk"), makruk));
insert(std::pair<std::string, const Variant*>(std::string("asean"), asean));
insert(std::pair<std::string, const Variant*>(std::string("5check"), fivecheck));
insert(std::pair<std::string, const Variant*>(std::string("crazyhouse"), crazyhouse));
insert(std::pair<std::string, const Variant*>(std::string("loop"), loop));
+ insert(std::pair<std::string, const Variant*>(std::string("euroshogi"), euroshogi));
}
void VariantMap::clear_all() {