Pass collide_*_and_* arg by &

Use const& where possible.  Some are non-const due to the recent FVI
hack that resets the collision point late.
This commit is contained in:
Kp 2014-10-26 21:36:40 +00:00
parent 9a32e151ff
commit 012435f5c4
6 changed files with 85 additions and 110 deletions

View file

@ -128,7 +128,7 @@ void create_path_to_player(vobjptridx_t objp, int max_length, int safety_flag);
void attempt_to_resume_path(vobjptridx_t objp);
// When a robot and a player collide, some robots attack!
void do_ai_robot_hit_attack(vobjptridx_t robot, objptridx_t player, vms_vector *collision_point);
void do_ai_robot_hit_attack(vobjptridx_t robot, objptridx_t player, const vms_vector &collision_point);
extern void ai_open_doors_in_segment(object *robot);
extern int ai_door_is_openable(object *objp, segment *segp, int sidenum);
int player_is_visible_from_object(vobjptridx_t objp, vms_vector &pos, fix field_of_view, const vms_vector &vec_to_player);

View file

@ -32,7 +32,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#ifdef __cplusplus
void collide_two_objects(vobjptridx_t A, vobjptridx_t B, vms_vector &collision_point);
void collide_object_with_wall(vobjptridx_t A, fix hitspeed, segnum_t hitseg, short hitwall, vms_vector * hitpt);
void collide_object_with_wall(vobjptridx_t A, fix hitspeed, segnum_t hitseg, short hitwall, const vms_vector &hitpt);
void apply_damage_to_player(object *player, objptridx_t killer, fix damage, ubyte possibly_friendly);
// Returns 1 if robot died, else 0.
@ -44,12 +44,12 @@ extern void collide_player_and_materialization_center(object *objp);
void collide_robot_and_materialization_center(vobjptridx_t objp);
void scrape_player_on_wall(vobjptridx_t obj, segnum_t hitseg, short hitwall, const vms_vector &hitpt);
int maybe_detonate_weapon(vobjptridx_t obj0p, object *obj, vms_vector *pos);
int maybe_detonate_weapon(vobjptridx_t obj0p, object *obj, const vms_vector &pos);
void collide_player_and_nasty_robot(vobjptridx_t player, vobjptridx_t robot, vms_vector *collision_point);
void collide_player_and_nasty_robot(vobjptridx_t player, vobjptridx_t robot, const vms_vector &collision_point);
void net_destroy_controlcen(objptridx_t controlcen);
void collide_player_and_powerup(object *player, vobjptridx_t powerup, vms_vector *collision_point);
void collide_player_and_powerup(object *player, vobjptridx_t powerup, const vms_vector &);
int check_effect_blowup(segment *seg,int side,const vms_vector &pnt, object *blower, int force_blowup_flag, int remote);
void apply_damage_to_controlcen(vobjptridx_t controlcen, fix damage, objnum_t who);
extern void bump_one_object(object *obj0, vms_vector *hit_dir, fix damage);

View file

@ -941,7 +941,7 @@ static void set_next_fire_time(object *objp, ai_local *ailp, robot_info *robptr,
// ----------------------------------------------------------------------------------
// When some robots collide with the player, they attack.
// If player is cloaked, then robot probably didn't actually collide, deal with that here.
void do_ai_robot_hit_attack(vobjptridx_t robot, objptridx_t playerobj, vms_vector *collision_point)
void do_ai_robot_hit_attack(vobjptridx_t robot, objptridx_t playerobj, const vms_vector &collision_point)
{
ai_local *ailp = &robot->ctype.ai_info.ail;
robot_info *robptr = &Robot_info[get_robot_id(robot)];
@ -2648,7 +2648,7 @@ static void ai_do_actual_firing_stuff(vobjptridx_t obj, ai_static *aip, ai_local
if (!Player_exploded && (dist_to_player < obj->size + ConsoleObject->size + F1_0*2)) { // robptr->circle_distance[Difficulty_level] + ConsoleObject->size)
if (!ai_multiplayer_awareness(obj, ROBOT_FIRE_AGITATION-2))
return;
do_ai_robot_hit_attack(obj, ConsoleObject, &obj->pos);
do_ai_robot_hit_attack(obj, ConsoleObject, obj->pos);
} else {
return;
}
@ -2730,7 +2730,7 @@ static void ai_do_actual_firing_stuff(vobjptridx_t obj, ai_static *aip, ai_local
if (!Player_exploded && (dist_to_player < obj->size + ConsoleObject->size + F1_0*2)) { // robptr->circle_distance[Difficulty_level] + ConsoleObject->size)
if (!ai_multiplayer_awareness(obj, ROBOT_FIRE_AGITATION-2))
return;
do_ai_robot_hit_attack(obj, ConsoleObject, &obj->pos);
do_ai_robot_hit_attack(obj, ConsoleObject, obj->pos);
} else {
return;
}
@ -2824,7 +2824,7 @@ static void ai_do_actual_firing_stuff(vobjptridx_t obj, ai_static *aip, ai_local
if (!Player_exploded && (dist_to_player < obj->size + ConsoleObject->size + F1_0*2)) { // robptr->circle_distance[Difficulty_level] + ConsoleObject->size) {
if (!ai_multiplayer_awareness(obj, ROBOT_FIRE_AGITATION-2))
return;
do_ai_robot_hit_attack(obj, ConsoleObject, &obj->pos);
do_ai_robot_hit_attack(obj, ConsoleObject, obj->pos);
} else {
return;
}

View file

@ -106,7 +106,7 @@ static int check_collision_delayfunc_exec()
// -------------------------------------------------------------------------------------------------------------
// The only reason this routine is called (as of 10/12/94) is so Brain guys can open doors.
static void collide_robot_and_wall( object * robot, fix hitspeed, short hitseg, short hitwall, vms_vector * hitpt)
static void collide_robot_and_wall( object * robot, fix hitspeed, short hitseg, short hitwall, const vms_vector &)
{
const ubyte robot_id = get_robot_id(robot);
#if defined(DXX_BUILD_DESCENT_I)
@ -320,7 +320,7 @@ void bump_one_object(object *obj0, vms_vector *hit_dir, fix damage)
}
static void collide_player_and_wall(vobjptridx_t playerobj, fix hitspeed, segnum_t hitseg, short hitwall, const vms_vector *hitpt)
static void collide_player_and_wall(vobjptridx_t playerobj, fix hitspeed, segnum_t hitseg, short hitwall, const vms_vector &hitpt)
{
fix damage;
@ -349,7 +349,7 @@ static void collide_player_and_wall(vobjptridx_t playerobj, fix hitspeed, segnum
phys_apply_rot(playerobj, &force);
//make sound
digi_link_sound_to_pos( SOUND_FORCEFIELD_BOUNCE_PLAYER, hitseg, 0, *hitpt, 0, f1_0 );
digi_link_sound_to_pos( SOUND_FORCEFIELD_BOUNCE_PLAYER, hitseg, 0, hitpt, 0, f1_0 );
if (Game_mode & GM_MULTI)
multi_send_play_sound(SOUND_FORCEFIELD_BOUNCE_PLAYER, f1_0);
ForceFieldHit=1;
@ -384,7 +384,7 @@ static void collide_player_and_wall(vobjptridx_t playerobj, fix hitspeed, segnum
if ( volume > F1_0 )
volume = F1_0;
if (volume > 0 && !ForceFieldHit) { // uhhhgly hack
digi_link_sound_to_pos( SOUND_PLAYER_HIT_WALL, hitseg, 0, *hitpt, 0, volume );
digi_link_sound_to_pos( SOUND_PLAYER_HIT_WALL, hitseg, 0, hitpt, 0, volume );
if (Game_mode & GM_MULTI)
multi_send_play_sound(SOUND_PLAYER_HIT_WALL, volume);
}
@ -693,7 +693,7 @@ int check_effect_blowup(segment *seg,int side,const vms_vector &pnt, object *blo
// int Show_seg_and_side = 0;
static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t hitseg, short hitwall, vms_vector * hitpt)
static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t hitseg, short hitwall, const vms_vector &hitpt)
{
segment *seg = &Segments[hitseg];
int blew_up;
@ -723,7 +723,7 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
!(weapon->type == OBJ_WEAPON && Weapon_info[get_weapon_id(weapon)].energy_usage==0)) {
//make sound
digi_link_sound_to_pos( SOUND_FORCEFIELD_BOUNCE_WEAPON, hitseg, 0, *hitpt, 0, f1_0 );
digi_link_sound_to_pos( SOUND_FORCEFIELD_BOUNCE_WEAPON, hitseg, 0, hitpt, 0, f1_0 );
if (Game_mode & GM_MULTI)
multi_send_play_sound(SOUND_FORCEFIELD_BOUNCE_WEAPON, f1_0);
@ -753,7 +753,7 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
return;
}
blew_up = check_effect_blowup(seg,hitwall,*hitpt, weapon, 0, 0);
blew_up = check_effect_blowup(seg,hitwall, hitpt, weapon, 0, 0);
//if ((seg->sides[hitwall].tmap_num2==0) && (TmapInfo[seg->sides[hitwall].tmap_num].flags & TMI_VOLATILE)) {
@ -803,7 +803,7 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
//we've hit a volatile wall
digi_link_sound_to_pos( SOUND_VOLATILE_WALL_HIT,hitseg, 0, *hitpt, 0, F1_0 );
digi_link_sound_to_pos( SOUND_VOLATILE_WALL_HIT,hitseg, 0, hitpt, 0, F1_0 );
int vclip;
#if defined(DXX_BUILD_DESCENT_I)
@ -814,11 +814,11 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
// New by MK: If powerful badass, explode as badass, not due to lava, fixes megas being wimpy in lava.
if (wi->damage_radius >= VOLATILE_WALL_DAMAGE_RADIUS/2) {
explode_badass_weapon(weapon,*hitpt);
explode_badass_weapon(weapon, hitpt);
} else
#endif
{
object_create_badass_explosion( weapon, hitseg, *hitpt,
object_create_badass_explosion( weapon, hitseg, hitpt,
wi->impact_size + VOLATILE_WALL_IMPACT_SIZE,
vclip,
wi->strength[Difficulty_level]/4+VOLATILE_WALL_EXPL_STRENGTH, // diminished by mk on 12/08/94, i was doing 70 damage hitting lava on lvl 1.
@ -839,14 +839,14 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
// MK: 09/13/95: Badass in water is 1/2 normal intensity.
if ( Weapon_info[get_weapon_id(weapon)].matter ) {
digi_link_sound_to_pos( SOUND_MISSILE_HIT_WATER,hitseg, 0, *hitpt, 0, F1_0 );
digi_link_sound_to_pos( SOUND_MISSILE_HIT_WATER,hitseg, 0, hitpt, 0, F1_0 );
if ( Weapon_info[get_weapon_id(weapon)].damage_radius ) {
digi_link_sound_to_object(SOUND_BADASS_EXPLOSION, weapon, 0, F1_0);
// MK: 09/13/95: Badass in water is 1/2 normal intensity.
object_create_badass_explosion( weapon, hitseg, *hitpt,
object_create_badass_explosion( weapon, hitseg, hitpt,
wi->impact_size/2,
wi->robot_hit_vclip,
wi->strength[Difficulty_level]/4,
@ -858,7 +858,7 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
object_create_explosion( weapon->segnum, weapon->pos, Weapon_info[get_weapon_id(weapon)].impact_size, Weapon_info[get_weapon_id(weapon)].wall_hit_vclip );
} else {
digi_link_sound_to_pos( SOUND_LASER_HIT_WATER,hitseg, 0, *hitpt, 0, F1_0 );
digi_link_sound_to_pos( SOUND_LASER_HIT_WATER,hitseg, 0, hitpt, 0, F1_0 );
object_create_explosion( weapon->segnum, weapon->pos, Weapon_info[get_weapon_id(weapon)].impact_size, VCLIP_WATER_HIT );
}
@ -889,7 +889,7 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
#if defined(DXX_BUILD_DESCENT_I)
explode_badass_weapon(weapon, weapon->pos);
#elif defined(DXX_BUILD_DESCENT_II)
explode_badass_weapon(weapon, *hitpt);
explode_badass_weapon(weapon, hitpt);
#endif
else
object_create_explosion( weapon->segnum, weapon->pos, Weapon_info[get_weapon_id(weapon)].impact_size, Weapon_info[get_weapon_id(weapon)].wall_hit_vclip );
@ -963,7 +963,7 @@ static void collide_weapon_and_wall(vobjptridx_t weapon, fix hitspeed, segnum_t
return;
}
static void collide_debris_and_wall(vobjptridx_t debris, fix hitspeed, segnum_t hitseg, short hitwall, vms_vector * hitpt)
static void collide_debris_and_wall(vobjptridx_t debris, fix hitspeed, segnum_t hitseg, short hitwall, const vms_vector &)
{
if (!PERSISTENT_DEBRIS || TmapInfo[Segments[hitseg].sides[hitwall].tmap_num].damage)
explode_object(debris,0);
@ -971,13 +971,13 @@ static void collide_debris_and_wall(vobjptridx_t debris, fix hitspeed, segnum_t
}
// -------------------------------------------------------------------------------------------------------------------
static void collide_robot_and_robot(vobjptridx_t robot1, vobjptridx_t robot2, vms_vector *collision_point)
static void collide_robot_and_robot(vobjptridx_t robot1, vobjptridx_t robot2, const vms_vector &)
{
bump_two_objects(robot1, robot2, 1);
return;
}
static void collide_robot_and_controlcen( object * obj1, object * obj2, vms_vector *collision_point )
static void collide_robot_and_controlcen( object * obj1, object * obj2, const vms_vector &)
{
if (obj1->type == OBJ_ROBOT) {
std::swap(obj1, obj2);
@ -987,7 +987,7 @@ static void collide_robot_and_controlcen( object * obj1, object * obj2, vms_vect
bump_one_object(obj2, &hitvec, 0);
}
static void collide_robot_and_player(vobjptridx_t robot, vobjptridx_t playerobj, vms_vector *collision_point)
static void collide_robot_and_player(vobjptridx_t robot, vobjptridx_t playerobj, const vms_vector &collision_point)
{
#if defined(DXX_BUILD_DESCENT_II)
int steal_attempt = 0;
@ -1034,7 +1034,7 @@ static void collide_robot_and_player(vobjptridx_t robot, vobjptridx_t playerobj,
if (check_collision_delayfunc_exec())
{
auto collision_seg = find_point_seg(*collision_point, playerobj->segnum);
auto collision_seg = find_point_seg(collision_point, playerobj->segnum);
#if defined(DXX_BUILD_DESCENT_II)
// added this if to remove the bump sound if it's the thief.
@ -1042,10 +1042,10 @@ static void collide_robot_and_player(vobjptridx_t robot, vobjptridx_t playerobj,
// Changed by MK to make this sound unless the robot stole.
if ((!steal_attempt) && !Robot_info[get_robot_id(robot)].energy_drain)
#endif
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, playerobj->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, playerobj->segnum, 0, collision_point, 0, F1_0 );
if (collision_seg != segment_none)
object_create_explosion( collision_seg, *collision_point, Weapon_info[0].impact_size, Weapon_info[0].wall_hit_vclip );
object_create_explosion( collision_seg, collision_point, Weapon_info[0].impact_size, Weapon_info[0].wall_hit_vclip );
}
bump_two_objects(robot, playerobj, 1);
@ -1121,7 +1121,7 @@ void apply_damage_to_controlcen(vobjptridx_t controlcen, fix damage, objnum_t wh
}
}
static void collide_player_and_controlcen(vobjptridx_t controlcen, vobjptridx_t playerobj, vms_vector *collision_point)
static void collide_player_and_controlcen(vobjptridx_t controlcen, vobjptridx_t playerobj, const vms_vector &collision_point)
{
if (get_player_id(playerobj) == Player_num) {
Control_center_been_hit = 1;
@ -1129,7 +1129,7 @@ static void collide_player_and_controlcen(vobjptridx_t controlcen, vobjptridx_t
}
if (check_collision_delayfunc_exec())
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, playerobj->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, playerobj->segnum, 0, collision_point, 0, F1_0 );
bump_two_objects(controlcen, playerobj, 1);
@ -1137,7 +1137,7 @@ static void collide_player_and_controlcen(vobjptridx_t controlcen, vobjptridx_t
}
#if defined(DXX_BUILD_DESCENT_II)
static void collide_player_and_marker( vobjptridx_t marker, object * playerobj, vms_vector *collision_point )
static void collide_player_and_marker( vobjptridx_t marker, object * playerobj, const vms_vector &)
{
if (get_player_id(playerobj)==Player_num) {
int drawn;
@ -1211,7 +1211,7 @@ static void maybe_kill_weapon(object *weapon, object *other_obj)
// -- weapon->flags |= OF_SHOULD_BE_DEAD;
}
static void collide_weapon_and_controlcen(vobjptridx_t weapon, vobjptridx_t controlcen, vms_vector *collision_point)
static void collide_weapon_and_controlcen(vobjptridx_t weapon, vobjptridx_t controlcen, vms_vector &collision_point)
{
#if defined(DXX_BUILD_DESCENT_I)
@ -1250,23 +1250,23 @@ static void collide_weapon_and_controlcen(vobjptridx_t weapon, vobjptridx_t cont
if ( Weapon_info[get_weapon_id(weapon)].damage_radius )
{
vms_vector obj2weapon;
vm_vec_sub(obj2weapon, *collision_point, controlcen->pos);
vm_vec_sub(obj2weapon, collision_point, controlcen->pos);
fix mag = vm_vec_mag(obj2weapon);
if(mag < controlcen->size && mag > 0) // FVI code does not necessarily update the collision point for object2object collisions. Do that now.
{
vm_vec_scale_add(*collision_point, controlcen->pos, obj2weapon, fixdiv(controlcen->size, mag));
weapon->pos = *collision_point;
vm_vec_scale_add(collision_point, controlcen->pos, obj2weapon, fixdiv(controlcen->size, mag));
weapon->pos = collision_point;
}
#if defined(DXX_BUILD_DESCENT_I)
explode_badass_weapon(weapon, weapon->pos);
#elif defined(DXX_BUILD_DESCENT_II)
explode_badass_weapon(weapon, *collision_point);
explode_badass_weapon(weapon, collision_point);
#endif
}
else
object_create_explosion( controlcen->segnum, *collision_point, explosion_size, VCLIP_SMALL_EXPLOSION );
object_create_explosion( controlcen->segnum, collision_point, explosion_size, VCLIP_SMALL_EXPLOSION );
digi_link_sound_to_pos( SOUND_CONTROL_CENTER_HIT, controlcen->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_CONTROL_CENTER_HIT, controlcen->segnum, 0, collision_point, 0, F1_0 );
damage = fixmul(damage, weapon->ctype.laser_info.multiplier);
@ -1274,22 +1274,22 @@ static void collide_weapon_and_controlcen(vobjptridx_t weapon, vobjptridx_t cont
maybe_kill_weapon(weapon,controlcen);
} else { // If robot weapon hits control center, blow it up, make it go away, but do no damage to control center.
object_create_explosion( controlcen->segnum, *collision_point, explosion_size, VCLIP_SMALL_EXPLOSION );
object_create_explosion( controlcen->segnum, collision_point, explosion_size, VCLIP_SMALL_EXPLOSION );
maybe_kill_weapon(weapon,controlcen);
}
}
static void collide_weapon_and_clutter(object * weapon, vobjptridx_t clutter, vms_vector *collision_point)
static void collide_weapon_and_clutter(object * weapon, vobjptridx_t clutter, const vms_vector &collision_point)
{
short exp_vclip = VCLIP_SMALL_EXPLOSION;
if ( clutter->shields >= 0 )
clutter->shields -= weapon->shields;
digi_link_sound_to_pos( SOUND_LASER_HIT_CLUTTER, weapon->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_LASER_HIT_CLUTTER, weapon->segnum, 0, collision_point, 0, F1_0 );
object_create_explosion( clutter->segnum, *collision_point, ((clutter->size/3)*3)/4, exp_vclip );
object_create_explosion( clutter->segnum, collision_point, ((clutter->size/3)*3)/4, exp_vclip );
if ( (clutter->shields < 0) && !(clutter->flags&(OF_EXPLODING|OF_DESTROYED)))
explode_object(clutter,STANDARD_EXPL_DELAY);
@ -1577,7 +1577,7 @@ static int do_boss_weapon_collision(object *robot, object *weapon, vms_vector *c
#endif
// ------------------------------------------------------------------------------------------------------
static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon, vms_vector *collision_point )
static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon, vms_vector &collision_point)
{
int damage_flag=1;
#if defined(DXX_BUILD_DESCENT_II)
@ -1596,7 +1596,7 @@ static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon,
#elif defined(DXX_BUILD_DESCENT_II)
Boss_hit_time = GameTime64;
if (robptr->boss_flag >= BOSS_D2) {
damage_flag = do_boss_weapon_collision(robot, weapon, collision_point);
damage_flag = do_boss_weapon_collision(robot, weapon, &collision_point);
boss_invul_flag = !damage_flag;
}
#endif
@ -1669,12 +1669,12 @@ static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon,
if ( wi->damage_radius )
{
vms_vector obj2weapon;
vm_vec_sub(obj2weapon, *collision_point, robot->pos);
vm_vec_sub(obj2weapon, collision_point, robot->pos);
fix mag = vm_vec_mag(obj2weapon);
if(mag < robot->size && mag > 0) // FVI code does not necessarily update the collision point for object2object collisions. Do that now.
{
vm_vec_scale_add(*collision_point, robot->pos, obj2weapon, fixdiv(robot->size, mag));
weapon->pos = *collision_point;
vm_vec_scale_add(collision_point, robot->pos, obj2weapon, fixdiv(robot->size, mag));
weapon->pos = collision_point;
}
#if defined(DXX_BUILD_DESCENT_I)
explode_badass_weapon(weapon, weapon->pos);
@ -1683,7 +1683,7 @@ static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon,
//this code copied from explode_badass_weapon()
object_create_badass_explosion( weapon, weapon->segnum, *collision_point,
object_create_badass_explosion( weapon, weapon->segnum, collision_point,
wi->impact_size,
wi->robot_hit_vclip,
wi->strength[Difficulty_level],
@ -1692,7 +1692,7 @@ static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon,
}
else //normal badass explosion
explode_badass_weapon(weapon, *collision_point);
explode_badass_weapon(weapon, collision_point);
#endif
}
@ -1711,17 +1711,17 @@ static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon,
objptridx_t expl_obj = object_none;
if ( robptr->exp1_vclip_num > -1 )
expl_obj = object_create_explosion( weapon->segnum, *collision_point, (robot->size/2*3)/4, robptr->exp1_vclip_num );
expl_obj = object_create_explosion( weapon->segnum, collision_point, (robot->size/2*3)/4, robptr->exp1_vclip_num );
#if defined(DXX_BUILD_DESCENT_II)
else if ( wi->robot_hit_vclip > -1 )
expl_obj = object_create_explosion( weapon->segnum, *collision_point, wi->impact_size, wi->robot_hit_vclip );
expl_obj = object_create_explosion( weapon->segnum, collision_point, wi->impact_size, wi->robot_hit_vclip );
#endif
if (expl_obj != object_none)
obj_attach(robot,expl_obj);
if ( damage_flag && (robptr->exp1_sound_num > -1 ))
digi_link_sound_to_pos( robptr->exp1_sound_num, robot->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( robptr->exp1_sound_num, robot->segnum, 0, collision_point, 0, F1_0 );
{
fix damage = weapon->shields;
@ -1770,7 +1770,7 @@ static void collide_robot_and_weapon(vobjptridx_t robot, vobjptridx_t weapon,
return;
}
static void collide_hostage_and_player(vobjptridx_t hostage, object * player, vms_vector *collision_point)
static void collide_hostage_and_player(vobjptridx_t hostage, object * player, const vms_vector &)
{
// Give player points, etc.
if ( player == ConsoleObject ) {
@ -1789,37 +1789,13 @@ static void collide_hostage_and_player(vobjptridx_t hostage, object * player, v
return;
}
//--unused-- void collide_hostage_and_weapon( object * hostage, object * weapon, vms_vector *collision_point )
//--unused-- {
//--unused-- // Cannot kill hostages, as per Matt's edict!
//--unused-- // (A fine edict, but in contradiction to the milestone: "Robots attack hostages.")
//--unused-- hostage->shields -= weapon->shields/2;
//--unused--
//--unused-- create_awareness_event(weapon, PA_WEAPON_ROBOT_COLLISION); // object "weapon" can attract attention to player
//--unused--
//--unused-- //PLAY_SOUND_3D( SOUND_HOSTAGE_KILLED, collision_point, hostage->segnum );
//--unused-- digi_link_sound_to_pos( SOUND_HOSTAGE_KILLED, hostage->segnum , 0, collision_point, 0, F1_0 );
//--unused--
//--unused--
//--unused-- if (hostage->shields <= 0) {
//--unused-- explode_object(hostage,0);
//--unused-- hostage->flags |= OF_SHOULD_BE_DEAD;
//--unused-- }
//--unused--
//--unused-- if ( Weapon_info[weapon->id].damage_radius )
//--unused-- explode_badass_weapon(weapon);
//--unused--
//--unused-- maybe_kill_weapon(weapon,hostage);
//--unused--
//--unused-- }
static void collide_player_and_player(vobjptridx_t player1, vobjptridx_t player2, vms_vector *collision_point)
static void collide_player_and_player(vobjptridx_t player1, vobjptridx_t player2, const vms_vector &collision_point)
{
static fix64 last_player_bump[MAX_PLAYERS] = { 0, 0, 0, 0, 0, 0, 0, 0 };
int damage_flag = 1, otherpl = -1;
if (check_collision_delayfunc_exec())
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, player1->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, player1->segnum, 0, collision_point, 0, F1_0 );
// Multi is special - as always. Clients do the bump damage locally but the remote players do their collision result (change velocity) on their own. So after our initial collision, ignore further collision damage till remote players (hopefully) react.
if (Game_mode & GM_MULTI)
@ -2108,7 +2084,7 @@ void apply_damage_to_player(object *playerobj, objptridx_t killer, fix damage, u
}
}
static void collide_player_and_weapon(vobjptridx_t playerobj, vobjptridx_t weapon, vms_vector *collision_point)
static void collide_player_and_weapon(vobjptridx_t playerobj, vobjptridx_t weapon, vms_vector &collision_point)
{
fix damage = weapon->shields;
objptridx_t killer = object_none;
@ -2121,7 +2097,7 @@ static void collide_player_and_weapon(vobjptridx_t playerobj, vobjptridx_t weapo
// Don't collide own smart mines unless direct hit.
if (get_weapon_id(weapon) == SUPERPROX_ID)
if (playerobj == weapon->ctype.laser_info.parent_num)
if (vm_vec_dist_quick(*collision_point, playerobj->pos) > playerobj->size)
if (vm_vec_dist_quick(collision_point, playerobj->pos) > playerobj->size)
return;
if (get_weapon_id(weapon) == EARTHSHAKER_ID)
@ -2157,33 +2133,33 @@ static void collide_player_and_weapon(vobjptridx_t playerobj, vobjptridx_t weapo
{
if (!(Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE))
{
digi_link_sound_to_pos( SOUND_PLAYER_GOT_HIT, playerobj->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_PLAYER_GOT_HIT, playerobj->segnum, 0, collision_point, 0, F1_0 );
if (Game_mode & GM_MULTI)
multi_send_play_sound(SOUND_PLAYER_GOT_HIT, F1_0);
}
else
{
digi_link_sound_to_pos( SOUND_WEAPON_HIT_DOOR, playerobj->segnum, 0, *collision_point, 0, F1_0);
digi_link_sound_to_pos( SOUND_WEAPON_HIT_DOOR, playerobj->segnum, 0, collision_point, 0, F1_0);
if (Game_mode & GM_MULTI)
multi_send_play_sound(SOUND_WEAPON_HIT_DOOR, F1_0);
}
}
object_create_explosion( playerobj->segnum, *collision_point, i2f(10)/2, VCLIP_PLAYER_HIT );
object_create_explosion( playerobj->segnum, collision_point, i2f(10)/2, VCLIP_PLAYER_HIT );
if ( Weapon_info[get_weapon_id(weapon)].damage_radius )
{
vms_vector obj2weapon;
vm_vec_sub(obj2weapon, *collision_point, playerobj->pos);
vm_vec_sub(obj2weapon, collision_point, playerobj->pos);
fix mag = vm_vec_mag(obj2weapon);
if(mag < playerobj->size && mag > 0) // FVI code does not necessarily update the collision point for object2object collisions. Do that now.
{
vm_vec_scale_add(*collision_point, playerobj->pos, obj2weapon, fixdiv(playerobj->size, mag));
weapon->pos = *collision_point;
vm_vec_scale_add(collision_point, playerobj->pos, obj2weapon, fixdiv(playerobj->size, mag));
weapon->pos = collision_point;
}
#if defined(DXX_BUILD_DESCENT_I)
explode_badass_weapon(weapon, weapon->pos);
#elif defined(DXX_BUILD_DESCENT_II)
explode_badass_weapon(weapon, *collision_point);
explode_badass_weapon(weapon, collision_point);
#endif
}
@ -2208,11 +2184,10 @@ static void collide_player_and_weapon(vobjptridx_t playerobj, vobjptridx_t weapo
}
// Nasty robots are the ones that attack you by running into you and doing lots of damage.
void collide_player_and_nasty_robot(vobjptridx_t playerobj, vobjptridx_t robot, vms_vector *collision_point)
void collide_player_and_nasty_robot(vobjptridx_t playerobj, vobjptridx_t robot, const vms_vector &collision_point)
{
digi_link_sound_to_pos( Robot_info[get_robot_id(robot)].claw_sound, playerobj->segnum, 0, *collision_point, 0, F1_0 );
object_create_explosion( playerobj->segnum, *collision_point, i2f(10)/2, VCLIP_PLAYER_HIT );
digi_link_sound_to_pos( Robot_info[get_robot_id(robot)].claw_sound, playerobj->segnum, 0, collision_point, 0, F1_0 );
object_create_explosion( playerobj->segnum, collision_point, i2f(10)/2, VCLIP_PLAYER_HIT );
bump_two_objects(playerobj, robot, 0); //no damage from bump
@ -2287,7 +2262,7 @@ void collide_robot_and_materialization_center(vobjptridx_t objp)
}
void collide_player_and_powerup(object * playerobj, vobjptridx_t powerup, vms_vector *collision_point)
void collide_player_and_powerup(object * playerobj, vobjptridx_t powerup, const vms_vector &)
{
if (!Endlevel_sequence && !Player_is_dead && (get_player_id(playerobj) == Player_num )) {
int powerup_used;
@ -2319,17 +2294,17 @@ void collide_player_and_powerup(object * playerobj, vobjptridx_t powerup, vms_ve
return;
}
static void collide_player_and_clutter(vobjptridx_t playerobj, vobjptridx_t clutter, vms_vector *collision_point)
static void collide_player_and_clutter(vobjptridx_t playerobj, vobjptridx_t clutter, const vms_vector &collision_point)
{
if (check_collision_delayfunc_exec())
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, playerobj->segnum, 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_ROBOT_HIT_PLAYER, playerobj->segnum, 0, collision_point, 0, F1_0 );
bump_two_objects(clutter, playerobj, 1);
return;
}
// See if weapon1 creates a badass explosion. If so, create the explosion
// Return true if weapon does proximity (as opposed to only contact) damage when it explodes.
int maybe_detonate_weapon(vobjptridx_t weapon1, object *weapon2, vms_vector *collision_point)
int maybe_detonate_weapon(vobjptridx_t weapon1, object *weapon2, const vms_vector &collision_point)
{
if ( Weapon_info[get_weapon_id(weapon1)].damage_radius ) {
fix dist;
@ -2341,9 +2316,9 @@ int maybe_detonate_weapon(vobjptridx_t weapon1, object *weapon2, vms_vector *col
#if defined(DXX_BUILD_DESCENT_I)
explode_badass_weapon(weapon1, weapon1->pos);
#elif defined(DXX_BUILD_DESCENT_II)
explode_badass_weapon(weapon1, *collision_point);
explode_badass_weapon(weapon1, collision_point);
#endif
digi_link_sound_to_pos( Weapon_info[get_weapon_id(weapon1)].robot_hit_sound, weapon1->segnum , 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( Weapon_info[get_weapon_id(weapon1)].robot_hit_sound, weapon1->segnum , 0, collision_point, 0, F1_0 );
}
return 1;
} else {
@ -2354,7 +2329,7 @@ int maybe_detonate_weapon(vobjptridx_t weapon1, object *weapon2, vms_vector *col
return 0;
}
static void collide_weapon_and_weapon(vobjptridx_t weapon1, vobjptridx_t weapon2, vms_vector *collision_point)
static void collide_weapon_and_weapon(vobjptridx_t weapon1, vobjptridx_t weapon2, const vms_vector &collision_point)
{
#if defined(DXX_BUILD_DESCENT_II)
// -- Does this look buggy??: if (weapon1->id == PMINE_ID && weapon1->id == PMINE_ID)
@ -2399,7 +2374,7 @@ static void collide_weapon_and_weapon(vobjptridx_t weapon1, vobjptridx_t weapon2
}
static void collide_weapon_and_debris(vobjptridx_t weapon, vobjptridx_t debris, vms_vector *collision_point)
static void collide_weapon_and_debris(vobjptridx_t weapon, vobjptridx_t debris, const vms_vector &collision_point)
{
#if defined(DXX_BUILD_DESCENT_II)
// Hack! Prevent debris from causing bombs spewed at player death to detonate!
@ -2409,11 +2384,11 @@ static void collide_weapon_and_debris(vobjptridx_t weapon, vobjptridx_t debris,
}
#endif
if ( (weapon->ctype.laser_info.parent_type==OBJ_PLAYER) && !(debris->flags & OF_EXPLODING) ) {
digi_link_sound_to_pos( SOUND_ROBOT_HIT, weapon->segnum , 0, *collision_point, 0, F1_0 );
digi_link_sound_to_pos( SOUND_ROBOT_HIT, weapon->segnum , 0, collision_point, 0, F1_0 );
explode_object(debris,0);
if ( Weapon_info[get_weapon_id(weapon)].damage_radius )
explode_badass_weapon(weapon, *collision_point);
explode_badass_weapon(weapon, collision_point);
maybe_kill_weapon(weapon,debris);
if (!(weapon->mtype.phys_info.flags & PF_PERSISTENT))
weapon->flags |= OF_SHOULD_BE_DEAD;
@ -2494,14 +2469,14 @@ static void collide_weapon_and_debris(vobjptridx_t weapon, vobjptridx_t debris,
#define DO_COLLISION(type1,type2,collision_function) \
case COLLISION_OF( (type1), (type2) ): \
collision_function( (A), (B), &collision_point ); \
collision_function( (A), (B), collision_point ); \
break; \
case COLLISION_OF( (type2), (type1) ): \
collision_function( (B), (A), &collision_point ); \
collision_function( (B), (A), collision_point ); \
break;
#define DO_SAME_COLLISION(type1,collision_function) \
case COLLISION_OF( (type1), (type1) ): \
collision_function( (A), (B), &collision_point ); \
collision_function( (A), (B), collision_point ); \
break;
//these next two macros define a case that does nothing
@ -2641,7 +2616,7 @@ const collision_outer_array_t CollisionResult = collide_init(make_tree_index_seq
ENABLE_COLLISION( OBJ_DEBRIS, OBJ_WALL );
void collide_object_with_wall(vobjptridx_t A, fix hitspeed, segnum_t hitseg, short hitwall, vms_vector * hitpt)
void collide_object_with_wall(vobjptridx_t A, fix hitspeed, segnum_t hitseg, short hitwall, const vms_vector &hitpt)
{
switch( A->type ) {

View file

@ -1614,7 +1614,7 @@ static void powerup_grab_cheat(object *player, vobjptridx_t powerup)
vms_vector collision_point;
vm_vec_avg(collision_point, powerup->pos, player->pos);
collide_player_and_powerup(player, powerup, &collision_point);
collide_player_and_powerup(player, powerup, collision_point);
}
}

View file

@ -558,7 +558,7 @@ void do_physics_sim(vobjptridx_t obj)
wall_part = vm_vec_dot(moved_v,hit_info.hit_wallnorm);
if ((wall_part != 0 && moved_time>0 && (hit_speed=-fixdiv(wall_part,moved_time))>0) || obj->type == OBJ_WEAPON || obj->type == OBJ_DEBRIS)
collide_object_with_wall( obj, hit_speed, WallHitSeg, WallHitSide, &hit_info.hit_pnt );
collide_object_with_wall( obj, hit_speed, WallHitSeg, WallHitSide, hit_info.hit_pnt );
if (obj->type == OBJ_PLAYER)
scrape_player_on_wall(obj, WallHitSeg, WallHitSide, hit_info.hit_pnt );