Code: Select all
for (ptr = &board->piece[me][1]; (from=*ptr) != SquareNone; ptr++) { // HACK: no king
piece = board->square[from];
delta = king - from;
ASSERT(delta_is_ok(delta));
if (PSEUDO_ATTACK(piece,delta)) {
ASSERT(PIECE_IS_SLIDER(piece));
inc = DELTA_INC_LINE(delta);
ASSERT(inc!=IncNone);
ASSERT(SLIDER_ATTACK(piece,inc));
sq = from;
do sq += inc; while ((capture=board->square[sq]) == Empty);
ASSERT(sq!=king);
if (COLOUR_IS(capture,me)) {
pin = sq;
do sq += inc; while (board->square[sq] == Empty);
if (sq == king) *list++ = pin;
}
}
}
Code: Select all
#define DELTA_INC_LINE(delta) (DeltaIncLine[DeltaOffset+(delta)])
#define DELTA_INC_ALL(delta) (DeltaIncAll[DeltaOffset+(delta)])
#define DELTA_MASK(delta) (DeltaMask[DeltaOffset+(delta)])
#define INC_MASK(inc) (IncMask[IncOffset+(inc)])
#define PIECE_ATTACK(board,piece,from,to) (PSEUDO_ATTACK((piece),(to)-(from))&&line_is_empty((board),(from),(to)))
#define PSEUDO_ATTACK(piece,delta) (((piece)&DELTA_MASK(delta))!=0)
#define SLIDER_ATTACK(piece,inc) (((piece)&INC_MASK(inc))!=0)
Code: Select all
// knight attacks
for (dir = 0; dir < 8; dir++) {
delta = KnightInc[dir];
ASSERT(delta_is_ok(delta));
ASSERT(DeltaIncAll[DeltaOffset+delta]==IncNone);
DeltaIncAll[DeltaOffset+delta] = delta;
DeltaMask[DeltaOffset+delta] |= KnightFlag;
}
Code: Select all
// piece attack
for (ptr = &board->piece[colour][0]; (from=*ptr) != SquareNone; ptr++) {
piece = board->square[from];
delta = to - from;
if (PSEUDO_ATTACK(piece,delta)) {
inc = DELTA_INC_ALL(delta);
ASSERT(inc!=IncNone);
sq = from;
do {
sq += inc;
if (sq == to) return true;
} while (board->square[sq] == Empty);
}
}