diff --git a/common/include/vecmat.h b/common/include/vecmat.h index 4c1cd17eb..46ea10445 100644 --- a/common/include/vecmat.h +++ b/common/include/vecmat.h @@ -149,7 +149,7 @@ vms_vector &vm_vec_scale_add2 (vms_vector &dest, const vms_vector &src, fix k); //dest *= n/d vms_vector &vm_vec_scale2 (vms_vector &dest, fix n, fix d); - +fix64 vm_vec_mag2 (const vms_vector &v) __attribute_warn_unused_result; //returns magnitude of a vector fix vm_vec_mag (const vms_vector &v) __attribute_warn_unused_result; diff --git a/common/main/laser.h b/common/main/laser.h index 9611e9430..eb232f206 100644 --- a/common/main/laser.h +++ b/common/main/laser.h @@ -157,7 +157,6 @@ enum laser_level_t // Constants governing homing missile behavior. #define HOMING_MAX_TRACKABLE_DOT (3*F1_0/4) // was (7*F1_0/8) in original Descent 2 #define HOMING_MIN_TRACKABLE_DOT (3*(F1_0 - HOMING_MAX_TRACKABLE_DOT)/4 + HOMING_MAX_TRACKABLE_DOT) -#define HOMING_MAX_TRACKABLE_DIST (F1_0*250) #define HOMING_FLY_STRAIGHT_TIME (F1_0/8) #define HOMING_TURN_TIME (DESIGNATED_GAME_FRAMETIME) diff --git a/common/maths/vecmat.cpp b/common/maths/vecmat.cpp index 9de14a742..d0dc1539b 100644 --- a/common/maths/vecmat.cpp +++ b/common/maths/vecmat.cpp @@ -189,13 +189,20 @@ static fix vm_vec_dot3(fix x,fix y,fix z,const vms_vector &v) } //returns magnitude of a vector -fix vm_vec_mag(const vms_vector &v) +fix64 vm_vec_mag2(const vms_vector &v) { quadint q; q.q = 0; fixmulaccum(&q,v.x,v.x); fixmulaccum(&q,v.y,v.y); fixmulaccum(&q,v.z,v.z); + return q.q; +} + +fix vm_vec_mag(const vms_vector &v) +{ + quadint q; + q.q = vm_vec_mag2(v); return quad_sqrt(q); } diff --git a/similar/main/laser.cpp b/similar/main/laser.cpp index 9d7a86add..91bd139e8 100644 --- a/similar/main/laser.cpp +++ b/similar/main/laser.cpp @@ -314,7 +314,7 @@ static objptridx_t create_weapon_object(int weapon_type,segnum_t segnum,vms_vect // If you want the Omega Cannon view cone to be different than the Homing Missile viewcone, contact MK to make the change. // (Unless you are a programmer, in which case, do it yourself!) #define OMEGA_MIN_TRACKABLE_DOT (15*F1_0/16) // Larger values mean narrower cone. F1_0 means damn near impossible. 0 means 180 degree field of view. -#define OMEGA_MAX_TRACKABLE_DIST MAX_OMEGA_DIST // An object must be at least this close to be tracked. +static const fix64 OMEGA_MAX_TRACKABLE_DIST = MAX_OMEGA_DIST; // An object must be at least this close to be tracked. // Note, you don't need to change these constants. You can control damage and energy consumption by changing the // usual bitmaps.tbl parameters. @@ -1085,12 +1085,13 @@ objptridx_t find_homing_object_complete(vms_vector *curpos, vobjptridx_t tracker throw std::logic_error("tracking without homing_flag"); } - fix max_trackable_dist = HOMING_MAX_TRACKABLE_DIST; + const fix64 HOMING_MAX_TRACKABLE_DIST = F1_0*250; + fix64 max_trackable_dist = HOMING_MAX_TRACKABLE_DIST * HOMING_MAX_TRACKABLE_DIST; fix min_trackable_dot = HOMING_MAX_TRACKABLE_DOT; #if defined(DXX_BUILD_DESCENT_II) if (tracker->id == OMEGA_ID) { - max_trackable_dist = OMEGA_MAX_TRACKABLE_DIST; + max_trackable_dist = OMEGA_MAX_TRACKABLE_DIST * OMEGA_MAX_TRACKABLE_DIST; min_trackable_dot = OMEGA_MIN_TRACKABLE_DOT; } #endif @@ -1098,7 +1099,7 @@ objptridx_t find_homing_object_complete(vms_vector *curpos, vobjptridx_t tracker objptridx_t best_objnum = object_none; for (objnum_t objnum=object_first; objnum<=Highest_object_index; objnum++) { int is_proximity = 0; - fix dot, dist; + fix dot; vms_vector vec_to_curobj; auto curobjp = vobjptridx(objnum); @@ -1142,7 +1143,7 @@ objptridx_t find_homing_object_complete(vms_vector *curpos, vobjptridx_t tracker } vm_vec_sub(vec_to_curobj, curobjp->pos, *curpos); - dist = vm_vec_mag(vec_to_curobj); + auto dist = vm_vec_mag2(vec_to_curobj); if (dist < max_trackable_dist) { vm_vec_normalize(vec_to_curobj);