Pass LevelSharedRobotInfoState in fvi_query

This commit is contained in:
Kp 2022-07-09 13:39:29 +00:00
parent fac016c104
commit 37132ab887
13 changed files with 42 additions and 10 deletions

View File

@ -32,7 +32,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "pack.h"
#include "countarray.h"
#include "fwd-segment.h"
#include "objnum.h"
#include "robot.h"
//return values for find_vector_intersection() - what did we hit?
enum class fvi_hit_type : uint8_t
@ -86,10 +86,16 @@ struct fvi_query
{
static constexpr const std::pair<const vcobjidx_t *, const vcobjidx_t *> unused_ignore_obj_list{};
static constexpr const d_level_unique_object_state *const unused_LevelUniqueObjectState = nullptr;
static constexpr const d_robot_info_array *const unused_Robot_info = nullptr;
const vms_vector &p0;
const vms_vector &p1;
const std::pair<const vcobjidx_t *, const vcobjidx_t *> ignore_obj_list;
const d_level_unique_object_state *const LevelUniqueObjectState;
/* This member is required when LevelUniqueObjectState != nullptr and
* thisobjnum->type == OBJ_ROBOT.
* Otherwise, it is ignored.
*/
const d_robot_info_array *const Robot_info;
const int flags;
/* This member depends on the value of LevelUniqueObjectState.
* If LevelUniqueObjectState != nullptr, then `thisobjnum` _must_ be a

View File

@ -479,6 +479,7 @@ static int move_object_within_mine(fvmobjptr &vmobjptr, segment_array &Segments,
newpos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
object_none,
}, obj->segnum, obj->size, hit_info);
@ -804,6 +805,7 @@ static void move_object_to_position(const vmobjptridx_t objp, const vms_vector &
newpos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
object_none,
}, temp_viewer_obj.segnum, temp_viewer_obj.size, hit_info);

View File

@ -1023,6 +1023,7 @@ static void cast_light_from_side(const vmsegptridx_t segp, const sidenum_t light
vert_location,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
object_none,
}, segp, 0, hit_data);
@ -1120,6 +1121,7 @@ static void cast_light_from_side_to_center(const vmsegptridx_t segp, const siden
r_segment_center,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
object_none,
}, segp, 0, hit_data);

View File

@ -764,6 +764,7 @@ player_visibility_state player_is_visible_from_object(const vmobjptridx_t objp,
Believed_player_pos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL, // -- Why were we checking objects? | FQ_CHECK_OBJS; //what about trans walls???
objp,
}, startseg, F1_0 / 4, Hit_data);
@ -1176,6 +1177,7 @@ static void ai_fire_laser_at_player(const d_level_shared_segment_state &LevelSha
fire_point,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL,
obj,
}, obj->segnum, 0, hit_data);
@ -1783,6 +1785,7 @@ static void compute_buddy_vis_vec(const vmobjptridx_t buddy_obj, const vms_vecto
plrobj.pos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL,
buddy_obj,
}, buddy_obj->segnum, F1_0 / 4, hit_data);

View File

@ -214,6 +214,7 @@ static void move_towards_outside(const d_level_shared_segment_state &LevelShared
goal_pos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
objp,
}, psegs[i].segnum, objp->size, hit_data);
@ -380,6 +381,7 @@ std::pair<create_path_result, unsigned> create_path_points(const vmobjptridx_t o
center_point,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
objp,
}, obj.segnum, obj.size, hit_data);
@ -551,6 +553,7 @@ int polish_path(const vmobjptridx_t objp, point_seg *psegs, int num_points)
psegs[i].point,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
objp,
}, obj.segnum, obj.size, hit_data);
@ -1196,6 +1199,7 @@ void ai_follow_path(const vmobjptridx_t objp, const player_visibility_state play
Point_segs[aip->hide_index + opposite_end_index].point,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, //what about trans walls???
objp,
}, obj.segnum, obj.size, hit_data);

View File

@ -912,6 +912,7 @@ window_event_result do_endlevel_frame()
tpnt,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
Objects.icptridx(object_first),
}, ConsoleObject->segnum, 0, hit_data);

View File

@ -802,7 +802,6 @@ static fvi_hit_type fvi_sub(const fvi_query &fq, vms_vector &intp, segnum_t &int
segnum_t hit_seg=segment_none;
segnum_t hit_none_seg=segment_none;
fvi_info::segment_array_t hit_none_seglist;
auto &Robot_info = LevelSharedRobotInfoState.Robot_info;
seglist.clear();
if (fq.flags & FQ_GET_SEGLIST)
@ -820,10 +819,12 @@ static fvi_hit_type fvi_sub(const fvi_query &fq, vms_vector &intp, segnum_t &int
* Obtain a require_valid instance once, before the loop begins.
*/
const vcobjptridx_t thisobjnum = fq.thisobjnum;
const robot_info *const robptrthis = thisobjnum->type == OBJ_ROBOT
? &Robot_info[get_robot_id(fq.thisobjnum)]
: nullptr;
const auto this_is_robot = thisobjnum->type == OBJ_ROBOT;
const auto &collision = CollisionResult[thisobjnum->type];
const auto Robot_info = fq.Robot_info;
const robot_info *const robptrthis = this_is_robot
? &(assert(Robot_info != nullptr), (*Robot_info)[get_robot_id(thisobjnum)])
: nullptr;
range_for (const auto objnum, objects_in(*startseg, vcobjptridx, vcsegptr))
{
if (thisobjnum == objnum)
@ -846,16 +847,17 @@ static fvi_hit_type fvi_sub(const fvi_query &fq, vms_vector &intp, segnum_t &int
#endif
// If this is a robot:robot collision, only do it if both of them have attack_type != 0 (eg, green guy)
if (robptrthis)
if (robptrthis && robptrthis->attack_type)
{
if (objnum->type == OBJ_ROBOT)
{
#if defined(DXX_BUILD_DESCENT_I)
if (!(Robot_info[get_robot_id(objnum)].attack_type && robptrthis->attack_type))
if (!((*Robot_info)[get_robot_id(objnum)].attack_type))
#endif
// -- MK: 11/18/95, 4claws glomming together...this is easy. -- if (!(Robot_info[Objects[objnum].id].attack_type && Robot_info[Objects[thisobjnum].id].attack_type))
continue;
if (robptrthis->attack_type)
fudged_rad = (rad*3)/4;
}
fudged_rad = (rad * 3) / 4;
}
//if obj is player, and bumping into other player or a weapon of another coop player, reduce radius
else if (fq.thisobjnum->type == OBJ_PLAYER &&
@ -864,7 +866,7 @@ static fvi_hit_type fvi_sub(const fvi_query &fq, vms_vector &intp, segnum_t &int
fudged_rad = rad/2; //(rad*3)/4;
vms_vector hit_point;
const auto &&d = check_vector_to_object(&Robot_info, hit_point, fq.p0, fq.p1, fudged_rad, objnum, fq.thisobjnum);
const auto &&d = check_vector_to_object(Robot_info, hit_point, fq.p0, fq.p1, fudged_rad, objnum, thisobjnum);
if (d) //we have intersection
if (d < closest_d) {

View File

@ -3498,6 +3498,10 @@ static int see_object(fvcobjptridx &vcobjptridx, const vcobjptridx_t objnum)
objnum->pos,
fvi_query::unused_ignore_obj_list,
&LevelUniqueObjectState,
/* This is only necessary if `Viewer` can be a robot. In developer
* builds, the user can view from any object, not just a player.
*/
&LevelSharedRobotInfoState.Robot_info,
FQ_TRANSWALL,
vcobjptridx(Viewer),
}, Viewer->segnum, 0, hit_data);

View File

@ -605,6 +605,7 @@ static void do_omega_stuff(fvmsegptridx &vmsegptridx, const vmobjptridx_t parent
goal_pos,
fvi_query::unused_ignore_obj_list,
&LevelUniqueObjectState,
&LevelSharedRobotInfoState.Robot_info,
FQ_IGNORE_POWERUPS | FQ_TRANSPOINT, //what about trans walls???
parent_objp,
}, firing_segnum, 0, hit_data);
@ -899,6 +900,7 @@ imobjptridx_t Laser_create_new_easy(const vms_vector &direction, const vms_vecto
position,
fvi_query::unused_ignore_obj_list,
&LevelUniqueObjectState,
&LevelSharedRobotInfoState.Robot_info,
FQ_TRANSWALL, //what about trans walls???
parent,
}, parent->segnum, 0, hit_data);
@ -954,6 +956,7 @@ int object_to_object_visibility(const vcobjptridx_t obj1, const object_base &obj
obj2.pos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
trans_type,
obj1,
}, obj1->segnum, 0x10, hit_data))
@ -1315,6 +1318,7 @@ static imobjptridx_t Laser_player_fire_spread_delay(fvmsegptridx &vmsegptridx, c
LaserPos,
fvi_query::unused_ignore_obj_list,
&LevelUniqueObjectState,
&LevelSharedRobotInfoState.Robot_info,
#if defined(DXX_BUILD_DESCENT_I)
0,
#elif defined(DXX_BUILD_DESCENT_II)

View File

@ -171,6 +171,7 @@ static void apply_light(fvmsegptridx &vmsegptridx, const g3s_lrgb obj_light_emis
tvec,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL,
objnum,
}, obj_seg, 0, hit_data);

View File

@ -1406,6 +1406,7 @@ static void set_camera_pos(vms_vector &camera_pos, const vcobjptridx_t objp)
local_p1,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
objp,
}, objp->segnum, 0, hit_data);

View File

@ -436,6 +436,7 @@ window_event_result do_physics_sim(const vmobjptridx_t obj, const vms_vector &ob
new_pos,
ignore_obj_list,
&LevelUniqueObjectState,
&LevelSharedRobotInfoState.Robot_info,
flags,
obj,
}, obj->segnum, obj->size, hit_info);

View File

@ -1385,6 +1385,7 @@ static bool immediate_detonate_smart_mine(const vcobjptridx_t smart_mine, const
target->pos,
fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0,
smart_mine,
}, smart_mine->segnum, 0, hit_data);