void AddXrayPiece (int t, int sq, int side, BitBoard *b, BitBoard *c) /*************************************************************************** * * The purpose of this routine is to find a piece which attack through * another piece (e.g. two rooks, Q+B, B+P, etc.) Side is the side attacking * the square where the swapping is to be done. * ***************************************************************************/ { int dir, nsq, piece; BitBoard a; dir = directions[t][sq]; a = Ray[sq][dir] & board.blocker; if (a == NULLBITBOARD) return; nsq = (t < sq ? leadz (a) : trailz (a)); piece = cboard[nsq]; if ((piece == queen) || (piece == rook && dir > 3) || (piece == bishop && dir < 4)) { if (BitPosArray[nsq] & board.friends[side]) *b |= BitPosArray[nsq]; else *c |= BitPosArray[nsq]; } return; }
int PinnedOnKing (int sq, int side) /*************************************************************************** * * Determine if the piece on sq is pinned against the King. * Side is the color of the piece. * Caveat: PinnedOnKing should only be called by GenCheckEscapes(). * The more generic FindPins() function should be used for evaluating * pins against other pieces. * ***************************************************************************/ { int xside; int KingSq, dir, sq1; BitBoard b, blocker; KingSq = board.king[side]; if ((dir = directions[KingSq][sq]) == -1) return (false); xside = 1 ^ side; blocker = board.blocker; /* Path from piece to king is blocked, so no pin */ if (FromToRay[KingSq][sq] & NotBitPosArray[sq] & blocker) return (false); b = (Ray[KingSq][dir] ^ FromToRay[KingSq][sq]) & blocker; if (b == NULLBITBOARD) return (false); sq1 = (sq > KingSq ? leadz (b) : trailz (b)); /* If diagonal */ if (dir <= 3 && BitPosArray[sq1] & (board.b[xside][queen] | board.b[xside][bishop])) return (true); /* Rank / file */ if (dir >= 4 && BitPosArray[sq1] & (board.b[xside][queen] | board.b[xside][rook])) return (true); return (false); }
// sn must be in network order static inline int subnet4_to_prefixlen(uint32_t sn) { return 32 - trailz(ntohl(sn)); }