Pass player powerup_flags to create_bfs_list

This commit is contained in:
Kp 2016-10-02 00:34:47 +00:00
parent 1dcacefc9c
commit dc7c718b66
3 changed files with 15 additions and 9 deletions

View file

@ -256,13 +256,13 @@ extern int Stolen_item_index; // Used in ai.c for controlling rate of Thief fl
extern void init_ai_frame(void);
__attribute_warn_unused_result
std::size_t create_bfs_list(segnum_t start_seg, segnum_t *bfs_list, std::size_t max_segs);
std::size_t create_bfs_list(segnum_t start_seg, player_flags, segnum_t *bfs_list, std::size_t max_segs);
template <std::size_t N>
__attribute_warn_unused_result
std::size_t create_bfs_list(segnum_t start_seg, array<segnum_t, N> &bfs_list)
std::size_t create_bfs_list(const segnum_t start_seg, const player_flags powerup_flags, array<segnum_t, N> &bfs_list)
{
return create_bfs_list(start_seg, bfs_list.data(), N);
return create_bfs_list(start_seg, powerup_flags, bfs_list.data(), N);
}
extern void init_thief_for_level();

View file

@ -194,15 +194,13 @@ static int segment_is_reachable(const vcsegptr_t segp, int sidenum, const player
// Output:
// bfs_list: array of shorts, each reachable segment. Includes start segment.
// length: number of elements in bfs_list
std::size_t create_bfs_list(segnum_t start_seg, segnum_t *const bfs_list, std::size_t max_segs)
std::size_t create_bfs_list(segnum_t start_seg, const player_flags powerup_flags, segnum_t *const bfs_list, std::size_t max_segs)
{
std::size_t head = 0, tail = 0;
visited_segment_bitarray_t visited;
bfs_list[head++] = start_seg;
visited[start_seg] = true;
auto &player_info = get_local_plrobj().ctype.player_info;
const auto powerup_flags = player_info.powerup_flags;
while ((head != tail) && (head < max_segs)) {
auto curseg = bfs_list[tail++];
const auto &&cursegp = vcsegptr(curseg);
@ -555,7 +553,8 @@ static objnum_t exists_in_mine_2(const vcsegptridx_t segp, int objtype, int obji
static segnum_t exists_fuelcen_in_mine(segnum_t start_seg)
{
array<segnum_t, MAX_SEGMENTS> bfs_list;
const auto length = create_bfs_list(start_seg, bfs_list);
const auto powerup_flags = get_local_plrobj().ctype.player_info.powerup_flags;
const auto length = create_bfs_list(start_seg, powerup_flags, bfs_list);
auto predicate = [](const segnum_t &s) { return vcsegptr(s)->special == SEGMENT_IS_FUELCEN; };
{
const auto &&rb = partial_const_range(bfs_list, length);
@ -581,7 +580,8 @@ static segnum_t exists_fuelcen_in_mine(segnum_t start_seg)
static objnum_t exists_in_mine(segnum_t start_seg, int objtype, int objid, int special)
{
array<segnum_t, MAX_SEGMENTS> bfs_list;
const auto length = create_bfs_list(start_seg, bfs_list);
const auto powerup_flags = get_local_plrobj().ctype.player_info.powerup_flags;
const auto length = create_bfs_list(start_seg, powerup_flags, bfs_list);
range_for (const auto segnum, partial_const_range(bfs_list, length))
{

View file

@ -2829,7 +2829,13 @@ void init_ai_frame(void)
static void make_nearby_robot_snipe(void)
{
array<segnum_t, MNRS_SEG_MAX> bfs_list;
const auto bfs_length = create_bfs_list(ConsoleObject->segnum, bfs_list);
/* Passing powerup_flags here seems wrong. Sniping robots do not
* open doors, so they should not care what doors the player can
* open. However, passing powerup_flags here maintains the
* semantics that past versions used.
*/
const auto powerup_flags = get_local_plrobj().ctype.player_info.powerup_flags;
const auto bfs_length = create_bfs_list(ConsoleObject->segnum, powerup_flags, bfs_list);
range_for (auto &i, partial_const_range(bfs_list, bfs_length)) {
range_for (const auto objp, objects_in(vsegptr(i)))