/* * 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; }
/** * Illuminate or darken any room containing the given location. */ void light_room(int y1, int x1, bool light) { int i, x, y; struct point_set *ps; ps = point_set_new(200); /* Add the initial grid */ cave_room_aux(ps, y1, x1); /* While grids are in the queue, add their neighbors */ for (i = 0; i < ps->n; i++) { x = ps->pts[i].x, y = ps->pts[i].y; /* Walls get lit, but stop light */ if (!square_isprojectable(cave, y, x)) continue; /* Spread adjacent */ cave_room_aux(ps, y + 1, x); cave_room_aux(ps, y - 1, x); cave_room_aux(ps, y, x + 1); cave_room_aux(ps, y, x - 1); /* Spread diagonal */ cave_room_aux(ps, y + 1, x + 1); cave_room_aux(ps, y - 1, x - 1); cave_room_aux(ps, y - 1, x + 1); cave_room_aux(ps, y + 1, x - 1); } /* Now, lighten or darken them all at once */ if (light) { cave_light(ps); } else { cave_unlight(ps); } point_set_dispose(ps); /* Fully update the visuals */ player->upkeep->update |= (PU_UPDATE_VIEW | PU_MONSTERS); /* Update stuff */ update_stuff(player); }
/** * 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; }