occupied ^= to; // For the case when captured piece is a pinner
// Don't allow pinned pieces to attack pieces except the king as long all
- // pinners are on their original square. When a pinner moves to the
- // exchange-square or get captured on it, we fall back to standard SEE behaviour.
- if ( (stmAttackers & pinned_pieces(stm))
- && (st->pinnersForKing[stm] & occupied) == st->pinnersForKing[stm])
- stmAttackers &= ~pinned_pieces(stm);
+ // pinners are on their original square.
+ if (!(st->pinnersForKing[stm] & ~occupied))
+ stmAttackers &= ~st->blockersForKing[stm];
if (!stmAttackers)
return swapList[0];
nextVictim = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
stm = ~stm;
stmAttackers = attackers & pieces(stm);
- if ( nextVictim != KING
- && (stmAttackers & pinned_pieces(stm))
- && (st->pinnersForKing[stm] & occupied) == st->pinnersForKing[stm])
- stmAttackers &= ~pinned_pieces(stm);
+
+ // Don't allow pinned pieces to attack pieces except the king
+ if ( nextVictim != KING
+ && !(st->pinnersForKing[stm] & ~occupied))
+ stmAttackers &= ~st->blockersForKing[stm];
++slIndex;