static void alist_build(alist_t * alist, const board_t * board, int to, int colour) { const sq_t * ptr; int from; int piece; int delta; int inc; int sq; int pawn; ASSERT(alist!=NULL); ASSERT(board!=NULL); ASSERT(SQUARE_IS_OK(to)); ASSERT(COLOUR_IS_OK(colour)); // piece attacks 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) { // attack alist_add(alist,from,board); break; } } while (board->square[sq] == Empty); } } // pawn attacks inc = PAWN_MOVE_INC(colour); pawn = PAWN_MAKE(colour); from = to - (inc-1); if (board->square[from] == pawn) alist_add(alist,from,board); from = to - (inc+1); if (board->square[from] == pawn) alist_add(alist,from,board); }
bool is_attacked(const board_t * board, int to, int colour) { int inc; int pawn; const sq_t * ptr; int from; int piece; int delta; int sq; ASSERT(board!=NULL); ASSERT(SQUARE_IS_OK(to)); ASSERT(COLOUR_IS_OK(colour)); // pawn attack inc = PAWN_MOVE_INC(colour); pawn = PAWN_MAKE(colour); if (board->square[to-(inc-1)] == pawn) return true; if (board->square[to-(inc+1)] == pawn) return true; // 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); } } return false; }
bool line_is_empty(const board_t * board, int from, int to) { int delta; int inc, sq; ASSERT(board!=NULL); ASSERT(SQUARE_IS_OK(from)); ASSERT(SQUARE_IS_OK(to)); delta = to - from; ASSERT(delta_is_ok(delta)); inc = DELTA_INC_ALL(delta); ASSERT(inc!=IncNone); sq = from; do { sq += inc; if (sq == to) return true; } while (board->square[sq] == Empty); return false; // blocker }