bool piece_attack(const board_t * board, int piece, int from, int to) { int delta; int inc, sq; ASSERT(board_is_ok(board)); ASSERT(piece_is_ok(piece)); ASSERT(square_is_ok(from)); ASSERT(square_is_ok(to)); delta = to - from; ASSERT(delta_is_ok(delta)); if ((piece & DELTA_MASK(delta)) == 0) return false; // no pseudo-attack if (!piece_is_slider(piece)) return true; inc = DELTA_INC(delta); ASSERT(inc_is_ok(inc)); for (sq = from+inc; sq != to; sq += inc) { ASSERT(square_is_ok(sq)); if (board->square[sq] != Empty) return false; // blocker } return true; }
bool attack_is_ok(const attack_t * attack) { int i; int sq, inc; if (attack == NULL) return false; // checks if (attack->dn < 0 || attack->dn > 2) return false; for (i = 0; i < attack->dn; i++) { sq = attack->ds[i]; if (!SQUARE_IS_OK(sq)) return false; inc = attack->di[i]; if (inc != IncNone && !inc_is_ok(inc)) return false; } if (attack->ds[attack->dn] != SquareNone) return false; if (attack->di[attack->dn] != IncNone) return false; return true; }