/* * Return a target set of target_able monsters. */ static struct point_set *target_set_interactive_prepare(int mode) { int y, x; struct point_set *targets = point_set_new(TS_INITIAL_SIZE); /* Scan the current panel */ for (y = Term->offset_y; y < Term->offset_y + SCREEN_HGT; y++) { for (x = Term->offset_x; x < Term->offset_x + SCREEN_WID; x++) { /* Check bounds */ if (!cave_in_bounds_fully(cave, y, x)) continue; /* Require "interesting" contents */ if (!target_set_interactive_accept(y, x)) continue; /* Special mode */ if (mode & (TARGET_KILL)) { /* Must contain a monster */ if (!(cave->m_idx[y][x] > 0)) continue; /* Must be a targettable monster */ if (!target_able(cave_monster_at(cave, y, x))) continue; } /* Save the location */ add_to_point_set(targets, y, x); } } sort(targets->pts, point_set_size(targets), sizeof(*(targets->pts)), cmp_distance); return targets; }
/* * Aux function -- see below */ static void cave_room_aux(struct point_set *seen, int y, int x) { if (point_set_contains(seen, y, x)) return; if (!square_isroom(cave, y, x)) return; /* Add it to the "seen" set */ add_to_point_set(seen, y, x); }
static void parse_points(const char *points, PointsList **target_list) { const char *p = points; const char *q = p; while (*q != '\0') { if (isspace(*q)) { const ssize_t len = q - p; if (!isspace(*p)) { add_to_point_set(p, len, target_list); } p = q + 1; q = p; } else { q++; } } if (!isspace(*p) && q > p) { const ssize_t len = q - p; add_to_point_set(p, len, target_list); } }
/** * Return a target set of target_able monsters. */ struct point_set *target_get_monsters(int mode, monster_predicate pred) { int y, x; int min_y, min_x, max_y, max_x; struct point_set *targets = point_set_new(TS_INITIAL_SIZE); /* Get the current panel */ get_panel(&min_y, &min_x, &max_y, &max_x); /* Scan for targets */ for (y = min_y; y < max_y; y++) { for (x = min_x; x < max_x; x++) { struct loc grid = loc(x, y); /* Check bounds */ if (!square_in_bounds_fully(cave, grid)) continue; /* Require "interesting" contents */ if (!target_accept(y, x)) continue; /* Special mode */ if (mode & (TARGET_KILL)) { struct monster *mon = square_monster(cave, grid); /* Must contain a monster */ if (mon == NULL) continue; /* Must be a targettable monster */ if (!target_able(mon)) continue; /* Must be the right sort of monster */ if (pred && !pred(mon)) continue; } /* Save the location */ add_to_point_set(targets, grid); } } sort(targets->pts, point_set_size(targets), sizeof(*(targets->pts)), cmp_distance); return targets; }
/** * Return a target set of target_able monsters. */ struct point_set *target_get_monsters(int mode) { int y, x; int min_y, min_x, max_y, max_x; struct point_set *targets = point_set_new(TS_INITIAL_SIZE); /* Get the current panel */ get_panel(&min_y, &min_x, &max_y, &max_x); /* Scan for targets */ for (y = min_y; y < max_y; y++) { for (x = min_x; x < max_x; x++) { /* Check bounds */ if (!square_in_bounds_fully(cave, y, x)) continue; /* Require "interesting" contents */ if (!target_accept(y, x)) continue; /* Special mode */ if (mode & (TARGET_KILL)) { /* Must contain a monster */ if (!(cave->squares[y][x].mon > 0)) continue; /* Must be a targettable monster */ if (!target_able(square_monster(cave, y, x))) continue; } /* Save the location */ add_to_point_set(targets, y, x); } } sort(targets->pts, point_set_size(targets), sizeof(*(targets->pts)), cmp_distance); return targets; }