diff --git a/code/weapon/weapon.h b/code/weapon/weapon.h index 40b3cda929b..fa5bb4ae376 100644 --- a/code/weapon/weapon.h +++ b/code/weapon/weapon.h @@ -346,6 +346,7 @@ float weapon_get_lifetime_pct(const weapon& wp); float weapon_get_age(const weapon& wp); float weapon_get_viewing_angle(const weapon& wp); float weapon_get_apparent_size(const weapon& wp); +float weapon_get_target_dot(const weapon& wp); float beam_get_warmup_lifetime_pct(const beam& wp); float beam_get_warmdown_lifetime_pct(const beam& wp); @@ -798,7 +799,8 @@ struct weapon_info >{}}, std::pair {"Parent Radius", modular_curves_submember_input<&weapon::objnum, &Objects, &object::parent, &Objects, &object::radius>{}}, std::pair {"Viewing Angle", modular_curves_functional_input{}}, - std::pair {"Apparent Size", modular_curves_functional_input{}} + std::pair {"Apparent Size", modular_curves_functional_input{}}, + std::pair {"Dot To Target", modular_curves_functional_input{}} ); public: diff --git a/code/weapon/weapons.cpp b/code/weapon/weapons.cpp index ef2d2f344bf..95c0b77f607 100644 --- a/code/weapon/weapons.cpp +++ b/code/weapon/weapons.cpp @@ -10283,4 +10283,25 @@ float weapon_get_apparent_size(const weapon& wp) { wep_objp->radius * 2.0f, g3_get_hfov(Eye_fov), gr_screen.max_w) / i2fl(gr_screen.max_w); +} + +float weapon_get_target_dot(const weapon& wp) { + object* wep_objp = &Objects[wp.objnum]; + + vec3d target_pos; + + if(wp.homing_object != &obj_used_list && (wp.homing_object->type != 0)) + { + if (!IS_VEC_NULL(&wp.homing_pos)) { + target_pos = wp.homing_pos; + } + } else if(wp.target_num > -1) + { + target_pos = Objects[wp.target_num].pos; + } else { + return 0.f; + } + vec3d dir; + vm_vec_sub(&dir, &wep_objp->pos, &target_pos); + return vm_vec_dot(&dir, &wep_objp->orient.vec.fvec); } \ No newline at end of file