Pass LevelSharedRobotInfoState in fvi_query
This commit is contained in:
parent
fac016c104
commit
37132ab887
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,15 +847,16 @@ 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
|
||||||
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue