2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/Hud/HUDreticle.cpp $
15 * C module to draw and manage the recticle
18 * Revision 1.6 2003/05/25 02:30:42 taylor
21 * Revision 1.5 2003/05/22 15:58:44 taylor
22 * fix missed German build option for auto-lang
24 * Revision 1.4 2002/06/17 06:33:09 relnev
25 * ryan's struct patch for gcc 2.95
27 * Revision 1.3 2002/06/09 04:41:21 relnev
28 * added copyright header
30 * Revision 1.2 2002/05/07 03:16:45 theoddone33
31 * The Great Newline Fix
33 * Revision 1.1.1.1 2002/05/03 03:28:09 root
37 * 14 10/27/99 10:04p Jefff
38 * changed german match speed indicator
40 * 13 10/14/99 2:50p Jefff
43 * 12 8/28/99 4:54p Dave
44 * Fixed directives display for multiplayer clients for wings with
45 * multiple waves. Fixed hud threat indicator rendering color.
47 * 11 8/09/99 3:14p Dave
48 * Make "launch" warning gauge draw in code.
50 * 10 6/10/99 3:43p Dave
51 * Do a better job of syncing text colors to HUD gauges.
53 * 9 6/08/99 10:48a Jasenw
54 * new coords for new HUD stuff
56 * 8 6/03/99 2:31p Jasenw
57 * changed coords and removed weapon indicators.
59 * 7 1/07/99 2:21p Jasen
62 * 6 1/07/99 9:07a Jasen
65 * 5 12/28/98 3:17p Dave
66 * Support for multiple hud bitmap filenames for hi-res mode.
68 * 4 12/21/98 5:02p Dave
69 * Modified all hud elements to be multi-resolution friendly.
71 * 3 11/05/98 4:18p Dave
72 * First run nebula support. Beefed up localization a bit. Removed all
73 * conditional compiles for foreign versions. Modified mission file
76 * 2 10/07/98 10:53a Dave
79 * 1 10/07/98 10:49a Dave
81 * 69 8/28/98 3:28p Dave
82 * EMP effect done. AI effects may need some tweaking as required.
84 * 68 8/25/98 1:48p Dave
85 * First rev of EMP effect. Player side stuff basically done. Next comes
88 * 67 6/12/98 4:52p Hoffoss
89 * Added support for special characters in in forgeign languages.
91 * 66 6/09/98 5:17p Lawrance
92 * French/German localization
94 * 65 6/09/98 10:31a Hoffoss
95 * Created index numbers for all xstr() references. Any new xstr() stuff
96 * added from here on out should be added to the end if the list. The
97 * current list count can be found in FreeSpace.cpp (search for
100 * 64 5/21/98 7:18p Lawrance
101 * Don't flash 'launch' for attempted lock
103 * 63 5/13/98 1:53p Lawrance
104 * If no secondary banks on a ship, show correct reticle gauge
106 * 62 5/06/98 8:05p Dave
107 * Made standalone reset properly under weird conditions. Tweak
108 * optionsmulti screen. Upped MAX_WEAPONS to 350. Put in new launch
109 * countdown anim. Minro ui fixes/tweaks.
111 * 61 5/05/98 5:51p Lawrance
112 * Draw HUD center crosshair with bright alpha index
114 * 60 5/04/98 6:12p Lawrance
115 * fix progblems with weapon gauges in situation when weapons are on ship
117 * 59 5/01/98 4:22p Lawrance
118 * Use ship->weapons instead of sip when displaying weapon linking gauge
120 * 58 4/13/98 11:19a Lawrance
121 * fix launch threat indicator
123 * 57 4/08/98 10:34p Allender
124 * make threat indicators work in multiplayer. Fix socket problem (once
127 * 56 3/26/98 5:26p John
128 * added new paging code. nonfunctional.
130 * 55 2/23/98 6:49p Lawrance
131 * Use gr_aabitmap_ex() instead of clipping regions
133 * 54 2/22/98 4:17p John
134 * More string externalization classification... 190 left to go!
136 * 53 2/22/98 12:19p John
137 * Externalized some strings
139 * 52 2/12/98 4:58p Lawrance
140 * Change to new flashing method.
142 * 51 2/09/98 9:07p Lawrance
143 * Ensure 'evaded' popup has precedence over 'launch' popup
145 * 50 1/25/98 10:31p Lawrance
146 * Don't draw most hud gauges when viewing from another ship.
148 * 49 1/19/98 11:37p Lawrance
149 * Fixing Optimization build warnings
151 * 48 1/14/98 10:21a Lawrance
152 * Draw reticle correctly when gauges are disabled.
154 * 47 1/08/98 3:20p Johnson
155 * ALAN: Ensure entire throttle gauge flashes
157 * 46 1/05/98 9:38p Lawrance
158 * Implement flashing HUD gauges.
160 * 45 1/02/98 9:10p Lawrance
161 * Big changes to how colors get set on the HUD.
163 * 44 12/16/97 9:13p Lawrance
164 * Integrate new gauges into HUD config.
166 * 43 12/10/97 10:02p Lawrance
167 * Change weapon linking to use flags.
169 * 42 12/08/97 1:49p Lawrance
170 * only play threat lock sound when a lock is being attempted
172 * 41 11/17/97 6:37p Lawrance
173 * new gauges: extended target view, new lock triangles, support ship view
175 * 40 11/11/97 10:25p Lawrance
176 * add sound hook for when missile threat flashes
178 * 39 11/11/97 5:05p Lawrance
179 * get threat indicator working more reliably
181 * 38 11/05/97 11:20p Lawrance
182 * add speed numbers to the reticle
184 * 37 11/04/97 7:49p Lawrance
185 * integrating new HUD reticle and shield icons
187 * 36 11/03/97 5:38p Dave
188 * Cleaned up more multiplayer sequencing. Added OBJ_OBSERVER module/type.
189 * Restructured HUD_config structs/flags.
197 #include "hudreticle.h"
202 #include "freespace.h"
209 #include "hudtargetbox.h"
212 #include "localize.h"
214 static int Reticle_inited = 0;
217 #define NUM_RETICLE_ANIS 11
219 #define NUM_RETICLE_ANIS 6 // keep up to date when modifying the number of reticle ani files
222 #define RETICLE_TOP_ARC 0
223 #define RETICLE_LASER_WARN 1
224 #define RETICLE_LOCK_WARN 2
225 #define RETICLE_LEFT_ARC 3
226 #define RETICLE_RIGHT_ARC 4
228 #define RETICLE_ONE_PRIMARY 5
229 #define RETICLE_TWO_PRIMARY 6
230 #define RETICLE_ONE_SECONDARY 7
231 #define RETICLE_TWO_SECONDARY 8
232 #define RETICLE_THREE_SECONDARY 9
233 #define RETICLE_CENTER 10
234 // #define RETICLE_LAUNCH_LABEL 11
236 #define RETICLE_CENTER 5
239 int Hud_throttle_frame_h[GR_NUM_RESOLUTIONS] = {
243 int Hud_throttle_frame_w[GR_NUM_RESOLUTIONS] = {
247 int Hud_throttle_frame_bottom_y[GR_NUM_RESOLUTIONS] = {
255 int Hud_throttle_h[GR_NUM_RESOLUTIONS] = {
263 int Hud_throttle_bottom_y[GR_NUM_RESOLUTIONS] = {
271 int Hud_throttle_aburn_h[GR_NUM_RESOLUTIONS] = {
275 int Hud_throttle_aburn_button[GR_NUM_RESOLUTIONS] = {
280 int Outer_circle_radius[GR_NUM_RESOLUTIONS] = {
285 int Hud_reticle_center[GR_NUM_RESOLUTIONS][2] = {
294 char Reticle_frame_names[GR_NUM_RESOLUTIONS][NUM_RETICLE_ANIS][MAX_FILENAME_LEN] =
339 // reticle frame coords
340 int Reticle_frame_coords[GR_NUM_RESOLUTIONS][NUM_RETICLE_ANIS][2] = {
343 {241, 139}, // toparc1
344 {300, 139}, // toparc2
345 {320, 139}, // toparc3
346 {220, 246}, // leftarc
347 {374, 244}, // rightarc1
348 {406, 255}, // rightarc2
349 {406, 255}, // rightarc3
350 {391, 278}, // rightarc4
351 {391, 278}, // rightarc5
352 {391, 278}, // rightarc6
353 // {297, 162}, // toparc4
354 {308, 233} // reticle1
356 {241, 137}, // toparc1
357 {400, 245}, // toparc2
358 {394, 261}, // toparc3
359 {216, 168}, // leftarc
360 {359, 168}, // rightarc1
361 {308, 235} // reticle1
382 // "launch" gauge coords
383 int Reticle_launch_coords[GR_NUM_RESOLUTIONS][2] = {
392 hud_frames Reticle_gauges[NUM_RETICLE_ANIS];
394 #define THREAT_DUMBFIRE (1<<0)
395 #define THREAT_ATTEMPT_LOCK (1<<1)
396 #define THREAT_LOCK (1<<2)
398 #define THREAT_UPDATE_DUMBFIRE_TIME 1000 // time between checking for dumbfire threats
399 #define THREAT_UPDATE_LOCK_TIME 500 // time between checking for lock threats
401 #define THREAT_DUMBFIRE_FLASH 180
402 #define THREAT_LOCK_FLASH 180
403 static int Threat_dumbfire_timer; // timestamp for when to show next flashing frame for dumbfire threat
404 static int Threat_lock_timer; // timestamp for when to show next flashing frame for lock threat
406 static int Threat_dumbfire_frame; // frame offset of current dumbfire flashing warning
407 static int Threat_lock_frame; // frame offset of current lock flashing warning
410 static int Max_speed_coords[GR_NUM_RESOLUTIONS][2] =
419 static int Zero_speed_coords[GR_NUM_RESOLUTIONS][2] = {
428 // Called at the start of each level.. use Reticle_inited so we only load frames once
429 void hud_init_reticle()
434 Threat_dumbfire_timer = timestamp(0);
435 Threat_lock_timer = timestamp(0);
436 Threat_dumbfire_frame = 1;
437 Threat_lock_frame = 1;
438 Player->threat_flags = 0;
439 Player->update_dumbfire_time = timestamp(0);
440 Player->update_lock_time = timestamp(0);
442 if ( Reticle_inited ) {
446 for ( i = 0; i < NUM_RETICLE_ANIS; i++ ) {
447 hfp = &Reticle_gauges[i];
448 hfp->first_frame = bm_load_animation(Reticle_frame_names[gr_screen.res][i], &hfp->num_frames);
449 if ( hfp->first_frame < 0 ) {
450 Warning(LOCATION,"Cannot load hud ani: %s\n", Reticle_frame_names[gr_screen.res][i]);
457 // called once per frame to update the reticle gauges. Makes calls to
458 // ship_dumbfire_threat() and ship_lock_threat() and updates Threat_flags.
459 void hud_update_reticle( player *pp )
464 // multiplayer clients won't call this routine
465 if ( MULTIPLAYER_CLIENT || MULTI_OBSERVER(Net_players[MY_NET_PLAYER_NUM]))
468 shipp = &Ships[Objects[pp->objnum].instance];
470 if ( ship_dumbfire_threat(shipp) ) {
471 pp->threat_flags |= THREAT_DUMBFIRE;
472 pp->update_dumbfire_time = timestamp(THREAT_UPDATE_DUMBFIRE_TIME);
475 if ( timestamp_elapsed(pp->update_dumbfire_time) ) {
476 pp->update_dumbfire_time = timestamp(THREAT_UPDATE_DUMBFIRE_TIME);
477 pp->threat_flags &= ~THREAT_DUMBFIRE;
480 if ( timestamp_elapsed(pp->update_lock_time) ) {
481 pp->threat_flags &= ~(THREAT_LOCK | THREAT_ATTEMPT_LOCK);
482 pp->update_lock_time = timestamp(THREAT_UPDATE_LOCK_TIME);
483 rval = ship_lock_threat(shipp);
485 pp->threat_flags |= THREAT_ATTEMPT_LOCK;
486 } else if ( rval == 2 ) {
487 pp->threat_flags |= THREAT_LOCK;
492 // draw left arc (the dark portion of the throttle gauge)
493 void hud_render_throttle_background(int y_end)
497 hud_set_gauge_color(HUD_THROTTLE_GAUGE);
499 x = Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][0];
500 y = Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][1];
502 bm_get_info( Reticle_gauges[RETICLE_LEFT_ARC].first_frame+1,&w,&h);
505 GR_AABITMAP_EX(Reticle_gauges[RETICLE_LEFT_ARC].first_frame+1, x, y, w, y_end-y+1, 0, 0);
509 // draw left arc (the bright portion of the throttle gauge)
510 void hud_render_throttle_foreground(int y_end)
514 hud_set_gauge_color(HUD_THROTTLE_GAUGE);
516 x = Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][0];
517 y = Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][1];
519 bm_get_info( Reticle_gauges[RETICLE_LEFT_ARC].first_frame+1,&w,&h);
521 if ( y_end < Hud_throttle_frame_bottom_y[gr_screen.res] ) {
522 GR_AABITMAP_EX(Reticle_gauges[RETICLE_LEFT_ARC].first_frame+2, x, y_end, w, h-(y_end-y), 0, y_end-y);
526 // Draw the throttle speed number
527 void hud_render_throttle_speed(float current_speed, int y_end)
530 int sx, sy, x_pos, y_pos, w, h;
532 hud_set_gauge_color(HUD_THROTTLE_GAUGE);
534 // y_end is the y-coordinate of the current throttle setting, calc x-coordinate for edge of
535 // circle (x^2 + y^2 = r^2)
536 y_pos = Hud_reticle_center[gr_screen.res][1] - y_end;
537 x_pos = (int)sqrt(double(Outer_circle_radius[gr_screen.res] * Outer_circle_radius[gr_screen.res] - y_pos * y_pos) );
538 x_pos = Hud_reticle_center[gr_screen.res][0] - x_pos;
540 // draw current speed at (x_pos, y_end);
541 SDL_snprintf(buf, SDL_arraysize(buf), "%d", fl2i(current_speed+0.5f));
542 hud_num_make_mono(buf);
543 gr_get_string_size(&w, &h, buf);
545 sy = fl2i(y_end - h/2.0f + 1.5);
546 gr_printf(sx, sy, buf);
548 if ( Players[Player_num].flags & PLAYER_FLAGS_MATCH_TARGET ) {
550 if ( current_speed <= 9.5 ) {
556 // print an m, cuz the voice says its an m.
557 // its a normal m cuz the german font has no special m (its an a)
558 gr_string(sx+offset, sy + h, "m");
560 gr_printf(sx+offset, sy + h, "%c", Lcl_special_chars + 3);
565 // draw the "desired speed" bar on the throttle
566 void hud_render_throttle_line(int y)
568 // hud_set_bright_color();
569 hud_set_gauge_color(HUD_THROTTLE_GAUGE, HUD_C_BRIGHT);
571 GR_AABITMAP_EX(Reticle_gauges[RETICLE_LEFT_ARC].first_frame+3, Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][0], y, Hud_throttle_frame_w[gr_screen.res], 1, 0, y-Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][1]);
574 // Draw the throttle gauge along the left arc of the reticle
575 void hud_show_throttle()
577 float desired_speed, max_speed, current_speed, percent_max, percent_aburn_max;
578 int desired_y_pos, y_end;
581 sip = &Ship_info[Player_ship->ship_info_index];
583 current_speed = Player_obj->phys_info.fspeed;
584 if ( current_speed < 0.0f){
585 current_speed = 0.0f;
588 max_speed = Ships[Player_obj->instance].current_max_speed;
589 if ( max_speed <= 0 ) {
590 max_speed = sip->max_vel.xyz.z;
593 desired_speed = Player->ci.forward * max_speed;
594 if ( desired_speed < 0.0f ){ // so ships that go backwards don't force the indicators below where they can go
595 desired_speed = 0.0f;
598 desired_y_pos = Hud_throttle_bottom_y[gr_screen.res] - fl2i(Hud_throttle_h[gr_screen.res]*desired_speed/max_speed+0.5f) - 1;
600 SDL_assert(max_speed != 0);
601 percent_max = current_speed / max_speed;
603 percent_aburn_max = 0.0f;
604 if ( percent_max > 1 ) {
606 percent_aburn_max = (current_speed - max_speed) / (sip->afterburner_max_vel.xyz.z - max_speed);
607 if ( percent_aburn_max > 1.0f ) {
608 percent_aburn_max = 1.0f;
610 if ( percent_aburn_max < 0 ) {
611 percent_aburn_max = 0.0f;
615 y_end = Hud_throttle_bottom_y[gr_screen.res] - fl2i(Hud_throttle_h[gr_screen.res]*percent_max+0.5f);
616 if ( percent_aburn_max > 0 ) {
617 y_end -= fl2i(percent_aburn_max * Hud_throttle_aburn_h[gr_screen.res] + 0.5f);
620 if ( Player_obj->phys_info.flags & PF_AFTERBURNER_ON ) {
624 // draw left arc (the dark portion of the throttle gauge)
626 hud_render_throttle_background(y_end);
629 // draw throttle speed number
630 hud_render_throttle_speed(current_speed, y_end);
632 // draw the "desired speed" bar on the throttle
633 hud_render_throttle_line(desired_y_pos);
635 // draw left arc (the bright portion of the throttle gauge)
636 hud_render_throttle_foreground(y_end);
638 gr_printf(Max_speed_coords[gr_screen.res][0], Max_speed_coords[gr_screen.res][1], "%d",fl2i(max_speed));
639 gr_printf(Zero_speed_coords[gr_screen.res][0], Zero_speed_coords[gr_screen.res][1], XSTR( "0", 292));
643 // Draw the primary and secondary weapon indicators along the right arc of the reticle
644 void hud_show_reticle_weapons()
646 int gauge_index=0, frame_offset=0;
649 swp = &Player_ship->weapons;
651 switch( swp->num_primary_banks ) {
657 gauge_index = RETICLE_ONE_PRIMARY;
658 if ( Player_ship->weapons.current_primary_bank == -1 ) {
666 gauge_index = RETICLE_TWO_PRIMARY;
667 if ( swp->current_primary_bank == -1 ) {
670 if ( Player_ship->flags & SF_PRIMARY_LINKED ) {
673 if ( swp->current_primary_bank == 0 ) {
683 Int3(); // shouldn't happen (get Alan if it does)
688 if ( gauge_index != -1 ) {
689 GR_AABITMAP(Reticle_gauges[gauge_index].first_frame+frame_offset, Reticle_frame_coords[gr_screen.res][gauge_index][0], Reticle_frame_coords[gr_screen.res][gauge_index][1]);
692 int num_banks = swp->num_secondary_banks;
693 if ( num_banks <= 0 ) {
694 num_banks = Ship_info[Player_ship->ship_info_index].num_secondary_banks;
697 switch( num_banks ) {
704 gauge_index = RETICLE_ONE_SECONDARY;
708 gauge_index = RETICLE_TWO_SECONDARY;
712 gauge_index = RETICLE_THREE_SECONDARY;
716 Int3(); // shouldn't happen (get Alan if it does)
721 if ( gauge_index != -1 ) {
722 if ( swp->num_secondary_banks <= 0 ) {
725 frame_offset = swp->current_secondary_bank+1;
728 GR_AABITMAP(Reticle_gauges[gauge_index].first_frame+frame_offset, Reticle_frame_coords[gr_screen.res][gauge_index][0], Reticle_frame_coords[gr_screen.res][gauge_index][1]);
733 // Draw the lock threat gauge on the HUD. Use Threat_flags to determine if a
734 // threat exists, and draw flashing frames.
735 void hud_show_lock_threat()
739 if ( Player->threat_flags & (THREAT_LOCK | THREAT_ATTEMPT_LOCK) ) {
740 if ( timestamp_elapsed(Threat_lock_timer) ) {
741 if ( Player->threat_flags & THREAT_LOCK ) {
742 Threat_lock_timer = timestamp(fl2i(THREAT_LOCK_FLASH/2.0f));
744 Threat_lock_timer = timestamp(THREAT_LOCK_FLASH);
747 if ( Threat_lock_frame > 2 ) {
748 Threat_lock_frame = 1;
750 if ( (Threat_lock_frame == 2) && (Player->threat_flags & THREAT_ATTEMPT_LOCK ) ) {
751 snd_play( &Snds[SND_THREAT_FLASH]);
754 frame_offset = Threat_lock_frame;
759 hud_set_gauge_color(HUD_THREAT_GAUGE);
761 GR_AABITMAP(Reticle_gauges[RETICLE_LOCK_WARN].first_frame+frame_offset, Reticle_frame_coords[gr_screen.res][RETICLE_LOCK_WARN][0], Reticle_frame_coords[gr_screen.res][RETICLE_LOCK_WARN][1]);
764 if ( (frame_offset > 0) && (Player->threat_flags & THREAT_LOCK) ) {
765 if ( hud_targetbox_flash_expired(TBOX_FLASH_CMEASURE) ) {
768 if(frame_offset % 2){
773 // GR_AABITMAP(Reticle_gauges[RETICLE_LAUNCH_LABEL].first_frame+frame_offset%2, Reticle_frame_coords[gr_screen.res][RETICLE_LAUNCH_LABEL][0], Reticle_frame_coords[gr_screen.res][RETICLE_LAUNCH_LABEL][1]);
775 // use hud text flash gauge code
776 hud_show_text_flash_icon(XSTR("Launch", 1507), Reticle_launch_coords[gr_screen.res][1], bright);
781 // Draw the dumbfire threat gauge on the HUD. Use Threat_flags to determine if a
782 // threat exists, and draw flashing frames.
783 void hud_show_dumbfire_threat()
787 if ( Player->threat_flags & THREAT_DUMBFIRE ) {
788 if ( timestamp_elapsed(Threat_dumbfire_timer) ) {
789 Threat_dumbfire_timer = timestamp(THREAT_DUMBFIRE_FLASH);
790 Threat_dumbfire_frame++;
791 if ( Threat_dumbfire_frame > 2 ) {
792 Threat_dumbfire_frame = 1;
795 frame_offset = Threat_dumbfire_frame;
800 hud_set_gauge_color(HUD_THREAT_GAUGE);
802 GR_AABITMAP(Reticle_gauges[RETICLE_LASER_WARN].first_frame + frame_offset, Reticle_frame_coords[gr_screen.res][RETICLE_LASER_WARN][0], Reticle_frame_coords[gr_screen.res][RETICLE_LASER_WARN][1]);
805 // Draw the center of the reticle
806 void hud_show_center_reticle()
808 SDL_assert(Reticle_gauges[RETICLE_CENTER].first_frame != -1 );
810 // hud_set_default_color();
811 // hud_set_bright_color();
812 hud_set_gauge_color(HUD_CENTER_RETICLE, HUD_C_BRIGHT);
814 GR_AABITMAP(Reticle_gauges[RETICLE_CENTER].first_frame, Reticle_frame_coords[gr_screen.res][RETICLE_CENTER][0], Reticle_frame_coords[gr_screen.res][RETICLE_CENTER][1]);
817 // Draw top portion of reticle
818 void hud_show_top_arc()
820 hud_set_gauge_color(HUD_CENTER_RETICLE);
822 // hud_set_default_color();
823 if ( hud_gauge_active(HUD_THREAT_GAUGE) ) {
825 GR_AABITMAP(Reticle_gauges[RETICLE_TOP_ARC].first_frame+1, Reticle_frame_coords[gr_screen.res][RETICLE_TOP_ARC][0], Reticle_frame_coords[gr_screen.res][RETICLE_TOP_ARC][1]);
827 // draw dumbfire threat
828 hud_show_dumbfire_threat();
831 hud_show_lock_threat();
833 // draw top arc without any holes
834 GR_AABITMAP(Reticle_gauges[RETICLE_TOP_ARC].first_frame, Reticle_frame_coords[gr_screen.res][RETICLE_TOP_ARC][0], Reticle_frame_coords[gr_screen.res][RETICLE_TOP_ARC][1]);
838 // Draw right portion of reticle
839 void hud_show_right_arc()
841 hud_set_gauge_color(HUD_CENTER_RETICLE);
844 GR_AABITMAP(Reticle_gauges[RETICLE_RIGHT_ARC].first_frame+1, Reticle_frame_coords[gr_screen.res][RETICLE_RIGHT_ARC][0], Reticle_frame_coords[gr_screen.res][RETICLE_RIGHT_ARC][1]);
847 // draw the weapons indicators in the holes along the right arc
848 if ( hud_gauge_active(HUD_WEAPON_LINKING_GAUGE) ) {
849 // draw right arc with holes in it
850 GR_AABITMAP(Reticle_gauges[RETICLE_RIGHT_ARC].first_frame+1, Reticle_frame_coords[gr_screen.res][RETICLE_RIGHT_ARC][0], Reticle_frame_coords[gr_screen.res][RETICLE_RIGHT_ARC][1]);
851 // the following line was removed by Jasen to get rid of "undeclared identifier"
853 hud_show_reticle_weapons();
855 // draw right arc without any holes
856 GR_AABITMAP(Reticle_gauges[RETICLE_RIGHT_ARC].first_frame, Reticle_frame_coords[gr_screen.res][RETICLE_RIGHT_ARC][0], Reticle_frame_coords[gr_screen.res][RETICLE_RIGHT_ARC][1]);
861 // Draw the left portion of the reticle
862 void hud_show_left_arc()
864 #ifndef MAKE_FS1 // FS1: is drawn another way
865 // draw left arc (the dark portion of the throttle gauge)
866 hud_set_gauge_color(HUD_CENTER_RETICLE);
867 GR_AABITMAP(Reticle_gauges[RETICLE_LEFT_ARC].first_frame, Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][0], Reticle_frame_coords[gr_screen.res][RETICLE_LEFT_ARC][1]);
871 if ( hud_gauge_active(HUD_THROTTLE_GAUGE) ) {
872 hud_set_gauge_color(HUD_THROTTLE_GAUGE);
877 // called once per frame from HUD_render_2d() to draw the reticle gauges
878 void hud_show_reticle()
880 if ( !(Viewer_mode & VM_OTHER_SHIP) ) {
882 hud_show_right_arc();
886 // draw the center of the reticle
887 if ( hud_gauge_active(HUD_CENTER_RETICLE) ) {
888 hud_show_center_reticle();
892 void hudreticle_page_in()
897 for ( i = 0; i < NUM_RETICLE_ANIS; i++ ) {
898 hfp = &Reticle_gauges[i];
899 bm_page_in_aabitmap( hfp->first_frame, hfp->num_frames);