31 #define VIRTUAL_FRAME_HALF_WIDTH 320.0f
32 #define VIRTUAL_FRAME_HALF_HEIGHT 240.0f
37 static float Lock_start_dist;
70 #define LOCK_GAUGE_BLINK_RATE 5 // blinks/sec
83 {
"lock1_fs1",
"2_lock1_fs1" },
84 {
"lock1",
"2_lock1" }
89 {
"lockspin_fs1",
"2_lockspin_fs1" },
90 {
"lockspin",
"2_lockspin" }
173 int target_objnum, sx, sy;
178 bool reset_timers =
false;
199 Assert(target_objnum != -1);
200 targetp = &
Objects[target_objnum];
240 if ( reset_timers ) {
249 if ( reset_timers ) {
312 float dist_to_target, weapon_range;
316 int target_in_range=1;
336 weapon_range *= 0.8f;
339 if (dist_to_target > weapon_range) {
343 return target_in_range;
349 vec3d target_world_pos, vec_to_target;
367 target_world_pos = targetp->
pos;
634 #define ROTATE_DELAY 40
637 static float ang = 0.0f;
639 float end_ang = ang +
PI2;
640 float x3,y3,x4,y4,xpos,ypos;
647 for (; ang <= end_ang; ang +=
PI_2) {
663 hud_tri(x3, y3, xpos, ypos, x4, y4);
715 static float pixels_moved_while_locking;
716 static float pixels_moved_while_degrading;
717 static int Need_new_start_pos = 0;
719 static double accumulated_x_pixels, accumulated_y_pixels;
722 static float last_dist_to_target;
724 static int catching_up;
726 static int maintain_lock_count = 0;
728 static float catch_up_distance = 0.0f;
730 double hypotenuse, delta_x, delta_y;
738 last_dist_to_target = 0.0f;
748 Need_new_start_pos = 1;
759 if (!delta_y && !delta_x) {
763 hypotenuse =
_hypot(delta_y, delta_x);
768 if (last_dist_to_target == 0) {
796 float lock_pixels_per_sec;
810 pixels_moved_while_locking = lock_pixels_per_sec * frametime;
813 if ((delta_x != 0) && (hypotenuse != 0)) {
814 accumulated_x_pixels += pixels_moved_while_locking * delta_x/hypotenuse;
817 if ((delta_y != 0) && (hypotenuse != 0)) {
818 accumulated_y_pixels += pixels_moved_while_locking * delta_y/hypotenuse;
821 if (
fl_abs((
float)accumulated_x_pixels) > 1.0
f) {
822 modf(accumulated_x_pixels, &int_portion);
829 accumulated_x_pixels -= int_portion;
832 if (
fl_abs((
float)accumulated_y_pixels) > 1.0f) {
833 modf(accumulated_y_pixels, &int_portion);
840 accumulated_y_pixels -= int_portion;
856 if (maintain_lock_count++ > 1) {
860 maintain_lock_count = 0;
878 last_dist_to_target = 0.0f;
880 if (Need_new_start_pos) {
882 Need_new_start_pos = 0;
883 accumulated_x_pixels = 0.0f;
884 accumulated_y_pixels = 0.0f;
890 if (!delta_y && !delta_x) {
894 hypotenuse =
_hypot(delta_y, delta_x);
904 if ((delta_x != 0) && (hypotenuse != 0))
905 accumulated_x_pixels += pixels_moved_while_degrading * delta_x/hypotenuse;
907 if ((delta_y != 0) && (hypotenuse != 0))
908 accumulated_y_pixels += pixels_moved_while_degrading * delta_y/hypotenuse;
910 if (
fl_abs((
float)accumulated_x_pixels) > 1.0
f) {
911 modf(accumulated_x_pixels, &int_portion);
918 accumulated_x_pixels -= int_portion;
921 if (
fl_abs((
float)accumulated_y_pixels) > 1.0f) {
922 modf(accumulated_y_pixels, &int_portion);
929 accumulated_y_pixels -= int_portion;
947 double target_mag, target_x, target_y;
952 if ( (delta_x == 0.0) && (delta_y == 0.0) ) {
958 hypotenuse =
_hypot(delta_y, delta_x);
960 if (hypotenuse >= Lock_start_dist) {
966 target_mag = Lock_start_dist - hypotenuse;
967 target_x = target_mag * (delta_x / hypotenuse);
968 target_y = target_mag * (delta_y / hypotenuse);
998 lock_world_pos = target_objp->
pos;
1008 ship *target_shipp=NULL;
1009 int lock_in_range=0;
1010 float best_lock_dot=-1.0f, lock_dot=-1.0f;
1012 vec3d subsys_world_pos, vec_to_lock;
1029 lock_world_pos = target_objp->
pos;
1035 if ( lock_in_range ) {
1039 if ( best_lock_dot > 0.95 ) {
1053 if ( lock_dot > best_lock_dot ) {
1054 best_lock_dot=lock_dot;
1058 lock_world_pos = subsys_world_pos;
1075 lock_world_pos = target_objp->
pos;
1085 object *target_objp;
1089 vec3d vec_to_lock_pos;
1090 vec3d lock_local_pos;
1134 if ( lock_local_pos.
xyz.z > 0.0f ) {
1136 float w = 1.0f / lock_local_pos.
xyz.z;
virtual void initialize()
int timestamp(int delta_ms)
struct screen3d::@234::@236 xyw
model_subsystem * system_info
int Lock_gauge_half_w[NUM_HUD_RETICLE_STYLES][GR_NUM_RESOLUTIONS]
GLfloat GLfloat GLfloat GLfloat h
#define MISSION_FLAG_FULLNEB
int obj_team(object *objp)
weapon_info Weapon_info[MAX_WEAPON_TYPES]
char Lock_fname[NUM_HUD_RETICLE_STYLES][GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
SCP_vector< game_snd > Snds
float vm_vec_mag(const vec3d *v)
#define WIF_LOCKED_HOMING
float lock_time_to_target
void hud_stop_looped_locking_sounds()
int hud_anim_render(hud_anim *ha, float frametime, int draw_alpha, int loop, int hold_last, int reverse, int resize_mode, bool mirror)
Render out a frame of the targetbox static animation, based on how much time has elapsed.
int Lock_gauge_draw_stamp
#define GR_NUM_RESOLUTIONS
#define NETINFO_FLAG_OBSERVER
int hud_lock_secondary_weapon_changed(ship_weapon *swp)
struct vec3d::@225::@227 xyz
#define VIRTUAL_FRAME_HALF_HEIGHT
int ship_subsystem_in_sight(object *objp, ship_subsys *subsys, vec3d *eye_pos, vec3d *subsys_pos, int do_facing_check, float *dot_out, vec3d *vec_out)
int snd_is_playing(int sig)
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
#define END_OF_LIST(head)
ship_subsys * targeted_subsys
#define HUD_LEAD_INDICATOR
int hud_lock_world_pos_in_range(vec3d *target_world_pos, vec3d *vec_to_target)
void gr_set_screen_scale(int w, int h, int zoom_w, int zoom_h, int max_w, int max_h, int center_w, int center_h, bool force_stretch)
void hud_calculate_lock_start_pos()
int current_secondary_bank
void initBitmaps(char *lock_gauge_fname, char *lock_anim_fname)
Missle tracking to acquire a lock (looped)
char Lockspin_fname[NUM_HUD_RETICLE_STYLES][GR_NUM_RESOLUTIONS][MAX_FILENAME_LEN]
#define CLAMP(x, min, max)
int ship_secondary_bank_has_ammo(int shipnum)
#define VIRTUAL_FRAME_HALF_WIDTH
float lock_dist_to_target
int Lockspin_half_h[NUM_HUD_RETICLE_STYLES][GR_NUM_RESOLUTIONS]
player Players[MAX_PLAYERS]
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
#define MAX_SHIP_SECONDARY_BANKS
void initTriHeight(float h)
void vm_vec_add2(vec3d *dest, const vec3d *src)
float Lock_triangle_height
struct matrix::@228::@230 vec
void renderLockTrianglesOld(int center_x, int center_y, int radius)
int Lock_target_box_width
void initTargetBoxSize(int w, int h)
int ship_get_sound(object *objp, GameSoundsIndex id)
Returns a ship-specific sound index.
void hud_lock_reset(float lock_time_scale)
ubyte g3_rotate_vertex(vertex *dest, const vec3d *src)
int snd_play(game_snd *gs, float pan, float vol_scale, int priority, bool is_voice_msg)
void initLoopLockedAnim(bool loop)
int secondary_bank_weapons[MAX_SHIP_SECONDARY_BANKS]
float vm_vec_normalized_dir(vec3d *dest, const vec3d *end, const vec3d *start)
#define LOCK_GAUGE_BLINK_RATE
void hud_calculate_lock_position(float frametime)
int hud_lock_has_homing_point()
void renderLockTriangles(int center_x, int center_y, float frametime)
int g3_project_vertex(vertex *point)
vec3d * vm_vec_unrotate(vec3d *dest, const vec3d *src, const matrix *m)
int iff_x_attacks_y(int team_x, int team_y)
object Objects[MAX_OBJECTS]
void render(float frametime)
void hud_lock_get_new_lock_pos(object *target_objp)
int catchup_pixels_per_sec
int catchup_pixel_penalty
int lock_indicator_start_y
void hud_anim_init(hud_anim *ha, int sx, int sy, const char *filename)
Initialise the members of the hud_anim struct to default values.
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
void hud_do_lock_indicator(float frametime)
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
int Lock_gauge_half_h[GR_NUM_RESOLUTIONS]
void initSpinHalfSize(int w, int h)
GLubyte GLubyte GLubyte GLubyte w
void bm_page_in_aabitmap(int bitmapnum, int nframes)
Marks a texture as being used for this level, and is anti-aliased.
float Lock_triangle_base[GR_NUM_RESOLUTIONS]
int Lockspin_half_w[NUM_HUD_RETICLE_STYLES][GR_NUM_RESOLUTIONS]
int snd_play_looping(game_snd *gs, float pan, int start_loop, int stop_loop, float vol_scale, int scriptingUpdateVolume)
ship_subsys * ship_get_closest_subsys_in_sight(ship *sp, int subsys_type, vec3d *attacker_pos)
int hud_lock_target_in_range()
int hud_lock_on_subsys_ok()
ship_subsys * locking_subsys
An overhauled/updated debug console to allow monitoring, testing, and general debugging of new featur...
SCP_vector< ship_info > Ship_info
void hud_lock_update_lock_pos(object *target_objp)
void gr_reset_screen_scale()
int hud_anim_load(hud_anim *ha)
Load a hud_anim.
#define timestamp_elapsed(stamp)
int lock_indicator_visible
vec3d * get_subsystem_world_pos(object *parent_obj, ship_subsys *subsys, vec3d *world_pos)
DCF_BOOL(nebula_sec_range, Nebula_sec_range)
void hud_lock_check_if_target_in_lock_cone()
bool gr_unsize_screen_pos(int *x, int *y, int *w, int *h, int resize_mode)
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
void initGaugeHalfSize(int w, int h)
GLenum GLuint GLenum GLsizei length
int Lock_target_box_width[GR_NUM_RESOLUTIONS]
void hud_lock_determine_lock_point(vec3d *lock_world_pos_out)
void hud_init_missile_lock()
#define WIF_HOMING_JAVELIN
void hud_tri(float x1, float y1, float x2, float y2, float x3, float y3)
int Lock_target_box_height[GR_NUM_RESOLUTIONS]
float Lock_triangle_height[GR_NUM_RESOLUTIONS]
void hud_set_iff_color(object *objp, int is_bright)
Will set the color to the IFF color based on the team.
int lock_indicator_start_x
int locking_subsys_parent
#define SF2_NO_SECONDARY_LOCKON
Missle lock (non-looping)
int current_target_is_locked
int Lock_target_box_height
#define g3_start_frame(zbuffer_flag)
float vm_vec_normalize(vec3d *v)
void initTriBase(float length)
#define NUM_HUD_RETICLE_STYLES