Pass player powerup_flags to create_bfs_list
This commit is contained in:
parent
1dcacefc9c
commit
dc7c718b66
|
@ -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);
|
extern void init_ai_frame(void);
|
||||||
|
|
||||||
__attribute_warn_unused_result
|
__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>
|
template <std::size_t N>
|
||||||
__attribute_warn_unused_result
|
__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();
|
extern void init_thief_for_level();
|
||||||
|
|
||||||
|
|
|
@ -194,15 +194,13 @@ static int segment_is_reachable(const vcsegptr_t segp, int sidenum, const player
|
||||||
// Output:
|
// Output:
|
||||||
// bfs_list: array of shorts, each reachable segment. Includes start segment.
|
// bfs_list: array of shorts, each reachable segment. Includes start segment.
|
||||||
// length: number of elements in bfs_list
|
// 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;
|
std::size_t head = 0, tail = 0;
|
||||||
visited_segment_bitarray_t visited;
|
visited_segment_bitarray_t visited;
|
||||||
bfs_list[head++] = start_seg;
|
bfs_list[head++] = start_seg;
|
||||||
visited[start_seg] = true;
|
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)) {
|
while ((head != tail) && (head < max_segs)) {
|
||||||
auto curseg = bfs_list[tail++];
|
auto curseg = bfs_list[tail++];
|
||||||
const auto &&cursegp = vcsegptr(curseg);
|
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)
|
static segnum_t exists_fuelcen_in_mine(segnum_t start_seg)
|
||||||
{
|
{
|
||||||
array<segnum_t, MAX_SEGMENTS> bfs_list;
|
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; };
|
auto predicate = [](const segnum_t &s) { return vcsegptr(s)->special == SEGMENT_IS_FUELCEN; };
|
||||||
{
|
{
|
||||||
const auto &&rb = partial_const_range(bfs_list, length);
|
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)
|
static objnum_t exists_in_mine(segnum_t start_seg, int objtype, int objid, int special)
|
||||||
{
|
{
|
||||||
array<segnum_t, MAX_SEGMENTS> bfs_list;
|
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))
|
range_for (const auto segnum, partial_const_range(bfs_list, length))
|
||||||
{
|
{
|
||||||
|
|
|
@ -2829,7 +2829,13 @@ void init_ai_frame(void)
|
||||||
static void make_nearby_robot_snipe(void)
|
static void make_nearby_robot_snipe(void)
|
||||||
{
|
{
|
||||||
array<segnum_t, MNRS_SEG_MAX> bfs_list;
|
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 (auto &i, partial_const_range(bfs_list, bfs_length)) {
|
||||||
range_for (const auto objp, objects_in(vsegptr(i)))
|
range_for (const auto objp, objects_in(vsegptr(i)))
|
||||||
|
|
Loading…
Reference in a new issue