makruk STC
LLR: 2.98 (-2.94,2.94) [0.00,10.00]
Total: 1175 W: 127 L: 66 D: 982
http://www.variantfishtest.org:6543/tests/view/
6026a0606e23db669974e8f7
minishogi STC
LLR: 2.96 (-2.94,2.94) [0.00,10.00]
Total: 3706 W: 1931 L: 1775 D: 0
http://www.variantfishtest.org:6543/tests/view/
6026a0516e23db669974e8f4
standard STC
LLR: 3.00 (-2.94,2.94) [-10.00,5.00]
Total: 31166 W: 6843 L: 6953 D: 17370
http://www.variantfishtest.org:6543/tests/view/
6026a0686e23db669974e8f9
Bitboard Position::attackers_to(Square s, Bitboard occupied, Color c, Bitboard janggiCannons) const {
- // Use a faster version for variants with standard chess pieces
- if (!var->hasFairy && !var->isRestricted)
+ // Use a faster version for variants with moderate rule variations
+ if (var->fastAttacks)
{
return (pawn_attacks_bb(~c, s) & pieces(c, PAWN))
| (attacks_bb<KNIGHT>(s) & pieces(c, KNIGHT))
- | (attacks_bb< ROOK>(s, occupied) & pieces(c, ROOK, QUEEN))
- | (attacks_bb<BISHOP>(s, occupied) & pieces(c, BISHOP, QUEEN))
- | (attacks_bb<KING>(s) & pieces(c, KING, COMMONER));
+ | (attacks_bb< ROOK>(s, occupied) & pieces(c, ROOK, QUEEN, DRAGON))
+ | (attacks_bb<BISHOP>(s, occupied) & pieces(c, BISHOP, QUEEN, DRAGON_HORSE))
+ | (attacks_bb<KING>(s) & pieces(c, KING, COMMONER, DRAGON_HORSE))
+ | (attacks_bb<FERS>(s) & pieces(c, FERS, DRAGON))
+ | (LeaperAttacks[~c][SILVER][s] & pieces(c, SILVER))
+ | (LeaperAttacks[~c][GOLD][s] & pieces(c, GOLD))
+ | (LeaperAttacks[~c][SHOGI_PAWN][s]& pieces(c, SHOGI_PAWN));
}
Bitboard b = 0;
b |= diags & diagonal_lines();
}
+ // Unpromoted soldiers
if (b & pieces(SOLDIER) && relative_rank(c, s, max_rank()) < var->soldierPromotionRank)
b ^= b & pieces(SOLDIER) & ~PseudoAttacks[~c][SHOGI_PAWN][s];
Bitboard pieces(Color c) const;
Bitboard pieces(Color c, PieceType pt) const;
Bitboard pieces(Color c, PieceType pt1, PieceType pt2) const;
+ Bitboard pieces(Color c, PieceType pt1, PieceType pt2, PieceType pt3) const;
Bitboard major_pieces(Color c) const;
Bitboard non_sliding_riders() const;
Piece piece_on(Square s) const;
return pieces(c) & (pieces(pt1) | pieces(pt2));
}
+inline Bitboard Position::pieces(Color c, PieceType pt1, PieceType pt2, PieceType pt3) const {
+ return pieces(c) & (pieces(pt1) | pieces(pt2) | pieces(pt3));
+}
+
inline Bitboard Position::major_pieces(Color c) const {
return pieces(c) & (pieces(QUEEN) | pieces(AIWOK) | pieces(ARCHBISHOP) | pieces(CHANCELLOR) | pieces(AMAZON));
}
CountingRule countingRule = NO_COUNTING;
// Derived properties
- bool hasFairy = true;
- bool isRestricted = true;
+ bool fastAttacks = true;
void add_piece(PieceType pt, char c, char c2 = ' ') {
pieceToChar[make_piece(WHITE, pt)] = toupper(c);
// Pre-calculate derived properties
Variant* conclude() {
- hasFairy = std::any_of(pieceTypes.begin(), pieceTypes.end(), [this](PieceType pt) { return pt >= FAIRY_PIECES && pt != COMMONER && !(pt == KING && kingType == KING); });
- isRestricted = std::any_of(pieceTypes.begin(), pieceTypes.end(),
- [this](PieceType pt) {
- return mobilityRegion[WHITE][pt] || mobilityRegion[BLACK][pt];
- });
+ fastAttacks = std::all_of(pieceTypes.begin(), pieceTypes.end(), [this](PieceType pt) {
+ return ( pt < FAIRY_PIECES
+ || pt == COMMONER || pt == FERS || pt == SILVER
+ || pt == SHOGI_PAWN || pt == GOLD
+ || pt == DRAGON || pt == DRAGON_HORSE
+ || (pt == KING && kingType == KING))
+ && !(mobilityRegion[WHITE][pt] || mobilityRegion[BLACK][pt]);
+ });
return this;
}
};