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 "pack.h"
#include "countarray.h" #include "countarray.h"
#include "fwd-segment.h" #include "fwd-segment.h"
#include "objnum.h" #include "robot.h"
//return values for find_vector_intersection() - what did we hit? //return values for find_vector_intersection() - what did we hit?
enum class fvi_hit_type : uint8_t 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 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_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 &p0;
const vms_vector &p1; const vms_vector &p1;
const std::pair<const vcobjidx_t *, const vcobjidx_t *> ignore_obj_list; const std::pair<const vcobjidx_t *, const vcobjidx_t *> ignore_obj_list;
const d_level_unique_object_state *const LevelUniqueObjectState; 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; const int flags;
/* This member depends on the value of LevelUniqueObjectState. /* This member depends on the value of LevelUniqueObjectState.
* If LevelUniqueObjectState != nullptr, then `thisobjnum` _must_ be a * 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, newpos,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
object_none, object_none,
}, obj->segnum, obj->size, hit_info); }, obj->segnum, obj->size, hit_info);
@ -804,6 +805,7 @@ static void move_object_to_position(const vmobjptridx_t objp, const vms_vector &
newpos, newpos,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
object_none, object_none,
}, temp_viewer_obj.segnum, temp_viewer_obj.size, hit_info); }, 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, vert_location,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
object_none, object_none,
}, segp, 0, hit_data); }, 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, r_segment_center,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
object_none, object_none,
}, segp, 0, hit_data); }, 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, Believed_player_pos,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL, // -- Why were we checking objects? | FQ_CHECK_OBJS; //what about trans walls??? FQ_TRANSWALL, // -- Why were we checking objects? | FQ_CHECK_OBJS; //what about trans walls???
objp, objp,
}, startseg, F1_0 / 4, Hit_data); }, 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, fire_point,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL, FQ_TRANSWALL,
obj, obj,
}, obj->segnum, 0, hit_data); }, 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, plrobj.pos,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
FQ_TRANSWALL, FQ_TRANSWALL,
buddy_obj, buddy_obj,
}, buddy_obj->segnum, F1_0 / 4, hit_data); }, 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, goal_pos,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
objp, objp,
}, psegs[i].segnum, objp->size, hit_data); }, 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, center_point,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
objp, objp,
}, obj.segnum, obj.size, hit_data); }, 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, psegs[i].point,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
objp, objp,
}, obj.segnum, obj.size, hit_data); }, 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, Point_segs[aip->hide_index + opposite_end_index].point,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, //what about trans walls??? 0, //what about trans walls???
objp, objp,
}, obj.segnum, obj.size, hit_data); }, obj.segnum, obj.size, hit_data);

View file

@ -912,6 +912,7 @@ window_event_result do_endlevel_frame()
tpnt, tpnt,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
fvi_query::unused_LevelUniqueObjectState, fvi_query::unused_LevelUniqueObjectState,
fvi_query::unused_Robot_info,
0, 0,
Objects.icptridx(object_first), Objects.icptridx(object_first),
}, ConsoleObject->segnum, 0, hit_data); }, 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_seg=segment_none;
segnum_t hit_none_seg=segment_none; segnum_t hit_none_seg=segment_none;
fvi_info::segment_array_t hit_none_seglist; fvi_info::segment_array_t hit_none_seglist;
auto &Robot_info = LevelSharedRobotInfoState.Robot_info;
seglist.clear(); seglist.clear();
if (fq.flags & FQ_GET_SEGLIST) 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. * Obtain a require_valid instance once, before the loop begins.
*/ */
const vcobjptridx_t thisobjnum = fq.thisobjnum; const vcobjptridx_t thisobjnum = fq.thisobjnum;
const robot_info *const robptrthis = thisobjnum->type == OBJ_ROBOT const auto this_is_robot = thisobjnum->type == OBJ_ROBOT;
? &Robot_info[get_robot_id(fq.thisobjnum)]
: nullptr;
const auto &collision = CollisionResult[thisobjnum->type]; 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)) range_for (const auto objnum, objects_in(*startseg, vcobjptridx, vcsegptr))
{ {
if (thisobjnum == objnum) if (thisobjnum == objnum)
@ -846,16 +847,17 @@ static fvi_hit_type fvi_sub(const fvi_query &fq, vms_vector &intp, segnum_t &int
#endif #endif
// If this is a robot:robot collision, only do it if both of them have attack_type != 0 (eg, green guy) // 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 (objnum->type == OBJ_ROBOT)
{
#if defined(DXX_BUILD_DESCENT_I) #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 #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)) // -- 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; 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 //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 && 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; fudged_rad = rad/2; //(rad*3)/4;
vms_vector hit_point; 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) //we have intersection
if (d < closest_d) { if (d < closest_d) {

View file

@ -3498,6 +3498,10 @@ static int see_object(fvcobjptridx &vcobjptridx, const vcobjptridx_t objnum)
objnum->pos, objnum->pos,
fvi_query::unused_ignore_obj_list, fvi_query::unused_ignore_obj_list,
&LevelUniqueObjectState, &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, FQ_TRANSWALL,
vcobjptridx(Viewer), vcobjptridx(Viewer),
}, Viewer->segnum, 0, hit_data); }, Viewer->segnum, 0, hit_data);

View file

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