// c) there is no piece on epSquare or behind epSquare
if ( (var->enPassantRegion & epSquare)
&& ( !var->fastAttacks
+ || (var->enPassantTypes[sideToMove] & ~piece_set(PAWN))
|| ( pawn_attacks_bb(~sideToMove, epSquare) & pieces(sideToMove, PAWN)
&& ( (pieces(~sideToMove, PAWN) & (epSquare + pawn_push(~sideToMove)))
|| (pieces(~sideToMove, PAWN) & (epSquare + 2 * pawn_push(~sideToMove))))
|| std::abs(int(to) - int(from)) == 3 * NORTH))
{
if ( (var->enPassantRegion & (to - pawn_push(us)))
- && (pawn_attacks_bb(us, to - pawn_push(us)) & pieces(them, PAWN))
+ && ((pawn_attacks_bb(us, to - pawn_push(us)) & pieces(them, PAWN)) || var->enPassantTypes[them] & ~piece_set(PAWN))
&& !(wall_gating() && gating_square(m) == to - pawn_push(us)))
{
st->epSquares |= to - pawn_push(us);
}
if ( std::abs(int(to) - int(from)) == 3 * NORTH
&& (var->enPassantRegion & (to - 2 * pawn_push(us)))
- && (pawn_attacks_bb(us, to - 2 * pawn_push(us)) & pieces(them, PAWN))
+ && ((pawn_attacks_bb(us, to - 2 * pawn_push(us)) & pieces(them, PAWN)) || var->enPassantTypes[them] & ~piece_set(PAWN))
&& !(wall_gating() && gating_square(m) == to - 2 * pawn_push(us)))
{
st->epSquares |= to - 2 * pawn_push(us);