Pass bare object & to thief stealing routines

Use `object &` instead of `vmobjptr_t`.  This should generate equivalent
code, but produce smaller debug information and may require less
inlining by the compiler.
This commit is contained in:
Kp 2022-04-24 20:42:01 +00:00
parent 1c2e1c6946
commit a610a7b32d
4 changed files with 40 additions and 24 deletions

View file

@ -191,7 +191,7 @@ void attempt_to_resume_path(vmobjptridx_t objp);
// When a robot and a player collide, some robots attack!
void do_ai_robot_hit_attack(vmobjptridx_t robot, vmobjptridx_t player, const vms_vector &collision_point);
int ai_door_is_openable(
object &,
const object &,
#if defined(DXX_BUILD_DESCENT_II)
player_flags,
#endif
@ -252,11 +252,11 @@ imobjptridx_t boss_spew_robot(const object_base &objp, const vms_vector &pos);
void init_ai_frame(player_flags, const control_info &Controls);
[[nodiscard]]
std::size_t create_bfs_list(vmobjptr_t robot, vcsegidx_t start_seg, player_flags, segnum_t *bfs_list, std::size_t max_segs);
std::size_t create_bfs_list(const object &robot, vcsegidx_t start_seg, player_flags, segnum_t *bfs_list, std::size_t max_segs);
template <std::size_t N>
[[nodiscard]]
std::size_t create_bfs_list(const vmobjptr_t &robot, const vcsegidx_t &start_seg, const player_flags powerup_flags, std::array<segnum_t, N> &bfs_list)
std::size_t create_bfs_list(const object &robot, const vcsegidx_t &start_seg, const player_flags powerup_flags, std::array<segnum_t, N> &bfs_list)
{
return create_bfs_list(robot, start_seg, powerup_flags, bfs_list.data(), N);
}

View file

@ -205,7 +205,7 @@ int pick_up_vulcan_ammo(player_info &player_info, uint_fast32_t ammo_count, bool
imobjptridx_t spit_powerup(const d_vclip_array &Vclip, const object_base &spitter, unsigned id, unsigned seed);
#if defined(DXX_BUILD_DESCENT_II)
int attempt_to_steal_item(vmobjptridx_t objp, vmobjptr_t playerobjp);
int attempt_to_steal_item(vmobjptridx_t objp, object &playerobjp);
#define SMEGA_ID 40

View file

@ -193,10 +193,12 @@ void init_buddy_for_level(void)
BuddyState.Buddy_objnum = find_escort(vmobjptridx, Robot_info);
}
namespace {
// -----------------------------------------------------------------------------
// See if segment from curseg through sidenum is reachable.
// Return true if it is reachable, else return false.
static int segment_is_reachable(const vmobjptr_t robot, const shared_segment &segp, const sidenum_t sidenum, const player_flags powerup_flags)
static int segment_is_reachable(const object &robot, const shared_segment &segp, const sidenum_t sidenum, const player_flags powerup_flags)
{
const auto wall_num = segp.sides[sidenum].wall_num;
@ -234,6 +236,7 @@ static int segment_is_reachable(const vmobjptr_t robot, const shared_segment &se
}
}
// -----------------------------------------------------------------------------
// Create a breadth-first list of segments reachable from current segment.
@ -244,7 +247,7 @@ static int segment_is_reachable(const vmobjptr_t robot, const shared_segment &se
// 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(const vmobjptr_t robot, const vcsegidx_t start_seg, const player_flags powerup_flags, segnum_t *const bfs_list, std::size_t max_segs)
std::size_t create_bfs_list(const object &robot, const vcsegidx_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;
@ -270,6 +273,8 @@ std::size_t create_bfs_list(const vmobjptr_t robot, const vcsegidx_t start_seg,
return head;
}
namespace {
// -----------------------------------------------------------------------------
// Return true if ok for buddy to talk, else return false.
// Buddy is allowed to talk if the segment he is in does not contain a blastable wall that has not been blasted
@ -341,6 +346,8 @@ static void record_escort_goal_accomplished()
}
}
}
// --------------------------------------------------------------------------------------------
void detect_escort_goal_fuelcen_accomplished()
{
@ -414,6 +421,8 @@ void change_guidebot_name()
(void)menu;
}
namespace {
// -----------------------------------------------------------------------------
static uint8_t show_buddy_message()
{
@ -464,6 +473,8 @@ static void buddy_message_ignore_time(const char *const fmt, ...)
va_end(args);
}
}
void (buddy_message)(const char * format, ... )
{
if (!show_buddy_message())
@ -483,6 +494,8 @@ void buddy_message_str(const char *str)
buddy_message_force_str(str);
}
namespace {
// -----------------------------------------------------------------------------
static void thief_message_str(const char * str) __attribute_nonnull();
static void thief_message_str(const char * str)
@ -519,6 +532,8 @@ static int marker_exists_in_mine(const game_marker_index id)
return 0;
}
}
// -----------------------------------------------------------------------------
void set_escort_special_goal(d_unique_buddy_state &BuddyState, const int raw_special_key)
{
@ -1561,12 +1576,14 @@ void do_thief_frame(const vmobjptridx_t objp, const fix dist_to_player, const pl
}
namespace {
// ----------------------------------------------------------------------------
// Return true if this item (whose presence is indicated by Players[player_num].flags) gets stolen.
static int maybe_steal_flag_item(const vmobjptr_t playerobjp, const PLAYER_FLAG flagval)
static int maybe_steal_flag_item(object &playerobj, const PLAYER_FLAG flagval)
{
auto &ThiefUniqueState = LevelUniqueObjectState.ThiefState;
auto &plr_flags = playerobjp->ctype.player_info.powerup_flags;
auto &plr_flags = playerobj.ctype.player_info.powerup_flags;
if (plr_flags & flagval)
{
if (d_rand() < THIEF_PROBABILITY) {
@ -1617,10 +1634,10 @@ static int maybe_steal_flag_item(const vmobjptr_t playerobjp, const PLAYER_FLAG
}
// ----------------------------------------------------------------------------
static int maybe_steal_secondary_weapon(const vmobjptr_t playerobjp, const secondary_weapon_index_t weapon_num)
static int maybe_steal_secondary_weapon(object &playerobj, const secondary_weapon_index_t weapon_num)
{
auto &ThiefUniqueState = LevelUniqueObjectState.ThiefState;
auto &player_info = playerobjp->ctype.player_info;
auto &player_info = playerobj.ctype.player_info;
if (auto &secondary_ammo = player_info.secondary_ammo[weapon_num])
if (d_rand() < THIEF_PROBABILITY) {
if (weapon_index_is_player_bomb(weapon_num))
@ -1643,10 +1660,10 @@ static int maybe_steal_secondary_weapon(const vmobjptr_t playerobjp, const secon
}
// ----------------------------------------------------------------------------
static int maybe_steal_primary_weapon(const vmobjptr_t playerobjp, const primary_weapon_index_t weapon_num)
static int maybe_steal_primary_weapon(object &playerobj, const primary_weapon_index_t weapon_num)
{
auto &ThiefUniqueState = LevelUniqueObjectState.ThiefState;
auto &player_info = playerobjp->ctype.player_info;
auto &player_info = playerobj.ctype.player_info;
bool is_energy_weapon = true;
switch (static_cast<primary_weapon_index_t>(weapon_num))
{
@ -1707,17 +1724,14 @@ static int maybe_steal_primary_weapon(const vmobjptr_t playerobjp, const primary
return 0;
}
// ----------------------------------------------------------------------------
// Called for a thief-type robot.
// If a item successfully stolen, returns true, else returns false.
// If a wapon successfully stolen, do everything, removing it from player,
// updating Stolen_items information, deselecting, etc.
static int attempt_to_steal_item_3(const vmobjptr_t objp, const vmobjptr_t player_num)
static int attempt_to_steal_item_3(object &thief, object &player_num)
{
ai_local *ailp = &objp->ctype.ai_info.ail;
if (ailp->mode != ai_mode::AIM_THIEF_ATTACK)
if (thief.ctype.ai_info.ail.mode != ai_mode::AIM_THIEF_ATTACK)
return 0;
// First, try to steal equipped items.
@ -1726,7 +1740,7 @@ static int attempt_to_steal_item_3(const vmobjptr_t objp, const vmobjptr_t playe
return r;
// If primary weapon = laser, first try to rip away those nasty quad lasers!
const auto Primary_weapon = player_num->ctype.player_info.Primary_weapon;
const auto Primary_weapon = player_num.ctype.player_info.Primary_weapon;
if (Primary_weapon == primary_weapon_index_t::LASER_INDEX)
if (auto r = maybe_steal_flag_item(player_num, PLAYER_FLAGS_QUAD_LASERS))
return r;
@ -1739,7 +1753,7 @@ static int attempt_to_steal_item_3(const vmobjptr_t objp, const vmobjptr_t playe
return r;
}
if (auto r = maybe_steal_secondary_weapon(player_num, player_num->ctype.player_info.Secondary_weapon))
if (auto r = maybe_steal_secondary_weapon(player_num, player_num.ctype.player_info.Secondary_weapon))
return r;
// See what the player has and try to snag something.
@ -1772,10 +1786,10 @@ static int attempt_to_steal_item_3(const vmobjptr_t objp, const vmobjptr_t playe
}
// ----------------------------------------------------------------------------
static int attempt_to_steal_item_2(const vmobjptr_t objp, const vmobjptr_t player_num)
static int attempt_to_steal_item_2(object &thief, object &player_num)
{
auto &ThiefUniqueState = LevelUniqueObjectState.ThiefState;
const auto rval = attempt_to_steal_item_3(objp, player_num);
const auto rval = attempt_to_steal_item_3(thief, player_num);
if (rval) {
digi_play_sample_once(SOUND_WEAPON_STOLEN, F1_0);
auto i = ThiefUniqueState.Stolen_item_index;
@ -1789,12 +1803,14 @@ static int attempt_to_steal_item_2(const vmobjptr_t objp, const vmobjptr_t playe
return rval;
}
}
// ----------------------------------------------------------------------------
// Called for a thief-type robot.
// If a item successfully stolen, returns true, else returns false.
// If a wapon successfully stolen, do everything, removing it from player,
// updating Stolen_items information, deselecting, etc.
int attempt_to_steal_item(const vmobjptridx_t objp, const vmobjptr_t player_num)
int attempt_to_steal_item(const vmobjptridx_t objp, object &player_num)
{
int rval = 0;

View file

@ -1860,7 +1860,7 @@ void move_towards_segment_center(const d_level_shared_segment_state &LevelShared
// Brains, avoid robots, companions can open doors.
// objp == NULL means treat as buddy.
int ai_door_is_openable(
object &obj,
const object &obj,
#if defined(DXX_BUILD_DESCENT_II)
const player_flags powerup_flags,
#endif
@ -3056,7 +3056,7 @@ namespace {
// ----------------------------------------------------------------------------
// Make a robot near the player snipe.
#define MNRS_SEG_MAX 70
static void make_nearby_robot_snipe(fvmsegptr &vmsegptr, const vmobjptr_t robot, const player_flags powerup_flags)
static void make_nearby_robot_snipe(fvmsegptr &vmsegptr, const object &robot, const player_flags powerup_flags)
{
auto &Objects = LevelUniqueObjectState.Objects;
auto &vmobjptridx = Objects.vmptridx;