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->isFairy && !var->isRestricted)
+ if (!var->hasFairy && !var->isRestricted)
{
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));
+ | (attacks_bb<KING>(s) & pieces(c, KING, COMMONER));
}
Bitboard b = 0;
CountingRule countingRule = NO_COUNTING;
// Derived properties
- bool isFairy = true;
+ bool hasFairy = true;
bool isRestricted = true;
void add_piece(PieceType pt, char c, char c2 = ' ') {
// Pre-calculate derived properties
Variant* conclude() {
- isFairy = std::any_of(pieceTypes.begin(), pieceTypes.end(), [](PieceType pt) { return pt >= FAIRY_PIECES && pt < KING; });
+ 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];