diff --git a/common/main/ai.h b/common/main/ai.h index 39946b5ee..ad92f335d 100644 --- a/common/main/ai.h +++ b/common/main/ai.h @@ -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 __attribute_warn_unused_result -std::size_t create_bfs_list(segnum_t start_seg, array &bfs_list) +std::size_t create_bfs_list(const segnum_t start_seg, const player_flags powerup_flags, array &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(); diff --git a/d2x-rebirth/main/escort.cpp b/d2x-rebirth/main/escort.cpp index 3c1e611ca..eaf2728d7 100644 --- a/d2x-rebirth/main/escort.cpp +++ b/d2x-rebirth/main/escort.cpp @@ -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 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 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)) { diff --git a/similar/main/ai.cpp b/similar/main/ai.cpp index 7f9c35549..ccde16719 100644 --- a/similar/main/ai.cpp +++ b/similar/main/ai.cpp @@ -2829,7 +2829,13 @@ void init_ai_frame(void) static void make_nearby_robot_snipe(void) { array 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)))