if (pos.must_capture())
mobilityArea[Us] = AllSquares;
else
- mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them) | shift<Down>(pos.pieces(Them, SHOGI_PAWN, SOLDIER)));
+ mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them)
+ | shift<Down>(pos.pieces(Them, SHOGI_PAWN, SOLDIER))
+ | shift<EAST>(pos.promoted_soldiers(Them))
+ | shift<WEST>(pos.promoted_soldiers(Them)));
// Initialize attackedBy[] for king and pawns
attackedBy[Us][KING] = pos.count<KING>(Us) ? pos.attacks_from<KING>(ksq, Us) : Bitboard(0);
b |= diags & diagonal_lines();
}
- if (unpromoted_soldier(c, s))
+ if (b & pieces(SOLDIER) && relative_rank(c, s, max_rank()) < var->soldierPromotionRank)
b ^= b & pieces(SOLDIER) & ~PseudoAttacks[~c][SHOGI_PAWN][s];
return b;
Bitboard diagonal_lines() const;
bool king_pass() const;
bool king_pass_on_stalemate() const;
- bool unpromoted_soldier(Color c, Square s) const;
+ Bitboard promoted_soldiers(Color c) const;
bool makpong() const;
// winning conditions
int n_move_rule() const;
return var->kingPassOnStalemate;
}
-inline bool Position::unpromoted_soldier(Color c, Square s) const {
+inline Bitboard Position::promoted_soldiers(Color c) const {
assert(var != nullptr);
- return relative_rank(c, s, var->maxRank) < var->soldierPromotionRank;
+ return pieces(c, SOLDIER) & promotion_zone_bb(c, var->soldierPromotionRank, max_rank());
}
inline bool Position::makpong() const {
PieceType movePt = pt == KING ? king_type() : pt;
Bitboard b = attacks_bb(c, movePt, s, byTypeBB[ALL_PIECES]);
// Xiangqi soldier
- if (pt == SOLDIER && unpromoted_soldier(c, s))
+ if (pt == SOLDIER && !(promoted_soldiers(c) & s))
b &= file_bb(file_of(s));
// Janggi cannon restrictions
if (pt == JANGGI_CANNON)
PieceType movePt = pt == KING ? king_type() : pt;
Bitboard b = moves_bb(c, movePt, s, byTypeBB[ALL_PIECES]);
// Xiangqi soldier
- if (pt == SOLDIER && unpromoted_soldier(c, s))
+ if (pt == SOLDIER && !(promoted_soldiers(c) & s))
b &= file_bb(file_of(s));
// Janggi cannon restrictions
if (pt == JANGGI_CANNON)