2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
15 * $Source: /cvs/cvsroot/d2x/main/gauges.c,v $
18 * $Date: 2003-06-06 19:04:27 $
20 * Inferno gauge drivers
22 * $Log: not supported by cvs2svn $
23 * Revision 1.6.2.1 2003/06/06 10:00:31 btb
24 * force cockpit redraw in opengl
26 * Revision 1.6 2001/11/08 10:30:27 bradleyb
27 * Enabled shareware build, endlevel flythrough sequence
29 * Revision 1.5 2001/11/04 09:00:25 bradleyb
30 * Enable d1x-style hud_message
50 #include "pa_enabl.h" //$$POLY_ACC
58 #include "menu.h" // For the font.
90 void draw_ammo_info(int x,int y,int ammo_count,int primary);
91 extern void draw_guided_crosshair(void);
93 bitmap_index Gauges[MAX_GAUGE_BMS]; // Array of all gauge bitmaps.
94 bitmap_index Gauges_hires[MAX_GAUGE_BMS]; // hires gauges
96 grs_canvas *Canv_LeftEnergyGauge;
97 grs_canvas *Canv_AfterburnerGauge;
98 grs_canvas *Canv_SBEnergyGauge;
99 grs_canvas *Canv_SBAfterburnerGauge;
100 grs_canvas *Canv_RightEnergyGauge;
101 grs_canvas *Canv_NumericalGauge;
103 //Flags for gauges/hud stuff
106 //bitmap numbers for gauges
108 #define GAUGE_SHIELDS 0 //0..9, in decreasing order (100%,90%...0%)
110 #define GAUGE_INVULNERABLE 10 //10..19
111 #define N_INVULNERABLE_FRAMES 10
113 #define GAUGE_AFTERBURNER 20
114 #define GAUGE_ENERGY_LEFT 21
115 #define GAUGE_ENERGY_RIGHT 22
116 #define GAUGE_NUMERICAL 23
118 #define GAUGE_BLUE_KEY 24
119 #define GAUGE_GOLD_KEY 25
120 #define GAUGE_RED_KEY 26
121 #define GAUGE_BLUE_KEY_OFF 27
122 #define GAUGE_GOLD_KEY_OFF 28
123 #define GAUGE_RED_KEY_OFF 29
125 #define SB_GAUGE_BLUE_KEY 30
126 #define SB_GAUGE_GOLD_KEY 31
127 #define SB_GAUGE_RED_KEY 32
128 #define SB_GAUGE_BLUE_KEY_OFF 33
129 #define SB_GAUGE_GOLD_KEY_OFF 34
130 #define SB_GAUGE_RED_KEY_OFF 35
132 #define SB_GAUGE_ENERGY 36
134 #define GAUGE_LIVES 37
136 #define GAUGE_SHIPS 38
137 #define GAUGE_SHIPS_LAST 45
139 #define RETICLE_CROSS 46
140 #define RETICLE_PRIMARY 48
141 #define RETICLE_SECONDARY 51
142 #define RETICLE_LAST 55
144 #define GAUGE_HOMING_WARNING_ON 56
145 #define GAUGE_HOMING_WARNING_OFF 57
147 #define SML_RETICLE_CROSS 58
148 #define SML_RETICLE_PRIMARY 60
149 #define SML_RETICLE_SECONDARY 63
150 #define SML_RETICLE_LAST 67
152 #define KEY_ICON_BLUE 68
153 #define KEY_ICON_YELLOW 69
154 #define KEY_ICON_RED 70
156 #define SB_GAUGE_AFTERBURNER 71
158 #define FLAG_ICON_RED 72
159 #define FLAG_ICON_BLUE 73
162 /* Use static inline function under GCC to avoid CR/LF issues */
164 #define PAGE_IN_GAUGE(x) _page_in_gauge(x)
165 static inline void _page_in_gauge(int x)
168 PIGGY_PAGE_IN(Gauges_hires[x]);
170 PIGGY_PAGE_IN(Gauges[x]);
175 #define PAGE_IN_GAUGE(x) \
178 PIGGY_PAGE_IN(Gauges_hires[x]); \
180 PIGGY_PAGE_IN(Gauges[x]); \
186 #define GET_GAUGE_INDEX(x) (FontHires?Gauges_hires[x].index:Gauges[x].index)
188 //change MAX_GAUGE_BMS when adding gauges
190 //Coordinats for gauges
192 extern int Current_display_mode;
196 #define GAUGE_BLUE_KEY_X_L 272
197 #define GAUGE_BLUE_KEY_Y_L 152
198 #define GAUGE_BLUE_KEY_X_H 535
199 #define GAUGE_BLUE_KEY_Y_H 374
200 #define GAUGE_BLUE_KEY_X (Current_display_mode?GAUGE_BLUE_KEY_X_H:GAUGE_BLUE_KEY_X_L)
201 #define GAUGE_BLUE_KEY_Y (Current_display_mode?GAUGE_BLUE_KEY_Y_H:GAUGE_BLUE_KEY_Y_L)
203 #define GAUGE_GOLD_KEY_X_L 273
204 #define GAUGE_GOLD_KEY_Y_L 162
205 #define GAUGE_GOLD_KEY_X_H 537
206 #define GAUGE_GOLD_KEY_Y_H 395
207 #define GAUGE_GOLD_KEY_X (Current_display_mode?GAUGE_GOLD_KEY_X_H:GAUGE_GOLD_KEY_X_L)
208 #define GAUGE_GOLD_KEY_Y (Current_display_mode?GAUGE_GOLD_KEY_Y_H:GAUGE_GOLD_KEY_Y_L)
210 #define GAUGE_RED_KEY_X_L 274
211 #define GAUGE_RED_KEY_Y_L 172
212 #define GAUGE_RED_KEY_X_H 539
213 #define GAUGE_RED_KEY_Y_H 416
214 #define GAUGE_RED_KEY_X (Current_display_mode?GAUGE_RED_KEY_X_H:GAUGE_RED_KEY_X_L)
215 #define GAUGE_RED_KEY_Y (Current_display_mode?GAUGE_RED_KEY_Y_H:GAUGE_RED_KEY_Y_L)
219 #define SB_GAUGE_KEYS_X_L 11
220 #define SB_GAUGE_KEYS_X_H 26
221 #define SB_GAUGE_KEYS_X (Current_display_mode?SB_GAUGE_KEYS_X_H:SB_GAUGE_KEYS_X_L)
223 #define SB_GAUGE_BLUE_KEY_Y_L 153
224 #define SB_GAUGE_GOLD_KEY_Y_L 169
225 #define SB_GAUGE_RED_KEY_Y_L 185
227 #define SB_GAUGE_BLUE_KEY_Y_H 390
228 #define SB_GAUGE_GOLD_KEY_Y_H 422
229 #define SB_GAUGE_RED_KEY_Y_H 454
231 #define SB_GAUGE_BLUE_KEY_Y (Current_display_mode?SB_GAUGE_BLUE_KEY_Y_H:SB_GAUGE_BLUE_KEY_Y_L)
232 #define SB_GAUGE_GOLD_KEY_Y (Current_display_mode?SB_GAUGE_GOLD_KEY_Y_H:SB_GAUGE_GOLD_KEY_Y_L)
233 #define SB_GAUGE_RED_KEY_Y (Current_display_mode?SB_GAUGE_RED_KEY_Y_H:SB_GAUGE_RED_KEY_Y_L)
235 // cockpit enery gauges
237 #define LEFT_ENERGY_GAUGE_X_L 70
238 #define LEFT_ENERGY_GAUGE_Y_L 131
239 #define LEFT_ENERGY_GAUGE_W_L 64
240 #define LEFT_ENERGY_GAUGE_H_L 8
242 #define LEFT_ENERGY_GAUGE_X_H 137
243 #define LEFT_ENERGY_GAUGE_Y_H 314
244 #define LEFT_ENERGY_GAUGE_W_H 133
245 #define LEFT_ENERGY_GAUGE_H_H 21
247 #define LEFT_ENERGY_GAUGE_X (Current_display_mode?LEFT_ENERGY_GAUGE_X_H:LEFT_ENERGY_GAUGE_X_L)
248 #define LEFT_ENERGY_GAUGE_Y (Current_display_mode?LEFT_ENERGY_GAUGE_Y_H:LEFT_ENERGY_GAUGE_Y_L)
249 #define LEFT_ENERGY_GAUGE_W (Current_display_mode?LEFT_ENERGY_GAUGE_W_H:LEFT_ENERGY_GAUGE_W_L)
250 #define LEFT_ENERGY_GAUGE_H (Current_display_mode?LEFT_ENERGY_GAUGE_H_H:LEFT_ENERGY_GAUGE_H_L)
252 #define RIGHT_ENERGY_GAUGE_X (Current_display_mode?380:190)
253 #define RIGHT_ENERGY_GAUGE_Y (Current_display_mode?314:131)
254 #define RIGHT_ENERGY_GAUGE_W (Current_display_mode?133:64)
255 #define RIGHT_ENERGY_GAUGE_H (Current_display_mode?21:8)
257 // cockpit afterburner gauge
259 #define AFTERBURNER_GAUGE_X_L 45-1
260 #define AFTERBURNER_GAUGE_Y_L 158
261 #define AFTERBURNER_GAUGE_W_L 12
262 #define AFTERBURNER_GAUGE_H_L 32
264 #define AFTERBURNER_GAUGE_X_H 88
265 #define AFTERBURNER_GAUGE_Y_H 377
266 #define AFTERBURNER_GAUGE_W_H 21
267 #define AFTERBURNER_GAUGE_H_H 65
269 #define AFTERBURNER_GAUGE_X (Current_display_mode?AFTERBURNER_GAUGE_X_H:AFTERBURNER_GAUGE_X_L)
270 #define AFTERBURNER_GAUGE_Y (Current_display_mode?AFTERBURNER_GAUGE_Y_H:AFTERBURNER_GAUGE_Y_L)
271 #define AFTERBURNER_GAUGE_W (Current_display_mode?AFTERBURNER_GAUGE_W_H:AFTERBURNER_GAUGE_W_L)
272 #define AFTERBURNER_GAUGE_H (Current_display_mode?AFTERBURNER_GAUGE_H_H:AFTERBURNER_GAUGE_H_L)
276 #define SB_ENERGY_GAUGE_X (Current_display_mode?196:98)
277 #define SB_ENERGY_GAUGE_Y (Current_display_mode?382:(155-2))
278 #define SB_ENERGY_GAUGE_W (Current_display_mode?32:16)
279 #define SB_ENERGY_GAUGE_H (Current_display_mode?60:29)
281 // sb afterburner gauge
283 #define SB_AFTERBURNER_GAUGE_X (Current_display_mode?196:98)
284 #define SB_AFTERBURNER_GAUGE_Y (Current_display_mode?446:184)
285 #define SB_AFTERBURNER_GAUGE_W (Current_display_mode?33:16)
286 #define SB_AFTERBURNER_GAUGE_H (Current_display_mode?29:13)
288 #define SB_ENERGY_NUM_X (SB_ENERGY_GAUGE_X+(Current_display_mode?4:2))
289 #define SB_ENERGY_NUM_Y (Current_display_mode?457:175)
291 #define SHIELD_GAUGE_X (Current_display_mode?292:146)
292 #define SHIELD_GAUGE_Y (Current_display_mode?374:155)
293 #define SHIELD_GAUGE_W (Current_display_mode?70:35)
294 #define SHIELD_GAUGE_H (Current_display_mode?77:32)
296 #define SHIP_GAUGE_X (SHIELD_GAUGE_X+(Current_display_mode?11:5))
297 #define SHIP_GAUGE_Y (SHIELD_GAUGE_Y+(Current_display_mode?10:5))
299 #define SB_SHIELD_GAUGE_X (Current_display_mode?247:123) //139
300 #define SB_SHIELD_GAUGE_Y (Current_display_mode?395:163)
302 #define SB_SHIP_GAUGE_X (SB_SHIELD_GAUGE_X+(Current_display_mode?11:5))
303 #define SB_SHIP_GAUGE_Y (SB_SHIELD_GAUGE_Y+(Current_display_mode?10:5))
305 #define SB_SHIELD_NUM_X (SB_SHIELD_GAUGE_X+(Current_display_mode?21:12)) //151
306 #define SB_SHIELD_NUM_Y (SB_SHIELD_GAUGE_Y-(Current_display_mode?16:8)) //156 -- MWA used to be hard coded to 156
308 #define NUMERICAL_GAUGE_X (Current_display_mode?308:154)
309 #define NUMERICAL_GAUGE_Y (Current_display_mode?316:130)
310 #define NUMERICAL_GAUGE_W (Current_display_mode?38:19)
311 #define NUMERICAL_GAUGE_H (Current_display_mode?55:22)
313 #define PRIMARY_W_PIC_X (Current_display_mode?(135-10):64)
314 #define PRIMARY_W_PIC_Y (Current_display_mode?370:154)
315 #define PRIMARY_W_TEXT_X (Current_display_mode?182:87)
316 #define PRIMARY_W_TEXT_Y (Current_display_mode?400:157)
317 #define PRIMARY_AMMO_X (Current_display_mode?186:(96-3))
318 #define PRIMARY_AMMO_Y (Current_display_mode?420:171)
320 #define SECONDARY_W_PIC_X (Current_display_mode?466:234)
321 #define SECONDARY_W_PIC_Y (Current_display_mode?374:154)
322 #define SECONDARY_W_TEXT_X (Current_display_mode?413:207)
323 #define SECONDARY_W_TEXT_Y (Current_display_mode?378:157)
324 #define SECONDARY_AMMO_X (Current_display_mode?428:213)
325 #define SECONDARY_AMMO_Y (Current_display_mode?407:171)
327 #define SB_LIVES_X (Current_display_mode?(550-10-3):266)
328 #define SB_LIVES_Y (Current_display_mode?450-3:185)
329 #define SB_LIVES_LABEL_X (Current_display_mode?475:237)
330 #define SB_LIVES_LABEL_Y (SB_LIVES_Y+1)
332 #define SB_SCORE_RIGHT_L 301
333 #define SB_SCORE_RIGHT_H (605+8)
334 #define SB_SCORE_RIGHT (Current_display_mode?SB_SCORE_RIGHT_H:SB_SCORE_RIGHT_L)
336 #define SB_SCORE_Y (Current_display_mode?398:158)
337 #define SB_SCORE_LABEL_X (Current_display_mode?475:237)
339 #define SB_SCORE_ADDED_RIGHT (Current_display_mode?SB_SCORE_RIGHT_H:SB_SCORE_RIGHT_L)
340 #define SB_SCORE_ADDED_Y (Current_display_mode?413:165)
342 #define HOMING_WARNING_X (Current_display_mode?14:7)
343 #define HOMING_WARNING_Y (Current_display_mode?415:171)
345 #define BOMB_COUNT_X (Current_display_mode?546:275)
346 #define BOMB_COUNT_Y (Current_display_mode?445:186)
348 #define SB_BOMB_COUNT_X (Current_display_mode?342:171)
349 #define SB_BOMB_COUNT_Y (Current_display_mode?458:191)
352 #define LHX(x) ((x)*(Current_display_mode?2:1))
353 #define LHY(y) ((y)*(Current_display_mode?2.4:1))
355 #define LHX(x) ((x)*(MenuHires?2:1))
356 #define LHY(y) ((y)*(MenuHires?2.4:1))
359 static int score_display[2];
360 static fix score_time;
362 static int old_score[2] = { -1, -1 };
363 static int old_energy[2] = { -1, -1 };
364 static int old_shields[2] = { -1, -1 };
365 static int old_flags[2] = { -1, -1 };
366 static int old_weapon[2][2] = {{ -1, -1 },{-1,-1}};
367 static int old_ammo_count[2][2] = {{ -1, -1 },{-1,-1}};
368 static int Old_Omega_charge[2] = { -1, -1 };
369 static int old_laser_level[2] = { -1, -1 };
370 static int old_cloak[2] = { 0, 0 };
371 static int old_lives[2] = { -1, -1 };
372 static fix old_afterburner[2] = { -1, -1 };
373 static int old_bombcount[2] = { 0, 0 };
375 static int invulnerable_frame = 0;
377 static int cloak_fade_state; //0=steady, -1 fading out, 1 fading in
379 #define WS_SET 0 //in correct state
380 #define WS_FADING_OUT 1
381 #define WS_FADING_IN 2
383 int weapon_box_user[2]={WBU_WEAPON,WBU_WEAPON}; //see WBU_ constants in gauges.h
384 int weapon_box_states[2];
385 fix weapon_box_fade_values[2];
387 #define FADE_SCALE (2*i2f(GR_FADE_LEVELS)/REARM_TIME) // fade out and back in REARM_TIME, in fade levels per seconds (int)
389 typedef struct span {
393 //store delta x values from left of box
394 span weapon_window_left[] = { //first span 67,151
441 //store delta x values from left of box
442 span weapon_window_right[] = { //first span 207,154
488 //store delta x values from left of box
489 span weapon_window_left_hires[] = { //first span 67,154
600 //store delta x values from left of box
601 span weapon_window_right_hires[] = { //first span 207,154
712 #define N_LEFT_WINDOW_SPANS (sizeof(weapon_window_left)/sizeof(*weapon_window_left))
713 #define N_RIGHT_WINDOW_SPANS (sizeof(weapon_window_right)/sizeof(*weapon_window_right))
715 #define N_LEFT_WINDOW_SPANS_H (sizeof(weapon_window_left_hires)/sizeof(*weapon_window_left_hires))
716 #define N_RIGHT_WINDOW_SPANS_H (sizeof(weapon_window_right_hires)/sizeof(*weapon_window_right_hires))
718 // defining box boundries for weapon pictures
720 #define PRIMARY_W_BOX_LEFT_L 63
721 #define PRIMARY_W_BOX_TOP_L 151 //154
722 #define PRIMARY_W_BOX_RIGHT_L (PRIMARY_W_BOX_LEFT_L+58)
723 #define PRIMARY_W_BOX_BOT_L (PRIMARY_W_BOX_TOP_L+N_LEFT_WINDOW_SPANS-1)
725 #define PRIMARY_W_BOX_LEFT_H 121
726 #define PRIMARY_W_BOX_TOP_H 364
727 #define PRIMARY_W_BOX_RIGHT_H 242
728 #define PRIMARY_W_BOX_BOT_H (PRIMARY_W_BOX_TOP_H+N_LEFT_WINDOW_SPANS_H-1) //470
730 #define PRIMARY_W_BOX_LEFT (Current_display_mode?PRIMARY_W_BOX_LEFT_H:PRIMARY_W_BOX_LEFT_L)
731 #define PRIMARY_W_BOX_TOP (Current_display_mode?PRIMARY_W_BOX_TOP_H:PRIMARY_W_BOX_TOP_L)
732 #define PRIMARY_W_BOX_RIGHT (Current_display_mode?PRIMARY_W_BOX_RIGHT_H:PRIMARY_W_BOX_RIGHT_L)
733 #define PRIMARY_W_BOX_BOT (Current_display_mode?PRIMARY_W_BOX_BOT_H:PRIMARY_W_BOX_BOT_L)
735 #define SECONDARY_W_BOX_LEFT_L 202 //207
736 #define SECONDARY_W_BOX_TOP_L 151
737 #define SECONDARY_W_BOX_RIGHT_L 263 //(SECONDARY_W_BOX_LEFT+54)
738 #define SECONDARY_W_BOX_BOT_L (SECONDARY_W_BOX_TOP_L+N_RIGHT_WINDOW_SPANS-1)
740 #define SECONDARY_W_BOX_LEFT_H 404
741 #define SECONDARY_W_BOX_TOP_H 363
742 #define SECONDARY_W_BOX_RIGHT_H 529
743 #define SECONDARY_W_BOX_BOT_H (SECONDARY_W_BOX_TOP_H+N_RIGHT_WINDOW_SPANS_H-1) //470
745 #define SECONDARY_W_BOX_LEFT (Current_display_mode?SECONDARY_W_BOX_LEFT_H:SECONDARY_W_BOX_LEFT_L)
746 #define SECONDARY_W_BOX_TOP (Current_display_mode?SECONDARY_W_BOX_TOP_H:SECONDARY_W_BOX_TOP_L)
747 #define SECONDARY_W_BOX_RIGHT (Current_display_mode?SECONDARY_W_BOX_RIGHT_H:SECONDARY_W_BOX_RIGHT_L)
748 #define SECONDARY_W_BOX_BOT (Current_display_mode?SECONDARY_W_BOX_BOT_H:SECONDARY_W_BOX_BOT_L)
750 #define SB_PRIMARY_W_BOX_LEFT_L 34 //50
751 #define SB_PRIMARY_W_BOX_TOP_L 153
752 #define SB_PRIMARY_W_BOX_RIGHT_L (SB_PRIMARY_W_BOX_LEFT_L+53+2)
753 #define SB_PRIMARY_W_BOX_BOT_L (195+1)
755 #define SB_PRIMARY_W_BOX_LEFT_H 68
756 #define SB_PRIMARY_W_BOX_TOP_H 381
757 #define SB_PRIMARY_W_BOX_RIGHT_H 179
758 #define SB_PRIMARY_W_BOX_BOT_H 473
760 #define SB_PRIMARY_W_BOX_LEFT (Current_display_mode?SB_PRIMARY_W_BOX_LEFT_H:SB_PRIMARY_W_BOX_LEFT_L)
761 #define SB_PRIMARY_W_BOX_TOP (Current_display_mode?SB_PRIMARY_W_BOX_TOP_H:SB_PRIMARY_W_BOX_TOP_L)
762 #define SB_PRIMARY_W_BOX_RIGHT (Current_display_mode?SB_PRIMARY_W_BOX_RIGHT_H:SB_PRIMARY_W_BOX_RIGHT_L)
763 #define SB_PRIMARY_W_BOX_BOT (Current_display_mode?SB_PRIMARY_W_BOX_BOT_H:SB_PRIMARY_W_BOX_BOT_L)
765 #define SB_SECONDARY_W_BOX_LEFT_L 169
766 #define SB_SECONDARY_W_BOX_TOP_L 153
767 #define SB_SECONDARY_W_BOX_RIGHT_L (SB_SECONDARY_W_BOX_LEFT_L+54+1)
768 #define SB_SECONDARY_W_BOX_BOT_L (153+43)
770 #define SB_SECONDARY_W_BOX_LEFT_H 338
771 #define SB_SECONDARY_W_BOX_TOP_H 381
772 #define SB_SECONDARY_W_BOX_RIGHT_H 449
773 #define SB_SECONDARY_W_BOX_BOT_H 473
775 #define SB_SECONDARY_W_BOX_LEFT (Current_display_mode?SB_SECONDARY_W_BOX_LEFT_H:SB_SECONDARY_W_BOX_LEFT_L) //210
776 #define SB_SECONDARY_W_BOX_TOP (Current_display_mode?SB_SECONDARY_W_BOX_TOP_H:SB_SECONDARY_W_BOX_TOP_L)
777 #define SB_SECONDARY_W_BOX_RIGHT (Current_display_mode?SB_SECONDARY_W_BOX_RIGHT_H:SB_SECONDARY_W_BOX_RIGHT_L)
778 #define SB_SECONDARY_W_BOX_BOT (Current_display_mode?SB_SECONDARY_W_BOX_BOT_H:SB_SECONDARY_W_BOX_BOT_L)
780 #define SB_PRIMARY_W_PIC_X (SB_PRIMARY_W_BOX_LEFT+1) //51
781 #define SB_PRIMARY_W_PIC_Y (Current_display_mode?382:154)
782 #define SB_PRIMARY_W_TEXT_X (SB_PRIMARY_W_BOX_LEFT+(Current_display_mode?50:24)) //(51+23)
783 #define SB_PRIMARY_W_TEXT_Y (Current_display_mode?390:157)
784 #define SB_PRIMARY_AMMO_X (SB_PRIMARY_W_BOX_LEFT+(Current_display_mode?(38+20):30)) //((SB_PRIMARY_W_BOX_LEFT+33)-3) //(51+32)
785 #define SB_PRIMARY_AMMO_Y (Current_display_mode?410:171)
787 #define SB_SECONDARY_W_PIC_X (Current_display_mode?385:(SB_SECONDARY_W_BOX_LEFT+29)) //(212+27)
788 #define SB_SECONDARY_W_PIC_Y (Current_display_mode?382:154)
789 #define SB_SECONDARY_W_TEXT_X (SB_SECONDARY_W_BOX_LEFT+2) //212
790 #define SB_SECONDARY_W_TEXT_Y (Current_display_mode?389:157)
791 #define SB_SECONDARY_AMMO_X (SB_SECONDARY_W_BOX_LEFT+(Current_display_mode?(14-4):11)) //(212+9)
792 #define SB_SECONDARY_AMMO_Y (Current_display_mode?414:171)
794 typedef struct gauge_box {
796 int right,bot; //maximal box
797 span *spanlist; //list of left,right spans for copy
800 gauge_box gauge_boxes[] = {
802 // primary left/right low res
803 {PRIMARY_W_BOX_LEFT_L,PRIMARY_W_BOX_TOP_L,PRIMARY_W_BOX_RIGHT_L,PRIMARY_W_BOX_BOT_L,weapon_window_left},
804 {SECONDARY_W_BOX_LEFT_L,SECONDARY_W_BOX_TOP_L,SECONDARY_W_BOX_RIGHT_L,SECONDARY_W_BOX_BOT_L,weapon_window_right},
806 //sb left/right low res
807 {SB_PRIMARY_W_BOX_LEFT_L,SB_PRIMARY_W_BOX_TOP_L,SB_PRIMARY_W_BOX_RIGHT_L,SB_PRIMARY_W_BOX_BOT_L,NULL},
808 {SB_SECONDARY_W_BOX_LEFT_L,SB_SECONDARY_W_BOX_TOP_L,SB_SECONDARY_W_BOX_RIGHT_L,SB_SECONDARY_W_BOX_BOT_L,NULL},
810 // primary left/right hires
811 {PRIMARY_W_BOX_LEFT_H,PRIMARY_W_BOX_TOP_H,PRIMARY_W_BOX_RIGHT_H,PRIMARY_W_BOX_BOT_H,weapon_window_left_hires},
812 {SECONDARY_W_BOX_LEFT_H,SECONDARY_W_BOX_TOP_H,SECONDARY_W_BOX_RIGHT_H,SECONDARY_W_BOX_BOT_H,weapon_window_right_hires},
814 // sb left/right hires
815 {SB_PRIMARY_W_BOX_LEFT_H,SB_PRIMARY_W_BOX_TOP_H,SB_PRIMARY_W_BOX_RIGHT_H,SB_PRIMARY_W_BOX_BOT_H,NULL},
816 {SB_SECONDARY_W_BOX_LEFT_H,SB_SECONDARY_W_BOX_TOP_H,SB_SECONDARY_W_BOX_RIGHT_H,SB_SECONDARY_W_BOX_BOT_H,NULL},
819 // these macros refer to arrays above
821 #define COCKPIT_PRIMARY_BOX (!Current_display_mode?0:4)
822 #define COCKPIT_SECONDARY_BOX (!Current_display_mode?1:5)
823 #define SB_PRIMARY_BOX (!Current_display_mode?2:6)
824 #define SB_SECONDARY_BOX (!Current_display_mode?3:7)
826 int Color_0_31_0 = -1;
828 //copy a box from the off-screen buffer to the visible page
830 void copy_gauge_box(gauge_box *box,dd_grs_canvas *cv)
832 // This is kind of funny. If we are in a full cockpit mode
833 // we have a system offscreen buffer for our canvas.
834 // Since this is true of cockpit mode only, we should do a
835 // direct copy from system to video memory without blting.
838 int n_spans = box->bot-box->top+1;
841 if (Cockpit_mode==CM_FULL_COCKPIT && cv->sram) {
846 DDGRLOCK(dd_grd_curcanv);
847 bm = &cv->canvas.cv_bitmap;
849 for (cnt=0,y=box->top;cnt<n_spans;cnt++,y++)
851 gr_bm_ubitblt(box->spanlist[cnt].r-box->spanlist[cnt].l+1,1,
852 box->left+box->spanlist[cnt].l,y,box->left+box->spanlist[cnt].l,y,bm,&grd_curcanv->cv_bitmap);
854 DDGRUNLOCK(dd_grd_curcanv);
858 for (cnt=0,y=box->top;cnt<n_spans;cnt++,y++)
860 dd_gr_blt_notrans(cv,
861 box->left+box->spanlist[cnt].l,y,
862 box->spanlist[cnt].r-box->spanlist[cnt].l+1,1,
864 box->left+box->spanlist[cnt].l,y,
865 box->spanlist[cnt].r-box->spanlist[cnt].l+1,1);
870 dd_gr_blt_notrans(cv, box->left, box->top,
871 box->right-box->left+1, box->bot-box->top+1,
872 dd_grd_curcanv, box->left, box->top,
873 box->right-box->left+1, box->bot-box->top+1);
879 void copy_gauge_box(gauge_box *box,grs_bitmap *bm)
882 int n_spans = box->bot-box->top+1;
885 //gr_setcolor(BM_XRGB(31,0,0));
887 for (cnt=0,y=box->top;cnt<n_spans;cnt++,y++) {
888 PA_DFX (pa_set_frontbuffer_current());
889 PA_DFX (pa_set_back_to_read());
891 gr_bm_ubitblt(box->spanlist[cnt].r-box->spanlist[cnt].l+1,1,
892 box->left+box->spanlist[cnt].l,y,box->left+box->spanlist[cnt].l,y,bm,&grd_curcanv->cv_bitmap);
894 //gr_scanline(box->left+box->spanlist[cnt].l,box->left+box->spanlist[cnt].r,y);
895 PA_DFX (pa_set_backbuffer_current());
896 PA_DFX (pa_set_front_to_read());
902 PA_DFX (pa_set_frontbuffer_current());
903 PA_DFX (pa_set_back_to_read());
905 gr_bm_ubitblt(box->right-box->left+1,box->bot-box->top+1,
906 box->left,box->top,box->left,box->top,
907 bm,&grd_curcanv->cv_bitmap);
908 PA_DFX (pa_set_backbuffer_current());
909 PA_DFX (pa_set_front_to_read());
916 extern int gr_bitblt_double;
918 int copy_whole_box = 0;
920 void copy_gauge_box_double(gauge_box *box,grs_bitmap *bm)
923 if (!copy_whole_box && box->spanlist) {
924 int n_spans = box->bot-box->top+1;
925 int cnt, sx, dx, sy, dy;
928 for (cnt=0; cnt < n_spans; cnt++) {
934 dx = box->left+box->spanlist[cnt].l;
936 sbits = bm->bm_data + (bm->bm_rowsize * sy) + sx;
937 dbits = grd_curcanv->cv_bitmap.bm_data + (grd_curcanv->cv_bitmap.bm_rowsize * dy) + dx;
939 for (j = box->spanlist[cnt].l; j < box->spanlist[cnt].r+1; j++)
940 *dbits++ = sbits[j/2];
950 gr_bm_ubitblt_double_slow(box->right-box->left+1,box->bot-box->top,
951 box->left,box->top,box->left,box->top,
952 bm,&grd_curcanv->cv_bitmap);
957 //fills in the coords of the hostage video window
958 void get_hostage_window_coords(int *x,int *y,int *w,int *h)
960 if (Cockpit_mode == CM_STATUS_BAR) {
961 *x = SB_SECONDARY_W_BOX_LEFT;
962 *y = SB_SECONDARY_W_BOX_TOP;
963 *w = SB_SECONDARY_W_BOX_RIGHT - SB_SECONDARY_W_BOX_LEFT + 1;
964 *h = SB_SECONDARY_W_BOX_BOT - SB_SECONDARY_W_BOX_TOP + 1;
967 *x = SECONDARY_W_BOX_LEFT;
968 *y = SECONDARY_W_BOX_TOP;
969 *w = SECONDARY_W_BOX_RIGHT - SECONDARY_W_BOX_LEFT + 1;
970 *h = SECONDARY_W_BOX_BOT - SECONDARY_W_BOX_TOP + 1;
975 //these should be in gr.h
976 #define cv_w cv_bitmap.bm_w
977 #define cv_h cv_bitmap.bm_h
979 extern int HUD_nmessages, hud_first; // From hud.c
980 extern char HUD_messages[HUD_MAX_NUM][HUD_MESSAGE_LENGTH+5];
981 extern fix ThisLevelTime;
982 extern fix Omega_charge;
984 void hud_show_score()
989 if ((HUD_nmessages > 0) && (strlen(HUD_messages[hud_first]) > 38))
992 gr_set_curfont( GAME_FONT );
994 if ( ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) ) {
995 sprintf(score_str, "%s: %5d", TXT_KILLS, Players[Player_num].net_kills_total);
997 sprintf(score_str, "%s: %5d", TXT_SCORE, Players[Player_num].score);
1000 gr_get_string_size(score_str, &w, &h, &aw );
1002 if (Color_0_31_0 == -1)
1003 Color_0_31_0 = gr_getcolor(0,31,0);
1004 gr_set_fontcolor(Color_0_31_0, -1);
1006 gr_printf(grd_curcanv->cv_w-w-LHX(2), 3, score_str);
1009 void hud_show_timer_count()
1017 if ((HUD_nmessages > 0) && (strlen(HUD_messages[hud_first]) > 38))
1021 if ((Game_mode & GM_NETWORK) && Netgame.PlayTimeAllowed)
1023 timevar=i2f (Netgame.PlayTimeAllowed*5*60);
1024 i=f2i(timevar-ThisLevelTime);
1027 sprintf(score_str, "T - %5d", i);
1029 gr_get_string_size(score_str, &w, &h, &aw );
1031 if (Color_0_31_0 == -1)
1032 Color_0_31_0 = gr_getcolor(0,31,0);
1033 gr_set_fontcolor(Color_0_31_0, -1);
1035 if (i>-1 && !Control_center_destroyed)
1036 gr_printf(grd_curcanv->cv_w-w-LHX(10), LHX(11), score_str);
1042 //y offset between lines on HUD
1045 void hud_show_score_added()
1051 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1054 if (score_display[0] == 0)
1057 gr_set_curfont( GAME_FONT );
1059 score_time -= FrameTime;
1060 if (score_time > 0) {
1061 color = f2i(score_time * 20) + 12;
1063 if (color < 10) color = 12;
1064 if (color > 31) color = 30;
1066 color = color - (color % 4); // Only allowing colors 12,16,20,24,28 speeds up gr_getcolor, improves caching
1069 sprintf(score_str, "%s", TXT_CHEATER);
1071 sprintf(score_str, "%5d", score_display[0]);
1073 gr_get_string_size(score_str, &w, &h, &aw );
1074 gr_set_fontcolor(gr_getcolor(0, color, 0),-1 );
1075 gr_printf(grd_curcanv->cv_w-w-LHX(2+10), Line_spacing+4, score_str);
1078 score_display[0] = 0;
1083 void sb_show_score()
1088 static int last_x[4]={SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_H,SB_SCORE_RIGHT_H};
1091 WIN(DDGRLOCK(dd_grd_curcanv));
1092 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1097 if (old_score[VR_current_page]==redraw_score) {
1098 gr_set_curfont( GAME_FONT );
1099 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1101 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1103 PA_DFX(pa_set_frontbuffer_current());
1104 PA_DFX(gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_KILLS));
1105 PA_DFX(pa_set_backbuffer_current());
1106 gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_KILLS);
1110 PA_DFX (pa_set_frontbuffer_current() );
1111 PA_DFX (gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_SCORE) );
1112 PA_DFX(pa_set_backbuffer_current());
1113 gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_SCORE);
1117 gr_set_curfont( GAME_FONT );
1118 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1119 sprintf(score_str, "%5d", Players[Player_num].net_kills_total);
1121 sprintf(score_str, "%5d", Players[Player_num].score);
1122 gr_get_string_size(score_str, &w, &h, &aw );
1124 x = SB_SCORE_RIGHT-w-LHX(2);
1128 gr_setcolor(BM_XRGB(0,0,0));
1129 PA_DFX (pa_set_frontbuffer_current());
1130 PA_DFX (gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],y,SB_SCORE_RIGHT,y+GAME_FONT->ft_h));
1131 PA_DFX(pa_set_backbuffer_current());
1132 gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],y,SB_SCORE_RIGHT,y+GAME_FONT->ft_h);
1134 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1135 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1137 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1139 PA_DFX (pa_set_frontbuffer_current());
1140 PA_DFX (gr_printf(x,y,score_str));
1141 PA_DFX(pa_set_backbuffer_current());
1142 gr_printf(x,y,score_str);
1144 last_x[(Current_display_mode?2:0)+VR_current_page] = x;
1145 WIN(DDGRUNLOCK(dd_grd_curcanv));
1148 void sb_show_score_added()
1154 static int last_x[4]={SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_H,SB_SCORE_RIGHT_H};
1155 static int last_score_display[2] = { -1, -1};
1159 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1162 if (score_display[VR_current_page] == 0)
1165 WIN(DDGRLOCK(dd_grd_curcanv));
1166 gr_set_curfont( GAME_FONT );
1168 score_time -= FrameTime;
1169 if (score_time > 0) {
1170 if (score_display[VR_current_page] != last_score_display[VR_current_page] || frc) {
1171 gr_setcolor(BM_XRGB(0,0,0));
1172 PA_DFX (pa_set_frontbuffer_current());
1173 PA_DFX (gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],SB_SCORE_ADDED_Y,SB_SCORE_ADDED_RIGHT,SB_SCORE_ADDED_Y+GAME_FONT->ft_h));
1174 PA_DFX(pa_set_backbuffer_current());
1175 gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],SB_SCORE_ADDED_Y,SB_SCORE_ADDED_RIGHT,SB_SCORE_ADDED_Y+GAME_FONT->ft_h);
1177 last_score_display[VR_current_page] = score_display[VR_current_page];
1180 color = f2i(score_time * 20) + 10;
1182 if (color < 10) color = 10;
1183 if (color > 31) color = 31;
1186 sprintf(score_str, "%s", TXT_CHEATER);
1188 sprintf(score_str, "%5d", score_display[VR_current_page]);
1190 gr_get_string_size(score_str, &w, &h, &aw );
1192 x = SB_SCORE_ADDED_RIGHT-w-LHX(2);
1194 gr_set_fontcolor(gr_getcolor(0, color, 0),-1 );
1196 PA_DFX (pa_set_frontbuffer_current());
1197 PA_DFX (gr_printf(x, SB_SCORE_ADDED_Y, score_str));
1198 PA_DFX(pa_set_backbuffer_current());
1199 gr_printf(x, SB_SCORE_ADDED_Y, score_str);
1202 last_x[(Current_display_mode?2:0)+VR_current_page] = x;
1206 gr_setcolor(BM_XRGB(0,0,0));
1207 PA_DFX (pa_set_frontbuffer_current());
1208 PA_DFX (gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],SB_SCORE_ADDED_Y,SB_SCORE_ADDED_RIGHT,SB_SCORE_ADDED_Y+GAME_FONT->ft_h));
1209 PA_DFX(pa_set_backbuffer_current());
1210 gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],SB_SCORE_ADDED_Y,SB_SCORE_ADDED_RIGHT,SB_SCORE_ADDED_Y+GAME_FONT->ft_h);
1213 score_display[VR_current_page] = 0;
1216 WIN(DDGRUNLOCK(dd_grd_curcanv));
1219 fix Last_warning_beep_time[2] = {0,0}; // Time we last played homing missile warning beep.
1221 // -----------------------------------------------------------------------------
1222 void play_homing_warning(void)
1226 if (Endlevel_sequence || Player_is_dead)
1229 if (Players[Player_num].homing_object_dist >= 0) {
1230 beep_delay = Players[Player_num].homing_object_dist/128;
1231 if (beep_delay > F1_0)
1233 else if (beep_delay < F1_0/8)
1234 beep_delay = F1_0/8;
1236 if (Last_warning_beep_time[VR_current_page] > GameTime)
1237 Last_warning_beep_time[VR_current_page] = 0;
1239 if (GameTime - Last_warning_beep_time[VR_current_page] > beep_delay/2) {
1240 digi_play_sample( SOUND_HOMING_WARNING, F1_0 );
1241 Last_warning_beep_time[VR_current_page] = GameTime;
1246 int Last_homing_warning_shown[2]={-1,-1};
1248 // -----------------------------------------------------------------------------
1249 void show_homing_warning(void)
1251 if ((Cockpit_mode == CM_STATUS_BAR) || (Endlevel_sequence)) {
1252 if (Last_homing_warning_shown[VR_current_page] == 1) {
1253 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_OFF );
1255 WIN(DDGRLOCK(dd_grd_curcanv));
1256 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_OFF) ] );
1257 WIN(DDGRUNLOCK(dd_grd_curcanv));
1259 Last_homing_warning_shown[VR_current_page] = 0;
1265 dd_gr_set_current_canvas( get_current_game_screen() ),
1266 gr_set_current_canvas( get_current_game_screen() )
1270 WIN(DDGRLOCK(dd_grd_curcanv))
1272 if (Players[Player_num].homing_object_dist >= 0) {
1274 if (GameTime & 0x4000) {
1275 if (Last_homing_warning_shown[VR_current_page] != 1) {
1276 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_ON );
1277 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_ON) ] );
1278 Last_homing_warning_shown[VR_current_page] = 1;
1281 if (Last_homing_warning_shown[VR_current_page] != 0) {
1282 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_OFF );
1283 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_OFF) ] );
1284 Last_homing_warning_shown[VR_current_page] = 0;
1287 } else if (Last_homing_warning_shown[VR_current_page] != 0) {
1288 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_OFF );
1289 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_OFF) ] );
1290 Last_homing_warning_shown[VR_current_page] = 0;
1293 WIN(DDGRUNLOCK(dd_grd_curcanv));
1297 #define MAX_SHOWN_LIVES 4
1299 extern int Game_window_y;
1302 void hud_show_homing_warning(void)
1304 if (Players[Player_num].homing_object_dist >= 0) {
1305 if (GameTime & 0x4000) {
1306 int x=0x8000, y=grd_curcanv->cv_h-Line_spacing;
1308 if (weapon_box_user[0] != WBU_WEAPON || weapon_box_user[1] != WBU_WEAPON) {
1309 int wy = (weapon_box_user[0] != WBU_WEAPON)?SW_y[0]:SW_y[1];
1310 y = min(y,(wy - Line_spacing - Game_window_y));
1313 gr_set_curfont( GAME_FONT );
1314 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1315 gr_printf(x,y,TXT_LOCK);
1320 void hud_show_keys(void)
1322 int y = 3*Line_spacing;
1323 int dx = GAME_FONT->ft_w+GAME_FONT->ft_w/2;
1325 if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY) {
1326 PAGE_IN_GAUGE( KEY_ICON_BLUE );
1327 gr_ubitmapm(2,y,&GameBitmaps[ GET_GAUGE_INDEX(KEY_ICON_BLUE) ] );
1331 if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) {
1332 PAGE_IN_GAUGE( KEY_ICON_YELLOW );
1333 gr_ubitmapm(2+dx,y,&GameBitmaps[ GET_GAUGE_INDEX(KEY_ICON_YELLOW) ] );
1336 if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) {
1337 PAGE_IN_GAUGE( KEY_ICON_RED );
1338 gr_ubitmapm(2+2*dx,y,&GameBitmaps[ GET_GAUGE_INDEX(KEY_ICON_RED) ] );
1344 extern grs_bitmap Orb_icons[2];
1346 void hud_show_orbs (void)
1348 if (Game_mode & GM_HOARD) {
1354 if (Cockpit_mode == CM_FULL_COCKPIT) {
1356 x = 4*GAME_FONT->ft_w;
1358 else if (Cockpit_mode == CM_STATUS_BAR) {
1360 x = GAME_FONT->ft_w;
1362 else if (Cockpit_mode == CM_FULL_SCREEN) {
1364 x = GAME_FONT->ft_w;
1369 Int3(); //what sort of cockpit?
1371 bm = &Orb_icons[FontHires];
1372 gr_ubitmapm(x,y,bm);
1374 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1375 gr_printf(x+bm->bm_w+bm->bm_w/2, y+(FontHires?2:1), "x %d", Players[Player_num].secondary_ammo[PROXIMITY_INDEX]);
1380 void hud_show_flag(void)
1382 if ((Game_mode & GM_CAPTURE) && (Players[Player_num].flags & PLAYER_FLAGS_FLAG)) {
1387 if (Cockpit_mode == CM_FULL_COCKPIT) {
1389 x = 4*GAME_FONT->ft_w;
1391 else if (Cockpit_mode == CM_STATUS_BAR) {
1393 x = GAME_FONT->ft_w;
1395 else if (Cockpit_mode == CM_FULL_SCREEN) {
1397 x = GAME_FONT->ft_w;
1402 Int3(); //what sort of cockpit?
1405 icon = (get_team(Player_num) == TEAM_BLUE)?FLAG_ICON_RED:FLAG_ICON_BLUE;
1407 PAGE_IN_GAUGE( icon );
1408 gr_ubitmapm(x,y,&GameBitmaps[ GET_GAUGE_INDEX(icon) ] );
1414 void hud_show_energy(void)
1416 //gr_set_current_canvas(&VR_render_sub_buffer[0]); //render off-screen
1417 gr_set_curfont( GAME_FONT );
1418 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1419 if (Game_mode & GM_MULTI)
1420 gr_printf(2, grd_curcanv->cv_h-5*Line_spacing,"%s: %i", TXT_ENERGY, f2ir(Players[Player_num].energy));
1422 gr_printf(2, grd_curcanv->cv_h-Line_spacing,"%s: %i", TXT_ENERGY, f2ir(Players[Player_num].energy));
1424 if (Newdemo_state==ND_STATE_RECORDING ) {
1425 int energy = f2ir(Players[Player_num].energy);
1427 if (energy != old_energy[VR_current_page]) {
1428 newdemo_record_player_energy(old_energy[VR_current_page], energy);
1429 old_energy[VR_current_page] = energy;
1434 void hud_show_afterburner(void)
1438 if (! (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER))
1439 return; //don't draw if don't have
1441 gr_set_curfont( GAME_FONT );
1442 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1444 y = (Game_mode & GM_MULTI)?(-8*Line_spacing):(-3*Line_spacing);
1446 gr_printf(2, grd_curcanv->cv_h+y, "burn: %d%%" , fixmul(Afterburner_charge,100));
1448 if (Newdemo_state==ND_STATE_RECORDING ) {
1450 if (Afterburner_charge != old_afterburner[VR_current_page]) {
1451 newdemo_record_player_afterburner(old_afterburner[VR_current_page], Afterburner_charge);
1452 old_afterburner[VR_current_page] = Afterburner_charge;
1457 char *d2_very_short_secondary_weapon_names[] =
1458 {"Flash","Guided","SmrtMine","Mercury","Shaker"};
1460 #define SECONDARY_WEAPON_NAMES_VERY_SHORT(weapon_num) \
1461 ((weapon_num <= MEGA_INDEX)?(*(&TXT_CONCUSSION + (weapon_num))): \
1462 d2_very_short_secondary_weapon_names[weapon_num-SMISSILE1_INDEX])
1464 //return which bomb will be dropped next time the bomb key is pressed
1465 extern int which_bomb();
1467 void show_bomb_count(int x,int y,int bg_color,int always_show)
1469 int bomb,count,countx;
1472 bomb = which_bomb();
1473 count = Players[Player_num].secondary_ammo[bomb];
1476 count = min(count,99); //only have room for 2 digits - cheating give 200
1479 countx = (bomb==PROXIMITY_INDEX)?count:-count;
1481 if (always_show && count == 0) //no bombs, draw nothing on HUD
1484 if (!always_show && countx == old_bombcount[VR_current_page])
1487 WIN(DDGRLOCK(dd_grd_curcanv));
1489 // I hate doing this off of hard coded coords!!!!
1491 if (Cockpit_mode == CM_STATUS_BAR) { //draw background
1492 gr_setcolor(bg_color);
1493 if (!Current_display_mode) {
1494 gr_rect(169,189,189,196);
1495 gr_setcolor(gr_find_closest_color(10,10,10));
1496 gr_scanline(168,189,189);
1498 PA_DFX (pa_set_frontbuffer_current());
1499 PA_DFX (gr_rect(338,453,378,470));
1500 PA_DFX(pa_set_backbuffer_current());
1501 gr_rect(338,453,378,470);
1503 gr_setcolor(gr_find_closest_color(10,10,10));
1504 PA_DFX (pa_set_frontbuffer_current());
1505 PA_DFX (gr_scanline(336,378,453));
1506 PA_DFX(pa_set_backbuffer_current());
1507 gr_scanline(336,378,453);
1512 gr_set_fontcolor((bomb==PROXIMITY_INDEX)?gr_find_closest_color(55,0,0):gr_getcolor(59,50,21),bg_color);
1514 gr_set_fontcolor(bg_color,bg_color); //erase by drawing in background color
1516 sprintf(txt,"B:%02d",count);
1518 while ((t=strchr(txt,'1')) != NULL)
1519 *t = '\x84'; //convert to wide '1'
1521 PA_DFX (pa_set_frontbuffer_current());
1522 PA_DFX (gr_string(x,y,txt));
1523 PA_DFX(pa_set_backbuffer_current());
1526 WIN(DDGRUNLOCK(dd_grd_curcanv));
1528 old_bombcount[VR_current_page] = countx;
1531 void draw_primary_ammo_info(int ammo_count)
1533 if (Cockpit_mode == CM_STATUS_BAR)
1534 draw_ammo_info(SB_PRIMARY_AMMO_X,SB_PRIMARY_AMMO_Y,ammo_count,1);
1536 draw_ammo_info(PRIMARY_AMMO_X,PRIMARY_AMMO_Y,ammo_count,1);
1539 //convert '1' characters to special wide ones
1540 #define convert_1s(s) do {char *p=s; while ((p=strchr(p,'1')) != NULL) *p=132;} while(0)
1542 void hud_show_weapons(void)
1547 char weapon_str[32];
1549 // gr_set_current_canvas(&VR_render_sub_buffer[0]); //render off-screen
1550 gr_set_curfont( GAME_FONT );
1551 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1553 y = grd_curcanv->cv_h;
1555 if (Game_mode & GM_MULTI)
1556 y -= 4*Line_spacing;
1558 weapon_name = PRIMARY_WEAPON_NAMES_SHORT(Primary_weapon);
1560 switch (Primary_weapon) {
1562 if (Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)
1563 sprintf(weapon_str, "%s %s %i", TXT_QUAD, weapon_name, Players[Player_num].laser_level+1);
1565 sprintf(weapon_str, "%s %i", weapon_name, Players[Player_num].laser_level+1);
1568 case SUPER_LASER_INDEX: Int3(); break; //no such thing as super laser
1572 sprintf(weapon_str, "%s: %i", weapon_name, f2i((unsigned) Players[Player_num].primary_ammo[VULCAN_INDEX] * (unsigned) VULCAN_AMMO_SCALE));
1573 convert_1s(weapon_str);
1576 case SPREADFIRE_INDEX:
1581 strcpy(weapon_str, weapon_name);
1584 sprintf(weapon_str, "%s: %03i", weapon_name, Omega_charge * 100/MAX_OMEGA_CHARGE);
1585 convert_1s(weapon_str);
1588 default: Int3(); weapon_str[0] = 0; break;
1591 gr_get_string_size(weapon_str, &w, &h, &aw );
1592 gr_printf(grd_curcanv->cv_bitmap.bm_w-5-w, y-2*Line_spacing, weapon_str);
1594 if (Primary_weapon == VULCAN_INDEX) {
1595 if (Players[Player_num].primary_ammo[Primary_weapon] != old_ammo_count[0][VR_current_page]) {
1596 if (Newdemo_state == ND_STATE_RECORDING)
1597 newdemo_record_primary_ammo(old_ammo_count[0][VR_current_page], Players[Player_num].primary_ammo[Primary_weapon]);
1598 old_ammo_count[0][VR_current_page] = Players[Player_num].primary_ammo[Primary_weapon];
1602 if (Primary_weapon == OMEGA_INDEX) {
1603 if (Omega_charge != Old_Omega_charge[VR_current_page]) {
1604 if (Newdemo_state == ND_STATE_RECORDING)
1605 newdemo_record_primary_ammo(Old_Omega_charge[VR_current_page], Omega_charge);
1606 Old_Omega_charge[VR_current_page] = Omega_charge;
1610 weapon_name = SECONDARY_WEAPON_NAMES_VERY_SHORT(Secondary_weapon);
1612 sprintf(weapon_str, "%s %d",weapon_name,Players[Player_num].secondary_ammo[Secondary_weapon]);
1613 gr_get_string_size(weapon_str, &w, &h, &aw );
1614 gr_printf(grd_curcanv->cv_bitmap.bm_w-5-w, y-Line_spacing, weapon_str);
1616 if (Players[Player_num].secondary_ammo[Secondary_weapon] != old_ammo_count[1][VR_current_page]) {
1617 if (Newdemo_state == ND_STATE_RECORDING)
1618 newdemo_record_secondary_ammo(old_ammo_count[1][VR_current_page], Players[Player_num].secondary_ammo[Secondary_weapon]);
1619 old_ammo_count[1][VR_current_page] = Players[Player_num].secondary_ammo[Secondary_weapon];
1622 show_bomb_count(grd_curcanv->cv_bitmap.bm_w-(3*GAME_FONT->ft_w+(FontHires?0:2)), y-3*Line_spacing,-1,1);
1625 void hud_show_cloak_invuln(void)
1627 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1629 if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) {
1630 int y = grd_curcanv->cv_h;
1632 if (Game_mode & GM_MULTI)
1633 y -= 7*Line_spacing;
1635 y -= 4*Line_spacing;
1637 if ((Players[Player_num].cloak_time+CLOAK_TIME_MAX - GameTime > F1_0*3 ) || (GameTime & 0x8000))
1638 gr_printf(2, y, "%s", TXT_CLOAKED);
1641 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
1642 int y = grd_curcanv->cv_h;
1644 if (Game_mode & GM_MULTI)
1645 y -= 10*Line_spacing;
1647 y -= 5*Line_spacing;
1649 if (((Players[Player_num].invulnerable_time + INVULNERABLE_TIME_MAX - GameTime) > F1_0*4) || (GameTime & 0x8000))
1650 gr_printf(2, y, "%s", TXT_INVULNERABLE);
1655 void hud_show_shield(void)
1657 // gr_set_current_canvas(&VR_render_sub_buffer[0]); //render off-screen
1658 gr_set_curfont( GAME_FONT );
1659 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1661 if ( Players[Player_num].shields >= 0 ) {
1662 if (Game_mode & GM_MULTI)
1663 gr_printf(2, grd_curcanv->cv_h-6*Line_spacing,"%s: %i", TXT_SHIELD, f2ir(Players[Player_num].shields));
1665 gr_printf(2, grd_curcanv->cv_h-2*Line_spacing,"%s: %i", TXT_SHIELD, f2ir(Players[Player_num].shields));
1667 if (Game_mode & GM_MULTI)
1668 gr_printf(2, grd_curcanv->cv_h-6*Line_spacing,"%s: 0", TXT_SHIELD );
1670 gr_printf(2, grd_curcanv->cv_h-2*Line_spacing,"%s: 0", TXT_SHIELD );
1673 if (Newdemo_state==ND_STATE_RECORDING ) {
1674 int shields = f2ir(Players[Player_num].shields);
1676 if (shields != old_shields[VR_current_page]) { // Draw the shield gauge
1677 newdemo_record_player_shields(old_shields[VR_current_page], shields);
1678 old_shields[VR_current_page] = shields;
1683 //draw the icons for number of lives
1684 void hud_show_lives()
1686 if ((HUD_nmessages > 0) && (strlen(HUD_messages[hud_first]) > 38))
1689 if (Game_mode & GM_MULTI) {
1690 gr_set_curfont( GAME_FONT );
1691 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1692 gr_printf(10, 3, "%s: %d", TXT_DEATHS, Players[Player_num].net_killed_total);
1694 else if (Players[Player_num].lives > 1) {
1696 gr_set_curfont( GAME_FONT );
1697 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1698 PAGE_IN_GAUGE( GAUGE_LIVES );
1699 bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_LIVES) ];
1700 gr_ubitmapm(10,3,bm);
1701 gr_printf(10+bm->bm_w+bm->bm_w/2, 4, "x %d", Players[Player_num].lives-1);
1706 void sb_show_lives()
1709 grs_bitmap * bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_LIVES) ];
1716 WIN(DDGRLOCK(dd_grd_curcanv));
1717 if (old_lives[VR_current_page]==-1 || frc) {
1718 gr_set_curfont( GAME_FONT );
1719 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1720 if (Game_mode & GM_MULTI)
1722 PA_DFX (pa_set_frontbuffer_current());
1723 PA_DFX (gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_DEATHS));
1724 PA_DFX (pa_set_backbuffer_current());
1725 gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_DEATHS);
1730 PA_DFX (pa_set_frontbuffer_current());
1731 PA_DFX (gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_LIVES));
1732 PA_DFX (pa_set_backbuffer_current());
1733 gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_LIVES);
1737 WIN(DDGRUNLOCK(dd_grd_curcanv));
1739 if (Game_mode & GM_MULTI)
1741 char killed_str[20];
1743 static int last_x[4] = {SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_H,SB_SCORE_RIGHT_H};
1746 WIN(DDGRLOCK(dd_grd_curcanv));
1747 sprintf(killed_str, "%5d", Players[Player_num].net_killed_total);
1748 gr_get_string_size(killed_str, &w, &h, &aw);
1749 gr_setcolor(BM_XRGB(0,0,0));
1750 gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page], y+1, SB_SCORE_RIGHT, y+GAME_FONT->ft_h);
1751 gr_set_fontcolor(gr_getcolor(0,20,0),-1);
1752 x = SB_SCORE_RIGHT-w-2;
1753 gr_printf(x, y+1, killed_str);
1754 last_x[(Current_display_mode?2:0)+VR_current_page] = x;
1755 WIN(DDGRUNLOCK(dd_grd_curcanv));
1759 if (frc || old_lives[VR_current_page]==-1 || Players[Player_num].lives != old_lives[VR_current_page]) {
1760 WIN(DDGRLOCK(dd_grd_curcanv));
1764 gr_setcolor(BM_XRGB(0,0,0));
1766 PA_DFX (pa_set_frontbuffer_current());
1767 gr_rect(x, y, SB_SCORE_RIGHT, y+bm->bm_h);
1768 PA_DFX (pa_set_backbuffer_current());
1769 gr_rect(x, y, SB_SCORE_RIGHT, y+bm->bm_h);
1771 if (Players[Player_num].lives-1 > 0) {
1772 gr_set_curfont( GAME_FONT );
1773 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1774 PAGE_IN_GAUGE( GAUGE_LIVES );
1775 #ifdef PA_3DFX_VOODOO
1776 PA_DFX (pa_set_frontbuffer_current());
1777 gr_ubitmapm(x, y,bm);
1778 gr_printf(x+bm->bm_w+GAME_FONT->ft_w, y, "x %d", Players[Player_num].lives-1);
1781 PA_DFX (pa_set_backbuffer_current());
1782 gr_ubitmapm(x, y,bm);
1783 gr_printf(x+bm->bm_w+GAME_FONT->ft_w, y, "x %d", Players[Player_num].lives-1);
1785 // gr_printf(x+12, y, "x %d", Players[Player_num].lives-1);
1787 WIN(DDGRUNLOCK(dd_grd_curcanv));
1790 // for (i=0;i<draw_count;i++,x+=bm->bm_w+2)
1791 // gr_ubitmapm(x,y,bm);
1797 #ifdef PIGGY_USE_PAGING
1798 extern int Piggy_bitmap_cache_next;
1803 int secs = f2i(Players[Player_num].time_level) % 60;
1804 int mins = f2i(Players[Player_num].time_level) / 60;
1806 gr_set_curfont( GAME_FONT );
1808 if (Color_0_31_0 == -1)
1809 Color_0_31_0 = gr_getcolor(0,31,0);
1810 gr_set_fontcolor(Color_0_31_0, -1 );
1812 gr_printf(grd_curcanv->cv_w-4*GAME_FONT->ft_w,grd_curcanv->cv_h-4*Line_spacing,"%d:%02d", mins, secs);
1814 //@@#ifdef PIGGY_USE_PAGING
1818 //@@ sprintf( text, "%d KB", Piggy_bitmap_cache_next/1024 );
1819 //@@ gr_get_string_size( text, &w, &h, &aw );
1820 //@@ gr_printf(grd_curcanv->cv_w-10-w,grd_curcanv->cv_h/2, text );
1827 #define EXTRA_SHIP_SCORE 50000 //get new ship every this many points
1829 void add_points_to_score(int points)
1833 score_time += f1_0*2;
1834 score_display[0] += points;
1835 score_display[1] += points;
1836 if (score_time > f1_0*4) score_time = f1_0*4;
1838 if (points == 0 || Cheats_enabled)
1841 if ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))
1844 prev_score=Players[Player_num].score;
1846 Players[Player_num].score += points;
1848 if (Newdemo_state == ND_STATE_RECORDING)
1849 newdemo_record_player_score(points);
1852 if (Game_mode & GM_MULTI_COOP)
1855 if (Game_mode & GM_MULTI)
1859 if (Players[Player_num].score/EXTRA_SHIP_SCORE != prev_score/EXTRA_SHIP_SCORE) {
1861 Players[Player_num].lives += Players[Player_num].score/EXTRA_SHIP_SCORE - prev_score/EXTRA_SHIP_SCORE;
1862 powerup_basic(20, 20, 20, 0, TXT_EXTRA_LIFE);
1863 if ((snd=Powerup_info[POW_EXTRA_LIFE].hit_sound) > -1 )
1864 digi_play_sample( snd, F1_0 );
1868 void add_bonus_points_to_score(int points)
1872 if (points == 0 || Cheats_enabled)
1875 prev_score=Players[Player_num].score;
1877 Players[Player_num].score += points;
1880 if (Newdemo_state == ND_STATE_RECORDING)
1881 newdemo_record_player_score(points);
1883 if (Game_mode & GM_MULTI)
1886 if (Players[Player_num].score/EXTRA_SHIP_SCORE != prev_score/EXTRA_SHIP_SCORE) {
1888 Players[Player_num].lives += Players[Player_num].score/EXTRA_SHIP_SCORE - prev_score/EXTRA_SHIP_SCORE;
1889 if ((snd=Powerup_info[POW_EXTRA_LIFE].hit_sound) > -1 )
1890 digi_play_sample( snd, F1_0 );
1896 void init_gauge_canvases()
1898 PAGE_IN_GAUGE( SB_GAUGE_ENERGY );
1899 PAGE_IN_GAUGE( GAUGE_AFTERBURNER );
1901 Canv_LeftEnergyGauge = gr_create_canvas( LEFT_ENERGY_GAUGE_W, LEFT_ENERGY_GAUGE_H );
1902 Canv_SBEnergyGauge = gr_create_canvas( SB_ENERGY_GAUGE_W, SB_ENERGY_GAUGE_H );
1903 Canv_SBAfterburnerGauge = gr_create_canvas( SB_AFTERBURNER_GAUGE_W, SB_AFTERBURNER_GAUGE_H );
1904 Canv_RightEnergyGauge = gr_create_canvas( RIGHT_ENERGY_GAUGE_W, RIGHT_ENERGY_GAUGE_H );
1905 Canv_NumericalGauge = gr_create_canvas( NUMERICAL_GAUGE_W, NUMERICAL_GAUGE_H );
1906 Canv_AfterburnerGauge = gr_create_canvas( AFTERBURNER_GAUGE_W, AFTERBURNER_GAUGE_H );
1910 void close_gauge_canvases()
1912 gr_free_canvas( Canv_LeftEnergyGauge );
1913 gr_free_canvas( Canv_SBEnergyGauge );
1914 gr_free_canvas( Canv_SBAfterburnerGauge );
1915 gr_free_canvas( Canv_RightEnergyGauge );
1916 gr_free_canvas( Canv_NumericalGauge );
1917 gr_free_canvas( Canv_AfterburnerGauge );
1924 //draw_gauges_on = 1;
1926 for (i=0; i<2; i++ ) {
1927 if ( ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) || ((Newdemo_state == ND_STATE_PLAYBACK) && (Newdemo_game_mode & GM_MULTI) && !(Newdemo_game_mode & GM_MULTI_COOP)) )
1932 old_shields[i] = -1;
1936 old_afterburner[i] = -1;
1937 old_bombcount[i] = 0;
1938 old_laser_level[i] = 0;
1940 old_weapon[0][i] = old_weapon[1][i] = -1;
1941 old_ammo_count[0][i] = old_ammo_count[1][i] = -1;
1942 Old_Omega_charge[i] = -1;
1945 cloak_fade_state = 0;
1947 weapon_box_user[0] = weapon_box_user[1] = WBU_WEAPON;
1950 void draw_energy_bar(int energy)
1955 // Draw left energy bar
1956 gr_set_current_canvas( Canv_LeftEnergyGauge );
1957 PAGE_IN_GAUGE( GAUGE_ENERGY_LEFT );
1958 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_ENERGY_LEFT)] );
1959 gr_setcolor( BM_XRGB(0,0,0) );
1961 if ( !Current_display_mode )
1962 not_energy = 61 - (energy*61)/100;
1964 not_energy = 125 - (energy*125)/100;
1967 for (y=0; y < LEFT_ENERGY_GAUGE_H; y++) {
1968 x1 = LEFT_ENERGY_GAUGE_H - 1 - y;
1969 x2 = LEFT_ENERGY_GAUGE_H - 1 - y + not_energy;
1971 if ( y>=0 && y<(LEFT_ENERGY_GAUGE_H/4) ) if (x2 > LEFT_ENERGY_GAUGE_W - 1) x2 = LEFT_ENERGY_GAUGE_W - 1;
1972 if ( y>=(LEFT_ENERGY_GAUGE_H/4) && y<((LEFT_ENERGY_GAUGE_H*3)/4) ) if (x2 > LEFT_ENERGY_GAUGE_W - 2) x2 = LEFT_ENERGY_GAUGE_W - 2;
1973 if ( y>=((LEFT_ENERGY_GAUGE_H*3)/4) ) if (x2 > LEFT_ENERGY_GAUGE_W - 3) x2 = LEFT_ENERGY_GAUGE_W - 3;
1975 if (x2 > x1) gr_uscanline( x1, x2, y );
1979 dd_gr_set_current_canvas(get_current_game_screen()),
1980 gr_set_current_canvas( get_current_game_screen() )
1982 WIN(DDGRLOCK(dd_grd_curcanv));
1983 gr_ubitmapm( LEFT_ENERGY_GAUGE_X, LEFT_ENERGY_GAUGE_Y, &Canv_LeftEnergyGauge->cv_bitmap );
1984 WIN(DDGRUNLOCK(dd_grd_curcanv));
1986 // Draw right energy bar
1987 gr_set_current_canvas( Canv_RightEnergyGauge );
1988 PAGE_IN_GAUGE( GAUGE_ENERGY_RIGHT );
1989 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_ENERGY_RIGHT) ] );
1990 gr_setcolor( BM_XRGB(0,0,0) );
1993 for (y=0; y < RIGHT_ENERGY_GAUGE_H; y++) {
1994 x1 = RIGHT_ENERGY_GAUGE_W - RIGHT_ENERGY_GAUGE_H + y - not_energy;
1995 x2 = RIGHT_ENERGY_GAUGE_W - RIGHT_ENERGY_GAUGE_H + y;
1997 if ( y>=0 && y<(RIGHT_ENERGY_GAUGE_H/4) ) if (x1 < 0) x1 = 0;
1998 if ( y>=(RIGHT_ENERGY_GAUGE_H/4) && y<((RIGHT_ENERGY_GAUGE_H*3)/4) ) if (x1 < 1) x1 = 1;
1999 if ( y>=((RIGHT_ENERGY_GAUGE_H*3)/4) ) if (x1 < 2) x1 = 2;
2001 if (x2 > x1) gr_uscanline( x1, x2, y );
2005 dd_gr_set_current_canvas(get_current_game_screen()),
2006 gr_set_current_canvas( get_current_game_screen() )
2008 WIN(DDGRLOCK(dd_grd_curcanv));
2009 gr_ubitmapm( RIGHT_ENERGY_GAUGE_X, RIGHT_ENERGY_GAUGE_Y, &Canv_RightEnergyGauge->cv_bitmap );
2010 WIN(DDGRUNLOCK(dd_grd_curcanv));
2013 ubyte afterburner_bar_table[AFTERBURNER_GAUGE_H_L*2] = {
2048 ubyte afterburner_bar_table_hires[AFTERBURNER_GAUGE_H_H*2] = {
2123 void draw_afterburner_bar(int afterburner)
2125 int not_afterburner;
2128 // Draw afterburner bar
2129 gr_set_current_canvas( Canv_AfterburnerGauge );
2130 PAGE_IN_GAUGE( GAUGE_AFTERBURNER );
2131 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_AFTERBURNER) ] );
2132 gr_setcolor( BM_XRGB(0,0,0) );
2134 not_afterburner = fixmul(f1_0 - afterburner,AFTERBURNER_GAUGE_H);
2136 for (y=0;y<not_afterburner;y++) {
2138 gr_uscanline( (Current_display_mode?afterburner_bar_table_hires[y*2]:afterburner_bar_table[y*2]),
2139 (Current_display_mode?afterburner_bar_table_hires[y*2+1]:afterburner_bar_table[y*2+1]), y );
2143 dd_gr_set_current_canvas(get_current_game_screen()),
2144 gr_set_current_canvas( get_current_game_screen() )
2146 WIN(DDGRLOCK(dd_grd_curcanv));
2147 gr_ubitmapm( AFTERBURNER_GAUGE_X, AFTERBURNER_GAUGE_Y, &Canv_AfterburnerGauge->cv_bitmap );
2148 WIN(DDGRUNLOCK(dd_grd_curcanv));
2151 void draw_shield_bar(int shield)
2153 int bm_num = shield>=100?9:(shield / 10);
2155 PAGE_IN_GAUGE( GAUGE_SHIELDS+9-bm_num );
2156 WIN(DDGRLOCK(dd_grd_curcanv));
2157 PA_DFX (pa_set_frontbuffer_current());
2158 PA_DFX (gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] ));
2159 PA_DFX (pa_set_backbuffer_current());
2160 gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] );
2162 WIN(DDGRUNLOCK(dd_grd_curcanv));
2165 #define CLOAK_FADE_WAIT_TIME 0x400
2167 void draw_player_ship(int cloak_state,int old_cloak_state,int x, int y)
2169 static fix cloak_fade_timer=0;
2170 static int cloak_fade_value=GR_FADE_LEVELS-1;
2171 static int refade = 0;
2172 grs_bitmap *bm = NULL;
2174 if (Game_mode & GM_TEAM) {
2176 PAGE_IN_GAUGE( GAUGE_SHIPS+get_team(Player_num) );
2177 bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIPS+get_team(Player_num)) ];
2180 PAGE_IN_GAUGE( GAUGE_SHIPS+Player_num );
2181 bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIPS+Player_num) ];
2185 if (old_cloak_state==-1 && cloak_state)
2188 // mprintf((0, "cloak/oldcloak %d/%d", cloak_state, old_cloak_state));
2191 cloak_fade_value=GR_FADE_LEVELS-1;
2192 cloak_fade_state = 0;
2195 if (cloak_state==1 && old_cloak_state==0)
2196 cloak_fade_state = -1;
2197 //else if (cloak_state==0 && old_cloak_state==1)
2198 // cloak_fade_state = 1;
2200 if (cloak_state==old_cloak_state) //doing "about-to-uncloak" effect
2201 if (cloak_fade_state==0)
2202 cloak_fade_state = 2;
2205 if (cloak_fade_state)
2206 cloak_fade_timer -= FrameTime;
2208 while (cloak_fade_state && cloak_fade_timer < 0) {
2210 cloak_fade_timer += CLOAK_FADE_WAIT_TIME;
2212 cloak_fade_value += cloak_fade_state;
2214 if (cloak_fade_value >= GR_FADE_LEVELS-1) {
2215 cloak_fade_value = GR_FADE_LEVELS-1;
2216 if (cloak_fade_state == 2 && cloak_state)
2217 cloak_fade_state = -2;
2219 cloak_fade_state = 0;
2221 else if (cloak_fade_value <= 0) {
2222 cloak_fade_value = 0;
2223 if (cloak_fade_state == -2)
2224 cloak_fade_state = 2;
2226 cloak_fade_state = 0;
2230 // To fade out both pages in a paged mode.
2231 if (refade) refade = 0;
2232 else if (cloak_state && old_cloak_state && !cloak_fade_state && !refade) {
2233 cloak_fade_state = -1;
2237 #if defined(POLY_ACC)
2241 Gr_scanline_darkening_level = cloak_fade_value;
2242 gr_set_current_canvas( get_current_game_screen() );
2243 PA_DFX (pa_set_frontbuffer_current());
2244 PA_DFX (pa_blit_lit(&grd_curcanv->cv_bitmap, x, y, bm, 0, 0, bm->bm_w, bm->bm_h));
2245 PA_DFX (pa_set_backbuffer_current());
2246 pa_blit_lit(&grd_curcanv->cv_bitmap, x, y, bm, 0, 0, bm->bm_w, bm->bm_h);
2248 Gr_scanline_darkening_level = GR_FADE_LEVELS;
2252 // Gr_scanline_darkening_level = GR_FADE_LEVELS;
2253 // mprintf ((1,"HEY! HIT THIS!\n"));
2261 dd_gr_set_current_canvas(&dd_VR_render_buffer[0]),
2262 gr_set_current_canvas(&VR_render_buffer[0])
2265 WIN(DDGRLOCK(dd_grd_curcanv));
2266 gr_ubitmap( x, y, bm);
2268 Gr_scanline_darkening_level = cloak_fade_value;
2269 gr_rect(x, y, x+bm->bm_w-1, y+bm->bm_h-1);
2270 Gr_scanline_darkening_level = GR_FADE_LEVELS;
2271 WIN(DDGRUNLOCK(dd_grd_curcanv));
2274 dd_gr_set_current_canvas(get_current_game_screen()),
2275 gr_set_current_canvas( get_current_game_screen() )
2279 DDGRLOCK(dd_grd_curcanv);
2280 if (dd_grd_curcanv->lpdds != dd_VR_render_buffer[0].lpdds) {
2281 DDGRLOCK(&dd_VR_render_buffer[0]);
2284 dd_gr_dup_hack(&dd_VR_render_buffer[0], dd_grd_curcanv);
2288 gr_bm_ubitbltm( bm->bm_w, bm->bm_h, x, y, x, y, &dd_VR_render_buffer[0].canvas.cv_bitmap, &grd_curcanv->cv_bitmap),
2289 gr_bm_ubitbltm( bm->bm_w, bm->bm_h, x, y, x, y, &VR_render_buffer[0].cv_bitmap, &grd_curcanv->cv_bitmap)
2292 if (dd_grd_curcanv->lpdds != dd_VR_render_buffer[0].lpdds) {
2293 DDGRUNLOCK(&dd_VR_render_buffer[0]);
2296 dd_gr_dup_unhack(&dd_VR_render_buffer[0]);
2298 DDGRUNLOCK(dd_grd_curcanv);
2302 #define INV_FRAME_TIME (f1_0/10) //how long for each frame
2304 void draw_numerical_display(int shield, int energy)
2306 gr_set_current_canvas( Canv_NumericalGauge );
2307 gr_set_curfont( GAME_FONT );
2308 PAGE_IN_GAUGE( GAUGE_NUMERICAL );
2309 gr_ubitmap( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_NUMERICAL) ] );
2311 gr_set_fontcolor(gr_getcolor(14,14,23),-1 );
2313 if (!Current_display_mode) {
2314 gr_printf((shield>99)?3:((shield>9)?5:7),15,"%d",shield);
2315 gr_set_fontcolor(gr_getcolor(25,18,6),-1 );
2316 gr_printf((energy>99)?3:((energy>9)?5:7),2,"%d",energy);
2318 gr_printf((shield>99)?7:((shield>9)?11:15),33,"%d",shield);
2319 gr_set_fontcolor(gr_getcolor(25,18,6),-1 );
2320 gr_printf((energy>99)?7:((energy>9)?11:15),4,"%d",energy);
2324 dd_gr_set_current_canvas(get_current_game_screen()),
2325 gr_set_current_canvas( get_current_game_screen() )
2327 WIN(DDGRLOCK(dd_grd_curcanv));
2328 gr_ubitmapm( NUMERICAL_GAUGE_X, NUMERICAL_GAUGE_Y, &Canv_NumericalGauge->cv_bitmap );
2329 WIN(DDGRUNLOCK(dd_grd_curcanv));
2336 dd_gr_set_current_canvas( get_current_game_screen() ),
2337 gr_set_current_canvas( get_current_game_screen() )
2340 WIN(DDGRLOCK(dd_grd_curcanv));
2341 if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY ) {
2342 PAGE_IN_GAUGE( GAUGE_BLUE_KEY );
2343 gr_ubitmapm( GAUGE_BLUE_KEY_X, GAUGE_BLUE_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_BLUE_KEY) ] );
2345 PAGE_IN_GAUGE( GAUGE_BLUE_KEY_OFF );
2346 gr_ubitmapm( GAUGE_BLUE_KEY_X, GAUGE_BLUE_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_BLUE_KEY_OFF) ] );
2349 if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) {
2350 PAGE_IN_GAUGE( GAUGE_GOLD_KEY );
2351 gr_ubitmapm( GAUGE_GOLD_KEY_X, GAUGE_GOLD_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_GOLD_KEY) ] );
2353 PAGE_IN_GAUGE( GAUGE_GOLD_KEY_OFF );
2354 gr_ubitmapm( GAUGE_GOLD_KEY_X, GAUGE_GOLD_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_GOLD_KEY_OFF) ] );
2357 if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) {
2358 PAGE_IN_GAUGE( GAUGE_RED_KEY );
2359 gr_ubitmapm( GAUGE_RED_KEY_X, GAUGE_RED_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_RED_KEY) ] );
2361 PAGE_IN_GAUGE( GAUGE_RED_KEY_OFF );
2362 gr_ubitmapm( GAUGE_RED_KEY_X, GAUGE_RED_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_RED_KEY_OFF) ] );
2364 WIN(DDGRUNLOCK(dd_grd_curcanv));
2368 void draw_weapon_info_sub(int info_index,gauge_box *box,int pic_x,int pic_y,char *name,int text_x,int text_y)
2374 gr_setcolor(BM_XRGB(0,0,0));
2376 // PA_DFX (pa_set_frontbuffer_current());
2377 // PA_DFX (gr_rect(box->left,box->top,box->right,box->bot));
2378 PA_DFX (pa_set_backbuffer_current());
2379 gr_rect(box->left,box->top,box->right,box->bot);
2382 if (Current_display_mode) {
2383 bm=&GameBitmaps[Weapon_info[info_index].hires_picture.index];
2384 PIGGY_PAGE_IN( Weapon_info[info_index].hires_picture );
2387 bm=&GameBitmaps[Weapon_info[info_index].picture.index];
2388 PIGGY_PAGE_IN( Weapon_info[info_index].picture );
2395 // PA_DFX (pa_set_frontbuffer_current());
2396 // PA_DFX (gr_ubitmapm(pic_x,pic_y,bm));
2397 PA_DFX (pa_set_backbuffer_current());
2398 gr_ubitmapm(pic_x,pic_y,bm);
2400 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
2402 if ((p=strchr(name,'\n'))!=NULL) {
2404 #ifdef PA_3DFX_VOODOO
2405 // pa_set_frontbuffer_current();
2406 // gr_printf(text_x,text_y,name);
2407 // gr_printf(text_x,text_y+grd_curcanv->cv_font->ft_h+1,p+1);
2409 PA_DFX (pa_set_backbuffer_current());
2410 gr_printf(text_x,text_y,name);
2411 gr_printf(text_x,text_y+grd_curcanv->cv_font->ft_h+1,p+1);
2415 // PA_DFX(pa_set_frontbuffer_current());
2416 // PA_DFX (gr_printf(text_x,text_y,name));
2417 PA_DFX(pa_set_backbuffer_current());
2418 gr_printf(text_x,text_y,name);
2421 // For laser, show level and quadness
2422 if (info_index == LASER_ID || info_index == SUPER_LASER_ID) {
2425 sprintf(temp_str, "%s: 0", TXT_LVL);
2427 temp_str[5] = Players[Player_num].laser_level+1 + '0';
2429 // PA_DFX(pa_set_frontbuffer_current());
2430 // PA_DFX (gr_printf(text_x,text_y+Line_spacing, temp_str));
2431 PA_DFX(pa_set_backbuffer_current());
2432 NO_DFX (gr_printf(text_x,text_y+Line_spacing, temp_str));
2433 PA_DFX (gr_printf(text_x,text_y+12, temp_str));
2435 if (Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS) {
2436 strcpy(temp_str, TXT_QUAD);
2437 // PA_DFX(pa_set_frontbuffer_current());
2438 // PA_DFX (gr_printf(text_x,text_y+2*Line_spacing, temp_str));
2439 PA_DFX(pa_set_backbuffer_current());
2440 gr_printf(text_x,text_y+2*Line_spacing, temp_str);
2448 void draw_weapon_info(int weapon_type,int weapon_num,int laser_level)
2452 if (weapon_type == 0) {
2453 info_index = Primary_weapon_to_weapon_info[weapon_num];
2455 if (info_index == LASER_ID && laser_level > MAX_LASER_LEVEL)
2456 info_index = SUPER_LASER_ID;
2458 if (Cockpit_mode == CM_STATUS_BAR)
2459 draw_weapon_info_sub(info_index,
2460 &gauge_boxes[SB_PRIMARY_BOX],
2461 SB_PRIMARY_W_PIC_X,SB_PRIMARY_W_PIC_Y,
2462 PRIMARY_WEAPON_NAMES_SHORT(weapon_num),
2463 SB_PRIMARY_W_TEXT_X,SB_PRIMARY_W_TEXT_Y);
2465 draw_weapon_info_sub(info_index,
2466 &gauge_boxes[COCKPIT_PRIMARY_BOX],
2467 PRIMARY_W_PIC_X,PRIMARY_W_PIC_Y,
2468 PRIMARY_WEAPON_NAMES_SHORT(weapon_num),
2469 PRIMARY_W_TEXT_X,PRIMARY_W_TEXT_Y);
2473 info_index = Secondary_weapon_to_weapon_info[weapon_num];
2475 if (Cockpit_mode == CM_STATUS_BAR)
2476 draw_weapon_info_sub(info_index,
2477 &gauge_boxes[SB_SECONDARY_BOX],
2478 SB_SECONDARY_W_PIC_X,SB_SECONDARY_W_PIC_Y,
2479 SECONDARY_WEAPON_NAMES_SHORT(weapon_num),
2480 SB_SECONDARY_W_TEXT_X,SB_SECONDARY_W_TEXT_Y);
2482 draw_weapon_info_sub(info_index,
2483 &gauge_boxes[COCKPIT_SECONDARY_BOX],
2484 SECONDARY_W_PIC_X,SECONDARY_W_PIC_Y,
2485 SECONDARY_WEAPON_NAMES_SHORT(weapon_num),
2486 SECONDARY_W_TEXT_X,SECONDARY_W_TEXT_Y);
2490 void draw_ammo_info(int x,int y,int ammo_count,int primary)
2496 w = (grd_curcanv->cv_font->ft_w*7)/2;
2498 w = (grd_curcanv->cv_font->ft_w*5)/2;
2500 WIN(DDGRLOCK(dd_grd_curcanv));
2503 PA_DFX (pa_set_frontbuffer_current());
2505 gr_setcolor(BM_XRGB(0,0,0));
2506 gr_rect(x,y,x+w,y+grd_curcanv->cv_font->ft_h);
2507 gr_set_fontcolor(gr_getcolor(20,0,0),-1 );
2508 sprintf(str,"%03d",ammo_count);
2512 PA_DFX (pa_set_backbuffer_current());
2513 gr_rect(x,y,x+w,y+grd_curcanv->cv_font->ft_h);
2517 WIN(DDGRUNLOCK(dd_grd_curcanv));
2520 void draw_secondary_ammo_info(int ammo_count)
2522 if (Cockpit_mode == CM_STATUS_BAR)
2523 draw_ammo_info(SB_SECONDARY_AMMO_X,SB_SECONDARY_AMMO_Y,ammo_count,0);
2525 draw_ammo_info(SECONDARY_AMMO_X,SECONDARY_AMMO_Y,ammo_count,0);
2528 //returns true if drew picture
2529 int draw_weapon_box(int weapon_type,int weapon_num)
2532 int laser_level_changed;
2535 dd_gr_set_current_canvas(&dd_VR_render_buffer[0]),
2536 gr_set_current_canvas(&VR_render_buffer[0])
2539 PA_DFX (pa_set_backbuffer_current());
2541 WIN(DDGRLOCK(dd_grd_curcanv));
2542 gr_set_curfont( GAME_FONT );
2544 laser_level_changed = (weapon_type==0 && weapon_num==LASER_INDEX && (Players[Player_num].laser_level != old_laser_level[VR_current_page]));
2546 if ((weapon_num != old_weapon[weapon_type][VR_current_page] || laser_level_changed) && weapon_box_states[weapon_type] == WS_SET) {
2547 weapon_box_states[weapon_type] = WS_FADING_OUT;
2548 weapon_box_fade_values[weapon_type]=i2f(GR_FADE_LEVELS-1);
2551 if (old_weapon[weapon_type][VR_current_page] == -1) {
2552 //@@if (laser_level_changed)
2553 //@@ old_weapon[weapon_type][VR_current_page] = LASER_INDEX;
2556 draw_weapon_info(weapon_type,weapon_num,Players[Player_num].laser_level);
2557 old_weapon[weapon_type][VR_current_page] = weapon_num;
2558 old_ammo_count[weapon_type][VR_current_page]=-1;
2559 Old_Omega_charge[VR_current_page]=-1;
2560 old_laser_level[VR_current_page] = Players[Player_num].laser_level;
2562 weapon_box_states[weapon_type] = WS_SET;
2566 if (weapon_box_states[weapon_type] == WS_FADING_OUT) {
2567 draw_weapon_info(weapon_type,old_weapon[weapon_type][VR_current_page],old_laser_level[VR_current_page]);
2568 old_ammo_count[weapon_type][VR_current_page]=-1;
2569 Old_Omega_charge[VR_current_page]=-1;
2571 weapon_box_fade_values[weapon_type] -= FrameTime * FADE_SCALE;
2572 if (weapon_box_fade_values[weapon_type] <= 0) {
2573 weapon_box_states[weapon_type] = WS_FADING_IN;
2574 old_weapon[weapon_type][VR_current_page] = weapon_num;
2575 old_weapon[weapon_type][!VR_current_page] = weapon_num;
2576 old_laser_level[VR_current_page] = Players[Player_num].laser_level;
2577 old_laser_level[!VR_current_page] = Players[Player_num].laser_level;
2578 weapon_box_fade_values[weapon_type] = 0;
2581 else if (weapon_box_states[weapon_type] == WS_FADING_IN) {
2582 if (weapon_num != old_weapon[weapon_type][VR_current_page]) {
2583 weapon_box_states[weapon_type] = WS_FADING_OUT;
2586 draw_weapon_info(weapon_type,weapon_num,Players[Player_num].laser_level);
2587 old_ammo_count[weapon_type][VR_current_page]=-1;
2588 Old_Omega_charge[VR_current_page]=-1;
2590 weapon_box_fade_values[weapon_type] += FrameTime * FADE_SCALE;
2591 if (weapon_box_fade_values[weapon_type] >= i2f(GR_FADE_LEVELS-1)) {
2592 weapon_box_states[weapon_type] = WS_SET;
2593 old_weapon[weapon_type][!VR_current_page] = -1; //force redraw (at full fade-in) of other page
2598 if (weapon_box_states[weapon_type] != WS_SET) { //fade gauge
2599 int fade_value = f2i(weapon_box_fade_values[weapon_type]);
2600 int boxofs = (Cockpit_mode==CM_STATUS_BAR)?SB_PRIMARY_BOX:COCKPIT_PRIMARY_BOX;
2602 Gr_scanline_darkening_level = fade_value;
2603 // PA_DFX (pa_set_frontbuffer_current());
2604 // PA_DFX (gr_rect(gauge_boxes[boxofs+weapon_type].left,gauge_boxes[boxofs+weapon_type].top,gauge_boxes[boxofs+weapon_type].right,gauge_boxes[boxofs+weapon_type].bot));
2605 PA_DFX (pa_set_backbuffer_current());
2606 gr_rect(gauge_boxes[boxofs+weapon_type].left,gauge_boxes[boxofs+weapon_type].top,gauge_boxes[boxofs+weapon_type].right,gauge_boxes[boxofs+weapon_type].bot);
2608 Gr_scanline_darkening_level = GR_FADE_LEVELS;
2610 WIN(DDGRUNLOCK(dd_grd_curcanv));
2613 dd_gr_set_current_canvas(get_current_game_screen()),
2614 gr_set_current_canvas(get_current_game_screen())
2621 void draw_static(int win)
2623 vclip *vc = &Vclip[VCLIP_MONITOR_STATIC];
2626 int boxofs = (Cockpit_mode==CM_STATUS_BAR)?SB_PRIMARY_BOX:COCKPIT_PRIMARY_BOX;
2629 static_time[win] += FrameTime;
2630 if (static_time[win] >= vc->play_time) {
2631 weapon_box_user[win] = WBU_WEAPON;
2635 framenum = static_time[win] * vc->num_frames / vc->play_time;
2637 PIGGY_PAGE_IN(vc->frames[framenum]);
2639 bmp = &GameBitmaps[vc->frames[framenum].index];
2642 dd_gr_set_current_canvas(&dd_VR_render_buffer[0]),
2643 gr_set_current_canvas(&VR_render_buffer[0])
2645 WIN(DDGRLOCK(dd_grd_curcanv));
2646 PA_DFX (pa_set_backbuffer_current());
2647 PA_DFX (pa_bypass_mode (0));
2648 PA_DFX (pa_clip_window (gauge_boxes[boxofs+win].left,gauge_boxes[boxofs+win].top,
2649 gauge_boxes[boxofs+win].right,gauge_boxes[boxofs+win].bot));
2651 for (x=gauge_boxes[boxofs+win].left;x<gauge_boxes[boxofs+win].right;x+=bmp->bm_w)
2652 for (y=gauge_boxes[boxofs+win].top;y<gauge_boxes[boxofs+win].bot;y+=bmp->bm_h)
2655 PA_DFX (pa_bypass_mode(1));
2656 PA_DFX (pa_clip_window (0,0,640,480));
2658 WIN(DDGRUNLOCK(dd_grd_curcanv));
2661 dd_gr_set_current_canvas(get_current_game_screen()),
2662 gr_set_current_canvas(get_current_game_screen())
2668 copy_gauge_box(&gauge_boxes[boxofs+win],&dd_VR_render_buffer[0]),
2669 copy_gauge_box(&gauge_boxes[boxofs+win],&VR_render_buffer[0].cv_bitmap)
2673 void draw_weapon_boxes()
2675 int boxofs = (Cockpit_mode==CM_STATUS_BAR)?SB_PRIMARY_BOX:COCKPIT_PRIMARY_BOX;
2678 if (weapon_box_user[0] == WBU_WEAPON) {
2679 drew = draw_weapon_box(0,Primary_weapon);
2682 copy_gauge_box(&gauge_boxes[boxofs+0],&dd_VR_render_buffer[0]),
2683 copy_gauge_box(&gauge_boxes[boxofs+0],&VR_render_buffer[0].cv_bitmap)
2686 if (weapon_box_states[0] == WS_SET) {
2687 if ((Primary_weapon == VULCAN_INDEX) || (Primary_weapon == GAUSS_INDEX)) {
2688 if (Players[Player_num].primary_ammo[VULCAN_INDEX] != old_ammo_count[0][VR_current_page]) {
2689 if (Newdemo_state == ND_STATE_RECORDING)
2690 newdemo_record_primary_ammo(old_ammo_count[0][VR_current_page], Players[Player_num].primary_ammo[VULCAN_INDEX]);
2691 draw_primary_ammo_info(f2i((unsigned) VULCAN_AMMO_SCALE * (unsigned) Players[Player_num].primary_ammo[VULCAN_INDEX]));
2692 old_ammo_count[0][VR_current_page] = Players[Player_num].primary_ammo[VULCAN_INDEX];
2696 if (Primary_weapon == OMEGA_INDEX) {
2697 if (Omega_charge != Old_Omega_charge[VR_current_page]) {
2698 if (Newdemo_state == ND_STATE_RECORDING)
2699 newdemo_record_primary_ammo(Old_Omega_charge[VR_current_page], Omega_charge);
2700 draw_primary_ammo_info(Omega_charge * 100/MAX_OMEGA_CHARGE);
2701 Old_Omega_charge[VR_current_page] = Omega_charge;
2706 else if (weapon_box_user[0] == WBU_STATIC)
2709 if (weapon_box_user[1] == WBU_WEAPON) {
2710 drew = draw_weapon_box(1,Secondary_weapon);
2713 copy_gauge_box(&gauge_boxes[boxofs+1],&dd_VR_render_buffer[0]),
2714 copy_gauge_box(&gauge_boxes[boxofs+1],&VR_render_buffer[0].cv_bitmap)
2717 if (weapon_box_states[1] == WS_SET)
2718 if (Players[Player_num].secondary_ammo[Secondary_weapon] != old_ammo_count[1][VR_current_page]) {
2719 old_bombcount[VR_current_page] = 0x7fff; //force redraw
2720 if (Newdemo_state == ND_STATE_RECORDING)
2721 newdemo_record_secondary_ammo(old_ammo_count[1][VR_current_page], Players[Player_num].secondary_ammo[Secondary_weapon]);
2722 draw_secondary_ammo_info(Players[Player_num].secondary_ammo[Secondary_weapon]);
2723 old_ammo_count[1][VR_current_page] = Players[Player_num].secondary_ammo[Secondary_weapon];
2726 else if (weapon_box_user[1] == WBU_STATIC)
2731 void sb_draw_energy_bar(energy)
2733 int erase_height, w, h, aw;
2734 char energy_str[20];
2736 gr_set_current_canvas( Canv_SBEnergyGauge );
2738 PAGE_IN_GAUGE( SB_GAUGE_ENERGY );
2739 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(SB_GAUGE_ENERGY) ] );
2741 erase_height = (100 - energy) * SB_ENERGY_GAUGE_H / 100;
2743 if (erase_height > 0) {
2744 gr_setcolor( BM_XRGB(0,0,0) );
2745 gr_rect(0,0,SB_ENERGY_GAUGE_W-1,erase_height-1);
2749 dd_gr_set_current_canvas(get_current_game_screen()),
2750 gr_set_current_canvas(get_current_game_screen())
2753 WIN(DDGRLOCK(dd_grd_curcanv));
2754 PA_DFX (pa_set_frontbuffer_current());
2755 PA_DFX (gr_ubitmapm( SB_ENERGY_GAUGE_X, SB_ENERGY_GAUGE_Y, &Canv_SBEnergyGauge->cv_bitmap));
2756 PA_DFX (pa_set_backbuffer_current());
2757 gr_ubitmapm( SB_ENERGY_GAUGE_X, SB_ENERGY_GAUGE_Y, &Canv_SBEnergyGauge->cv_bitmap );
2760 sprintf(energy_str, "%d", energy);
2761 gr_get_string_size(energy_str, &w, &h, &aw );
2762 gr_set_fontcolor(gr_getcolor(25,18,6),-1 );
2763 PA_DFX (pa_set_frontbuffer_current());
2764 PA_DFX (gr_printf(SB_ENERGY_GAUGE_X + ((SB_ENERGY_GAUGE_W - w)/2), SB_ENERGY_GAUGE_Y + SB_ENERGY_GAUGE_H - GAME_FONT->ft_h - (GAME_FONT->ft_h / 4), "%d", energy));
2765 PA_DFX (pa_set_backbuffer_current());
2766 gr_printf(SB_ENERGY_GAUGE_X + ((SB_ENERGY_GAUGE_W - w)/2), SB_ENERGY_GAUGE_Y + SB_ENERGY_GAUGE_H - GAME_FONT->ft_h - (GAME_FONT->ft_h / 4), "%d", energy);
2767 WIN(DDGRUNLOCK(dd_grd_curcanv));
2770 void sb_draw_afterburner()
2772 int erase_height, w, h, aw;
2773 char ab_str[3] = "AB";
2775 gr_set_current_canvas( Canv_SBAfterburnerGauge );
2776 PAGE_IN_GAUGE( SB_GAUGE_AFTERBURNER );
2777 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(SB_GAUGE_AFTERBURNER) ] );
2779 erase_height = fixmul((f1_0 - Afterburner_charge),SB_AFTERBURNER_GAUGE_H);
2781 if (erase_height > 0) {
2782 gr_setcolor( BM_XRGB(0,0,0) );
2783 gr_rect(0,0,SB_AFTERBURNER_GAUGE_W-1,erase_height-1);
2787 dd_gr_set_current_canvas(get_current_game_screen()),
2788 gr_set_current_canvas(get_current_game_screen())
2790 WIN(DDGRLOCK(dd_grd_curcanv));
2791 PA_DFX (pa_set_frontbuffer_current());
2792 gr_ubitmapm( SB_AFTERBURNER_GAUGE_X, SB_AFTERBURNER_GAUGE_Y, &Canv_SBAfterburnerGauge->cv_bitmap );
2793 PA_DFX (pa_set_backbuffer_current());
2794 PA_DFX (gr_ubitmapm( SB_AFTERBURNER_GAUGE_X, SB_AFTERBURNER_GAUGE_Y, &Canv_SBAfterburnerGauge->cv_bitmap ));
2797 if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER)
2798 gr_set_fontcolor(gr_getcolor(45,0,0),-1 );
2800 gr_set_fontcolor(gr_getcolor(12,12,12),-1 );
2802 gr_get_string_size(ab_str, &w, &h, &aw );
2803 PA_DFX (pa_set_frontbuffer_current());
2804 PA_DFX (gr_printf(SB_AFTERBURNER_GAUGE_X + ((SB_AFTERBURNER_GAUGE_W - w)/2),SB_AFTERBURNER_GAUGE_Y+SB_AFTERBURNER_GAUGE_H-GAME_FONT->ft_h - (GAME_FONT->ft_h / 4),"AB"));
2805 PA_DFX (pa_set_backbuffer_current());
2806 gr_printf(SB_AFTERBURNER_GAUGE_X + ((SB_AFTERBURNER_GAUGE_W - w)/2),SB_AFTERBURNER_GAUGE_Y+SB_AFTERBURNER_GAUGE_H-GAME_FONT->ft_h - (GAME_FONT->ft_h / 4),"AB");
2808 WIN(DDGRUNLOCK(dd_grd_curcanv));
2811 void sb_draw_shield_num(int shield)
2815 gr_set_curfont( GAME_FONT );
2816 gr_set_fontcolor(gr_getcolor(14,14,23),-1 );
2819 PIGGY_PAGE_IN( cockpit_bitmap[Cockpit_mode+(Current_display_mode?(Num_cockpits/2):0)] );
2821 WIN(DDGRLOCK(dd_grd_curcanv));
2822 PA_DFX (pa_set_back_to_read());
2823 gr_setcolor(gr_gpixel(&grd_curcanv->cv_bitmap,SB_SHIELD_NUM_X-1,SB_SHIELD_NUM_Y-1));
2824 PA_DFX (pa_set_front_to_read());
2826 PA_DFX (pa_set_frontbuffer_current());
2828 gr_rect(SB_SHIELD_NUM_X,SB_SHIELD_NUM_Y,SB_SHIELD_NUM_X+(Current_display_mode?27:13),SB_SHIELD_NUM_Y+GAME_FONT->ft_h);
2829 gr_printf((shield>99)?SB_SHIELD_NUM_X:((shield>9)?SB_SHIELD_NUM_X+2:SB_SHIELD_NUM_X+4),SB_SHIELD_NUM_Y,"%d",shield);
2831 PA_DFX (pa_set_backbuffer_current());
2832 PA_DFX (gr_rect(SB_SHIELD_NUM_X,SB_SHIELD_NUM_Y,SB_SHIELD_NUM_X+(Current_display_mode?27:13),SB_SHIELD_NUM_Y+GAME_FONT->ft_h));
2833 PA_DFX (gr_printf((shield>99)?SB_SHIELD_NUM_X:((shield>9)?SB_SHIELD_NUM_X+2:SB_SHIELD_NUM_X+4),SB_SHIELD_NUM_Y,"%d",shield));
2835 WIN(DDGRUNLOCK(dd_grd_curcanv));
2838 void sb_draw_shield_bar(int shield)
2840 int bm_num = shield>=100?9:(shield / 10);
2843 dd_gr_set_current_canvas(get_current_game_screen()),
2844 gr_set_current_canvas(get_current_game_screen())
2846 WIN(DDGRLOCK(dd_grd_curcanv));
2847 PAGE_IN_GAUGE( GAUGE_SHIELDS+9-bm_num );
2848 PA_DFX (pa_set_frontbuffer_current());
2849 gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] );
2850 PA_DFX (pa_set_backbuffer_current());
2851 PA_DFX (gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] ));
2853 WIN(DDGRUNLOCK(dd_grd_curcanv));
2859 int flags = Players[Player_num].flags;
2862 dd_gr_set_current_canvas(get_current_game_screen()),
2863 gr_set_current_canvas(get_current_game_screen())
2865 WIN(DDGRLOCK(dd_grd_curcanv));
2866 PA_DFX (pa_set_frontbuffer_current());
2867 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF) ];
2868 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF );
2869 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_BLUE_KEY_Y, bm );
2870 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF) ];
2871 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF );
2872 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_GOLD_KEY_Y, bm );
2873 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF) ];
2874 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF );
2875 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_RED_KEY_Y, bm );
2876 #ifdef PA_3DFX_VOODOO
2877 PA_DFX (pa_set_backbuffer_current());
2878 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF) ];
2879 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF );
2880 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_BLUE_KEY_Y, bm );
2881 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF) ];
2882 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF );
2883 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_GOLD_KEY_Y, bm );
2884 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF) ];
2885 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF );
2886 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_RED_KEY_Y, bm );
2889 WIN(DDGRUNLOCK(dd_grd_curcanv));
2892 // Draws invulnerable ship, or maybe the flashing ship, depending on invulnerability time left.
2893 void draw_invulnerable_ship()
2898 dd_gr_set_current_canvas(get_current_game_screen()),
2899 gr_set_current_canvas(get_current_game_screen())
2901 WIN(DDGRLOCK(dd_grd_curcanv));
2903 if (((Players[Player_num].invulnerable_time + INVULNERABLE_TIME_MAX - GameTime) > F1_0*4) || (GameTime & 0x8000)) {
2905 if (Cockpit_mode == CM_STATUS_BAR) {
2906 PAGE_IN_GAUGE( GAUGE_INVULNERABLE+invulnerable_frame );
2907 PA_DFX (pa_set_frontbuffer_current());
2908 gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame) ] );
2909 PA_DFX (pa_set_backbuffer_current());
2910 PA_DFX (gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame) ] ));
2912 PAGE_IN_GAUGE( GAUGE_INVULNERABLE+invulnerable_frame );
2913 PA_DFX (pa_set_frontbuffer_current());
2914 PA_DFX (gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame)] ));
2915 PA_DFX (pa_set_backbuffer_current());
2916 gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame)] );
2921 while (time > INV_FRAME_TIME) {
2922 time -= INV_FRAME_TIME;
2923 if (++invulnerable_frame == N_INVULNERABLE_FRAMES)
2924 invulnerable_frame=0;
2926 } else if (Cockpit_mode == CM_STATUS_BAR)
2927 sb_draw_shield_bar(f2ir(Players[Player_num].shields));
2929 draw_shield_bar(f2ir(Players[Player_num].shields));
2930 WIN(DDGRUNLOCK(dd_grd_curcanv));
2933 extern int Missile_gun;
2934 extern int allowed_to_fire_laser(void);
2935 extern int allowed_to_fire_missile(void);
2937 rgb player_rgb[] = {
2948 extern ubyte Newdemo_flying_guided;
2949 extern int max_window_w;
2951 typedef struct {byte x,y;} xy;
2953 //offsets for reticle parts: high-big high-sml low-big low-sml
2954 xy cross_offsets[4] = { {-8,-5}, {-4,-2}, {-4,-2}, {-2,-1} };
2955 xy primary_offsets[4] = { {-30,14}, {-16,6}, {-15,6}, {-8, 2} };
2956 xy secondary_offsets[4] = { {-24,2}, {-12,0}, {-12,1}, {-6,-2} };
2959 void show_reticle(int force_big_one)
2962 int laser_ready,missile_ready,laser_ammo,missile_ammo;
2963 int cross_bm_num,primary_bm_num,secondary_bm_num;
2964 int use_hires_reticle,small_reticle,ofs,gauge_index;
2966 if (Newdemo_state==ND_STATE_PLAYBACK && Newdemo_flying_guided)
2968 WIN(DDGRLOCK(dd_grd_curcanv));
2969 draw_guided_crosshair();
2970 WIN(DDGRUNLOCK(dd_grd_curcanv));
2974 x = grd_curcanv->cv_w/2;
2975 y = grd_curcanv->cv_h/2;
2977 laser_ready = allowed_to_fire_laser();
2978 missile_ready = allowed_to_fire_missile();
2980 laser_ammo = player_has_weapon(Primary_weapon,0);
2981 missile_ammo = player_has_weapon(Secondary_weapon,1);
2983 primary_bm_num = (laser_ready && laser_ammo==HAS_ALL);
2984 secondary_bm_num = (missile_ready && missile_ammo==HAS_ALL);
2986 if (primary_bm_num && Primary_weapon==LASER_INDEX && (Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS))
2989 if (Secondary_weapon_to_gun_num[Secondary_weapon]==7)
2990 secondary_bm_num += 3; //now value is 0,1 or 3,4
2991 else if (secondary_bm_num && !(Missile_gun&1))
2994 cross_bm_num = ((primary_bm_num > 0) || (secondary_bm_num > 0));
2996 Assert(primary_bm_num <= 2);
2997 Assert(secondary_bm_num <= 4);
2998 Assert(cross_bm_num <= 1);
3000 if (gl_reticle==2 || (gl_reticle && grd_curcanv->cv_bitmap.bm_w > 320)){ ogl_draw_reticle(cross_bm_num,primary_bm_num,secondary_bm_num);
3006 use_hires_reticle = (FontHires != 0);
3008 use_hires_reticle = !Scanline_double;
3011 WIN(DDGRLOCK(dd_grd_curcanv));
3014 small_reticle = !(grd_curcanv->cv_bitmap.bm_w*3 > max_window_w*2 || force_big_one);
3016 small_reticle = !(grd_curcanv->cv_bitmap.bm_w*3 > max_window_w*(Scanline_double?1:2) || force_big_one);
3018 ofs = (use_hires_reticle?0:2) + small_reticle;
3020 gauge_index = (small_reticle?SML_RETICLE_CROSS:RETICLE_CROSS) + cross_bm_num;
3021 PAGE_IN_GAUGE( gauge_index );
3022 gr_ubitmapm(x+cross_offsets[ofs].x,y+cross_offsets[ofs].y,&GameBitmaps[GET_GAUGE_INDEX(gauge_index)] );
3024 gauge_index = (small_reticle?SML_RETICLE_PRIMARY:RETICLE_PRIMARY) + primary_bm_num;
3025 PAGE_IN_GAUGE( gauge_index );
3026 gr_ubitmapm(x+primary_offsets[ofs].x,y+primary_offsets[ofs].y,&GameBitmaps[GET_GAUGE_INDEX(gauge_index)] );
3028 gauge_index = (small_reticle?SML_RETICLE_SECONDARY:RETICLE_SECONDARY) + secondary_bm_num;
3029 PAGE_IN_GAUGE( gauge_index );
3030 gr_ubitmapm(x+secondary_offsets[ofs].x,y+secondary_offsets[ofs].y,&GameBitmaps[GET_GAUGE_INDEX(gauge_index)] );
3032 WIN(DDGRUNLOCK(dd_grd_curcanv));
3039 void hud_show_kill_list()
3041 int n_players,player_list[MAX_NUM_NET_PLAYERS];
3042 int n_left,i,x0,x1,y,save_y,fth;
3044 // ugly hack since placement of netgame players and kills is based off of
3045 // menuhires (which is always 1 for mac). This throws off placement of
3046 // players in pixel double mode.
3049 MenuHires = !(Scanline_double);
3052 if (Show_kill_list_timer > 0)
3054 Show_kill_list_timer -= FrameTime;
3055 if (Show_kill_list_timer < 0)
3059 gr_set_curfont( GAME_FONT );
3061 n_players = multi_get_kill_list(player_list);
3063 if (Show_kill_list == 3)
3069 n_left = (n_players+1)/2;
3071 //If font size changes, this code might not work right anymore
3072 //Assert(GAME_FONT->ft_h==5 && GAME_FONT->ft_w==7);
3074 fth = GAME_FONT->ft_h;
3076 x0 = LHX(1); x1 = LHX(43);
3078 if (Game_mode & GM_MULTI_COOP)
3081 save_y = y = grd_curcanv->cv_h - n_left*(fth+1);
3083 if (Cockpit_mode == CM_FULL_COCKPIT) {
3084 save_y = y -= LHX(6);
3085 if (Game_mode & GM_MULTI_COOP)
3091 for (i=0;i<n_players;i++) {
3097 if (Cockpit_mode == CM_FULL_COCKPIT)
3098 x0 = grd_curcanv->cv_w - LHX(53);
3100 x0 = grd_curcanv->cv_w - LHX(60);
3101 if (Game_mode & GM_MULTI_COOP)
3102 x1 = grd_curcanv->cv_w - LHX(27);
3104 x1 = grd_curcanv->cv_w - LHX(15); // Right edge of name, change this for width problems
3108 if (Netgame.KillGoal || Netgame.PlayTimeAllowed)
3114 else if (Netgame.KillGoal || Netgame.PlayTimeAllowed)
3122 if (Show_kill_list == 3)
3125 player_num = player_list[i];
3127 if (Show_kill_list == 1 || Show_kill_list==2)
3131 if (Players[player_num].connected != 1)
3132 gr_set_fontcolor(gr_getcolor(12, 12, 12), -1);
3133 else if (Game_mode & GM_TEAM) {
3134 color = get_team(player_num);
3135 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
3139 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
3145 gr_set_fontcolor(gr_getcolor(player_rgb[player_num].r,player_rgb[player_num].g,player_rgb[player_num].b),-1 );
3148 if (Show_kill_list == 3)
3149 strcpy(name, Netgame.team_name[i]);
3151 strcpy(name,Players[player_num].callsign); // Note link to above if!!
3152 gr_get_string_size(name,&sw,&sh,&aw);
3153 while (sw > (x1-x0-LHX(2))) {
3154 name[strlen(name)-1]=0;
3155 gr_get_string_size(name,&sw,&sh,&aw);
3157 gr_printf(x0,y,"%s",name);
3159 if (Show_kill_list==2)
3161 if (Players[player_num].net_killed_total+Players[player_num].net_kills_total==0)
3162 gr_printf (x1,y,"NA");
3164 gr_printf (x1,y,"%d%%",(int)((float)((float)Players[player_num].net_kills_total/((float)Players[player_num].net_killed_total+(float)Players[player_num].net_kills_total))*100.0));
3166 else if (Show_kill_list == 3)
3167 gr_printf(x1,y,"%3d",team_kills[i]);
3168 else if (Game_mode & GM_MULTI_COOP)
3169 gr_printf(x1,y,"%-6d",Players[player_num].score);
3170 else if (Netgame.PlayTimeAllowed || Netgame.KillGoal)
3171 gr_printf(x1,y,"%3d(%d)",Players[player_num].net_kills_total,Players[player_num].KillGoalCount);
3173 gr_printf(x1,y,"%3d",Players[player_num].net_kills_total);
3186 extern int Saving_movie_frames;
3188 #define Saving_movie_frames 0
3191 //returns true if viewer can see object
3192 int see_object(int objnum)
3198 //see if we can see this player
3200 fq.p0 = &Viewer->pos;
3201 fq.p1 = &Objects[objnum].pos;
3203 fq.thisobjnum = Viewer - Objects;
3204 fq.flags = FQ_TRANSWALL | FQ_CHECK_OBJS;
3205 fq.startseg = Viewer->segnum;
3206 fq.ignore_obj_list = NULL;
3208 hit_type = find_vector_intersection(&fq, &hit_data);
3210 return (hit_type == HIT_OBJECT && hit_data.hit_object == objnum);
3214 //show names of teammates & players carrying flags
3215 void show_HUD_names()
3217 int show_team_names,show_all_names,show_flags,player_team;
3220 show_all_names = ((Newdemo_state == ND_STATE_PLAYBACK) || (Netgame.ShowAllNames && Show_reticle_name));
3221 show_team_names = (((Game_mode & GM_MULTI_COOP) || (Game_mode & GM_TEAM)) && Show_reticle_name);
3222 show_flags = (Game_mode & GM_CAPTURE) | (Game_mode & GM_HOARD);
3224 if (! (show_all_names || show_team_names || show_flags))
3227 player_team = get_team(Player_num);
3229 for (p=0;p<N_players;p++) { //check all players
3231 int show_name,has_flag;
3233 show_name = ((show_all_names && !(Players[p].flags & PLAYER_FLAGS_CLOAKED)) || (show_team_names && get_team(p)==player_team));
3234 has_flag = (Players[p].connected && Players[p].flags & PLAYER_FLAGS_FLAG);
3236 if (Newdemo_state == ND_STATE_PLAYBACK) {
3237 //if this is a demo, the objnum in the player struct is wrong,
3238 //so we search the object list for the objnum
3240 for (objnum=0;objnum<=Highest_object_index;objnum++)
3241 if (Objects[objnum].type==OBJ_PLAYER && Objects[objnum].id == p)
3243 if (objnum > Highest_object_index) //not in list, thus not visible
3244 show_name = has_flag = 0; //..so don't show name
3247 objnum = Players[p].objnum;
3249 if ((show_name || has_flag) && see_object(objnum)) {
3250 g3s_point player_point;
3252 g3_rotate_point(&player_point,&Objects[objnum].pos);
3254 if (player_point.p3_codes == 0) { //on screen
3256 g3_project_point(&player_point);
3258 if (! (player_point.p3_flags & PF_OVERFLOW)) {
3261 x = player_point.p3_sx;
3262 y = player_point.p3_sy;
3264 if (show_name) { // Draw callsign on HUD
3265 char s[CALLSIGN_LEN+1];
3270 color_num = (Game_mode & GM_TEAM)?get_team(p):p;
3272 sprintf(s, "%s", Players[p].callsign);
3273 gr_get_string_size(s, &w, &h, &aw);
3274 gr_set_fontcolor(gr_getcolor(player_rgb[color_num].r,player_rgb[color_num].g,player_rgb[color_num].b),-1 );
3277 gr_string (x1, y1, s);
3280 if (has_flag) { // Draw box on HUD
3283 dy = -fixmuldiv(fixmul(Objects[objnum].size,Matrix_scale.y),i2f(grd_curcanv->cv_h)/2,player_point.p3_z);
3284 dx = fixmul(dy,grd_curscreen->sc_aspect);
3289 if (Game_mode & GM_CAPTURE)
3290 gr_setcolor((get_team(p) == TEAM_BLUE)?BM_XRGB(31,0,0):BM_XRGB(0,0,31));
3291 else if (Game_mode & GM_HOARD)
3293 if (Game_mode & GM_TEAM)
3294 gr_setcolor((get_team(p) == TEAM_RED)?BM_XRGB(31,0,0):BM_XRGB(0,0,31));
3296 gr_setcolor(BM_XRGB(0,31,0));
3299 gr_line(x+dx-w,y-dy,x+dx,y-dy);
3300 gr_line(x+dx,y-dy,x+dx,y-dy+h);
3302 gr_line(x-dx,y-dy,x-dx+w,y-dy);
3303 gr_line(x-dx,y-dy,x-dx,y-dy+h);
3305 gr_line(x+dx-w,y+dy,x+dx,y+dy);
3306 gr_line(x+dx,y+dy,x+dx,y+dy-h);
3308 gr_line(x-dx,y+dy,x-dx+w,y+dy);
3309 gr_line(x-dx,y+dy,x-dx,y+dy-h);
3319 extern int last_drawn_cockpit[2];
3321 //draw all the things on the HUD
3326 if (Cockpit_mode==CM_STATUS_BAR){
3327 //ogl needs to redraw every frame, at least currently.
3329 last_drawn_cockpit[0]=-1;
3330 last_drawn_cockpit[1]=-1;
3333 // vr_reset_display();
3339 if (Scanline_double) // I should be shot for this ugly hack....
3342 Line_spacing = GAME_FONT->ft_h + GAME_FONT->ft_h/4;
3344 if (Scanline_double)
3348 WIN(DDGRLOCK(dd_grd_curcanv));
3349 // Show score so long as not in rearview
3350 if ( !Rear_view && Cockpit_mode!=CM_REAR_VIEW && Cockpit_mode!=CM_STATUS_BAR && !Saving_movie_frames) {
3353 hud_show_score_added();
3356 if ( !Rear_view && Cockpit_mode!=CM_REAR_VIEW && !Saving_movie_frames)
3357 hud_show_timer_count();
3359 // Show other stuff if not in rearview or letterbox.
3360 if (!Rear_view && Cockpit_mode!=CM_REAR_VIEW) { // && Cockpit_mode!=CM_LETTERBOX) {
3361 if (Cockpit_mode==CM_STATUS_BAR || Cockpit_mode==CM_FULL_SCREEN)
3362 hud_show_homing_warning();
3364 if (Cockpit_mode==CM_FULL_SCREEN) {
3367 hud_show_afterburner();
3369 if (!Saving_movie_frames)
3371 hud_show_cloak_invuln();
3373 if ( ( Newdemo_state==ND_STATE_RECORDING ) && ( Players[Player_num].flags != old_flags[VR_current_page] )) {
3374 newdemo_record_player_flags(old_flags[VR_current_page], Players[Player_num].flags);
3375 old_flags[VR_current_page] = Players[Player_num].flags;
3381 if (!(Game_mode&GM_MULTI && Show_kill_list) && !Saving_movie_frames)
3385 if (Reticle_on && Cockpit_mode != CM_LETTERBOX && (!Use_player_head_angles))
3391 if (Cockpit_mode != CM_LETTERBOX && Cockpit_mode != CM_REAR_VIEW)
3394 if (Cockpit_mode != CM_LETTERBOX && Cockpit_mode != CM_REAR_VIEW)
3398 if (!Saving_movie_frames)
3399 HUD_render_message_frame();
3401 if (Cockpit_mode!=CM_STATUS_BAR && !Saving_movie_frames)
3405 if (Game_mode&GM_MULTI && Show_kill_list)
3406 hud_show_kill_list();
3410 if (Rear_view && Cockpit_mode!=CM_REAR_VIEW) {
3411 HUD_render_message_frame();
3412 gr_set_curfont( GAME_FONT );
3413 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
3414 if (Newdemo_state == ND_STATE_PLAYBACK)
3415 gr_printf(0x8000,grd_curcanv->cv_h-14,TXT_REAR_VIEW);
3417 gr_printf(0x8000,grd_curcanv->cv_h-10,TXT_REAR_VIEW);
3419 WIN(DDGRUNLOCK(dd_grd_curcanv));
3422 extern short *BackBuffer;
3424 //print out some player statistics
3425 void render_gauges()
3428 static int old_display_mode = 0;
3430 static int old_display_mode = 1;
3432 int energy = f2ir(Players[Player_num].energy);
3433 int shields = f2ir(Players[Player_num].shields);
3434 int cloak = ((Players[Player_num].flags&PLAYER_FLAGS_CLOAKED) != 0);
3438 PA_DFX (pa_set_backbuffer_current());
3440 Assert(Cockpit_mode==CM_FULL_COCKPIT || Cockpit_mode==CM_STATUS_BAR);
3442 // check to see if our display mode has changed since last render time --
3443 // if so, then we need to make new gauge canvases.
3446 if (old_display_mode != Current_display_mode) {
3447 close_gauge_canvases();
3448 init_gauge_canvases();
3449 old_display_mode = Current_display_mode;
3452 if (shields < 0 ) shields = 0;
3455 dd_gr_set_current_canvas(get_current_game_screen()),
3456 gr_set_current_canvas(get_current_game_screen())
3458 gr_set_curfont( GAME_FONT );
3460 if (Newdemo_state == ND_STATE_RECORDING)
3461 if (Players[Player_num].homing_object_dist >= 0)
3462 newdemo_record_homing_distance(Players[Player_num].homing_object_dist);
3464 if (Cockpit_mode == CM_FULL_COCKPIT) {
3465 if (energy != old_energy[VR_current_page]) {
3466 if (Newdemo_state==ND_STATE_RECORDING ) {
3467 newdemo_record_player_energy(old_energy[VR_current_page], energy);
3469 draw_energy_bar(energy);
3470 draw_numerical_display(shields, energy);
3471 old_energy[VR_current_page] = energy;
3474 if (Afterburner_charge != old_afterburner[VR_current_page]) {
3475 if (Newdemo_state==ND_STATE_RECORDING ) {
3476 newdemo_record_player_afterburner(old_afterburner[VR_current_page], Afterburner_charge);
3478 draw_afterburner_bar(Afterburner_charge);
3479 old_afterburner[VR_current_page] = Afterburner_charge;
3482 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
3483 draw_numerical_display(shields, energy);
3484 draw_invulnerable_ship();
3485 old_shields[VR_current_page] = shields ^ 1;
3486 } else if (shields != old_shields[VR_current_page]) { // Draw the shield gauge
3487 if (Newdemo_state==ND_STATE_RECORDING ) {
3488 newdemo_record_player_shields(old_shields[VR_current_page], shields);
3490 draw_shield_bar(shields);
3491 draw_numerical_display(shields, energy);
3492 old_shields[VR_current_page] = shields;
3495 if (Players[Player_num].flags != old_flags[VR_current_page]) {
3496 if (Newdemo_state==ND_STATE_RECORDING )
3497 newdemo_record_player_flags(old_flags[VR_current_page], Players[Player_num].flags);
3499 old_flags[VR_current_page] = Players[Player_num].flags;
3502 show_homing_warning();
3504 show_bomb_count(BOMB_COUNT_X,BOMB_COUNT_Y,gr_find_closest_color(0,0,0),0);
3506 } else if (Cockpit_mode == CM_STATUS_BAR) {
3508 if (energy != old_energy[VR_current_page] || frc) {
3509 if (Newdemo_state==ND_STATE_RECORDING ) {
3510 newdemo_record_player_energy(old_energy[VR_current_page], energy);
3512 sb_draw_energy_bar(energy);
3513 old_energy[VR_current_page] = energy;
3516 if (Afterburner_charge != old_afterburner[VR_current_page] || frc) {
3517 if (Newdemo_state==ND_STATE_RECORDING ) {
3518 newdemo_record_player_afterburner(old_afterburner[VR_current_page], Afterburner_charge);
3520 sb_draw_afterburner();
3521 old_afterburner[VR_current_page] = Afterburner_charge;
3524 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
3525 draw_invulnerable_ship();
3526 old_shields[VR_current_page] = shields ^ 1;
3527 sb_draw_shield_num(shields);
3530 if (shields != old_shields[VR_current_page] || frc) { // Draw the shield gauge
3531 if (Newdemo_state==ND_STATE_RECORDING ) {
3532 newdemo_record_player_shields(old_shields[VR_current_page], shields);
3534 sb_draw_shield_bar(shields);
3535 old_shields[VR_current_page] = shields;
3536 sb_draw_shield_num(shields);
3539 if (Players[Player_num].flags != old_flags[VR_current_page] || frc) {
3540 if (Newdemo_state==ND_STATE_RECORDING )
3541 newdemo_record_player_flags(old_flags[VR_current_page], Players[Player_num].flags);
3543 old_flags[VR_current_page] = Players[Player_num].flags;
3547 if ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))
3549 if (Players[Player_num].net_killed_total != old_lives[VR_current_page] || frc) {
3551 old_lives[VR_current_page] = Players[Player_num].net_killed_total;
3556 if (Players[Player_num].lives != old_lives[VR_current_page] || frc) {
3558 old_lives[VR_current_page] = Players[Player_num].lives;
3562 if ((Game_mode&GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) {
3563 if (Players[Player_num].net_kills_total != old_score[VR_current_page] || frc) {
3565 old_score[VR_current_page] = Players[Player_num].net_kills_total;
3569 if (Players[Player_num].score != old_score[VR_current_page] || frc) {
3571 old_score[VR_current_page] = Players[Player_num].score;
3575 sb_show_score_added();
3578 show_bomb_count(SB_BOMB_COUNT_X,SB_BOMB_COUNT_Y,gr_find_closest_color(5,5,5),0);
3581 if (frc || cloak != old_cloak[VR_current_page] || cloak_fade_state || (cloak && GameTime>Players[Player_num].cloak_time+CLOAK_TIME_MAX-i2f(3))) {
3582 if (Cockpit_mode == CM_FULL_COCKPIT)
3583 draw_player_ship(cloak,old_cloak[VR_current_page],SHIP_GAUGE_X,SHIP_GAUGE_Y);
3585 draw_player_ship(cloak,old_cloak[VR_current_page],SB_SHIP_GAUGE_X,SB_SHIP_GAUGE_Y);
3587 old_cloak[VR_current_page]=cloak;
3591 draw_weapon_boxes();
3595 // ---------------------------------------------------------------------------------------------------------
3596 // Call when picked up a laser powerup.
3597 // If laser is active, set old_weapon[0] to -1 to force redraw.
3598 void update_laser_weapon_info(void)
3600 if (old_weapon[0][VR_current_page] == 0)
3601 if (! (Players[Player_num].laser_level > MAX_LASER_LEVEL && old_laser_level[VR_current_page] <= MAX_LASER_LEVEL))
3602 old_weapon[0][VR_current_page] = -1;
3605 extern int Game_window_y;
3606 void fill_background(void);
3608 int SW_drawn[2], SW_x[2], SW_y[2], SW_w[2], SW_h[2];
3610 //draws a 3d view into one of the cockpit windows. win is 0 for left,
3611 //1 for right. viewer is object. NULL object means give up window
3612 //user is one of the WBU_ constants. If rear_view_flag is set, show a
3613 //rear view. If label is non-NULL, print the label at the top of the
3615 void do_cockpit_window_view(int win,object *viewer,int rear_view_flag,int user,char *label)
3618 dd_grs_canvas window_canv,
3619 grs_canvas window_canv
3622 static dd_grs_canvas overlap_canv,
3623 static grs_canvas overlap_canv
3627 int saved_window_x, saved_window_y;
3630 object *viewer_save = Viewer;
3631 static int overlap_dirty[2]={0,0};
3633 static int window_x,window_y;
3635 int rear_view_save = Rear_view;
3640 if (viewer == NULL) { //this user is done
3642 Assert(user == WBU_WEAPON || user == WBU_STATIC);
3644 if (user == WBU_STATIC && weapon_box_user[win] != WBU_STATIC)
3645 static_time[win] = 0;
3647 if (weapon_box_user[win] == WBU_WEAPON || weapon_box_user[win] == WBU_STATIC)
3648 return; //already set
3650 weapon_box_user[win] = user;
3652 if (overlap_dirty[win]) {
3654 dd_gr_set_current_canvas(&dd_VR_screen_pages[VR_current_page]),
3655 gr_set_current_canvas(&VR_screen_pages[VR_current_page])
3658 overlap_dirty[win] = 0;
3664 update_rendered_data(win+1, viewer, rear_view_flag, user);
3666 weapon_box_user[win] = user; //say who's using window
3669 Rear_view = rear_view_flag;
3671 if (Cockpit_mode == CM_FULL_SCREEN)
3674 w = VR_render_buffer[0].cv_bitmap.bm_w/6; // hmm. I could probably do the sub_buffer assigment for all macines, but I aint gonna chance it
3676 if (Scanline_double)
3680 h = i2f(w) / grd_curscreen->sc_aspect;
3682 dx = (win==0)?-(w+(w/10)):(w/10);
3684 window_x = VR_render_buffer[0].cv_bitmap.bm_w/2+dx;
3685 window_y = VR_render_buffer[0].cv_bitmap.bm_h-h-(h/10);
3688 saved_window_x = window_x;
3689 saved_window_y = window_y;
3690 window_x = dd_VR_render_sub_buffer[0].canvas.cv_bitmap.bm_w/2+dx;
3691 window_y = VR_render_buffer[0].cv_bitmap.bm_h-h-(h/10)-dd_VR_render_sub_buffer[0].yoff;
3695 if (Scanline_double) {
3696 window_x = (VR_render_buffer[0].cv_bitmap.bm_w/2+VR_render_sub_buffer[0].cv_bitmap.bm_x)/2+dx;
3697 window_y = ((VR_render_buffer[0].cv_bitmap.bm_h+VR_render_sub_buffer[0].cv_bitmap.bm_y)/2)-h-(h/10);
3701 //copy these vars so stereo code can get at them
3702 SW_drawn[win]=1; SW_x[win] = window_x; SW_y[win] = window_y; SW_w[win] = w; SW_h[win] = h;
3705 dd_gr_init_sub_canvas(&window_canv, &dd_VR_render_buffer[0],window_x,window_y,w,h),
3706 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],window_x,window_y,w,h)
3710 if (Cockpit_mode == CM_FULL_COCKPIT)
3711 boxnum = (COCKPIT_PRIMARY_BOX)+win;
3712 else if (Cockpit_mode == CM_STATUS_BAR)
3713 boxnum = (SB_PRIMARY_BOX)+win;
3717 box = &gauge_boxes[boxnum];
3721 dd_gr_init_sub_canvas(&window_canv,&dd_VR_render_buffer[0],box->left,box->top,box->right-box->left+1,box->bot-box->top+1),
3722 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],box->left,box->top,box->right-box->left+1,box->bot-box->top+1)
3725 if (Scanline_double)
3726 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],box->left,box->top,(box->right-box->left+1)/2,(box->bot-box->top+1)/2);
3728 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],box->left,box->top,box->right-box->left+1,box->bot-box->top+1);
3733 dd_gr_set_current_canvas(&window_canv),
3734 gr_set_current_canvas(&window_canv)
3737 #if defined(MACINTOSH) && defined(POLY_ACC)
3740 switch (Cockpit_mode)
3742 // copy these vars so stereo code can get at them
3743 // SW_drawn[win]=1; SW_x[win] = window_x; SW_y[win] = window_y; SW_w[win] = w; SW_h[win] = h;
3744 case CM_FULL_SCREEN:
3745 ; // do not switch contexts
3746 pa_set_3d_window_offsets(window_x, window_y);
3748 case CM_FULL_COCKPIT:
3752 pa_set_context(kSubViewZeroDrawContextID, NULL);
3756 pa_set_context(kSubViewOneDrawContextID, NULL);
3760 Int3(); // invalid cockpit mode
3765 WIN(DDGRLOCK(dd_grd_curcanv));
3771 if (Cockpit_mode != CM_FULL_SCREEN)
3779 render_frame(0, win+1);
3785 if (Cockpit_mode != CM_FULL_SCREEN)
3793 WIN(DDGRUNLOCK(dd_grd_curcanv));
3795 // HACK! If guided missile, wake up robots as necessary.
3796 if (viewer->type == OBJ_WEAPON) {
3797 // -- Used to require to be GUIDED -- if (viewer->id == GUIDEDMISS_ID)
3798 wake_up_rendered_objects(viewer, win+1);
3802 WIN(DDGRLOCK(dd_grd_curcanv));
3803 MAC(if (Scanline_double) FontHires = 0;) // get the right font size
3804 gr_set_curfont( GAME_FONT );
3805 if (Color_0_31_0 == -1)
3806 Color_0_31_0 = gr_getcolor(0,31,0);
3807 gr_set_fontcolor(Color_0_31_0, -1);
3808 gr_printf(0x8000,2,label);
3809 MAC(if (Scanline_double) FontHires = 1;) // get the right font size back to normal
3810 WIN(DDGRUNLOCK(dd_grd_curcanv));
3813 if (user == WBU_GUIDED) {
3814 WIN(DDGRLOCK(dd_grd_curcanv));
3815 draw_guided_crosshair();
3816 WIN(DDGRUNLOCK(dd_grd_curcanv));
3819 if (Cockpit_mode == CM_FULL_SCREEN) {
3820 int small_window_bottom,big_window_bottom,extra_part_h;
3822 WIN(DDGRLOCK(dd_grd_curcanv));
3824 gr_setcolor(BM_XRGB(0,0,32));
3825 gr_ubox(0,0,grd_curcanv->cv_bitmap.bm_w-1,grd_curcanv->cv_bitmap.bm_h-1);
3827 WIN(DDGRUNLOCK(dd_grd_curcanv));
3829 //if the window only partially overlaps the big 3d window, copy
3830 //the extra part to the visible screen
3832 #ifdef MACINTOSH // recalc window_x and window_y because of scanline doubling problems
3836 w = VR_render_buffer[0].cv_bitmap.bm_w/6; // hmm. I could probably do the sub_buffer assigment for all macines, but I aint gonna chance it
3837 h = i2f(w) / grd_curscreen->sc_aspect;
3838 dx = (win==0)?-(w+(w/10)):(w/10);
3839 window_x = VR_render_buffer[0].cv_bitmap.bm_w/2+dx;
3840 window_y = VR_render_buffer[0].cv_bitmap.bm_h-h-(h/10);
3841 if (Scanline_double)
3842 window_x += ((win==0)?2:-1); // a real hack here....
3845 big_window_bottom = Game_window_y + Game_window_h - 1;
3848 window_x = saved_window_x;
3849 window_y = saved_window_y;
3850 // dd_gr_init_sub_canvas(&window_canv, &dd_VR_render_buffer[0],window_x,window_y,
3851 // VR_render_buffer[0].cv_bitmap.bm_w/6,
3852 // i2f(VR_render_buffer[0].cv_bitmap.bm_w/6) / grd_curscreen->sc_aspect);
3856 if (window_y > big_window_bottom) {
3858 //the small window is completely outside the big 3d window, so
3859 //copy it to the visible screen
3861 if (VR_screen_flags & VRF_USE_PAGING)
3863 dd_gr_set_current_canvas(&dd_VR_screen_pages[!VR_current_page]),
3864 gr_set_current_canvas(&VR_screen_pages[!VR_current_page])
3868 dd_gr_set_current_canvas(get_current_game_screen()),
3869 gr_set_current_canvas(get_current_game_screen())
3873 if (Scanline_double)
3874 gr_bm_ubitblt_double_slow(window_canv.cv_bitmap.bm_w*2, window_canv.cv_bitmap.bm_h*2, window_x, window_y, 0, 0, &window_canv.cv_bitmap, &grd_curcanv->cv_bitmap);
3876 #endif // note link to above if
3878 dd_gr_blt_notrans(&window_canv, 0,0,0,0,
3879 dd_grd_curcanv, window_x, window_y, 0,0),
3880 gr_bitmap(window_x,window_y,&window_canv.cv_bitmap)
3883 overlap_dirty[win] = 1;
3888 small_window_bottom = window_y + window_canv.canvas.cv_bitmap.bm_h - 1,
3889 small_window_bottom = window_y + window_canv.cv_bitmap.bm_h - 1
3892 if (Scanline_double)
3893 small_window_bottom = window_y + (window_canv.cv_bitmap.bm_h*2) - 1;
3896 extra_part_h = small_window_bottom - big_window_bottom;
3898 if (extra_part_h > 0) {
3901 if (Scanline_double)
3906 dd_gr_init_sub_canvas(&overlap_canv,&window_canv,0,
3907 window_canv.canvas.cv_bitmap.bm_h-extra_part_h,
3908 window_canv.canvas.cv_bitmap.bm_w,extra_part_h),
3909 gr_init_sub_canvas(&overlap_canv,&window_canv,0,window_canv.cv_bitmap.bm_h-extra_part_h,window_canv.cv_bitmap.bm_w,extra_part_h)
3912 if (VR_screen_flags & VRF_USE_PAGING)
3914 dd_gr_set_current_canvas(&dd_VR_screen_pages[!VR_current_page]),
3915 gr_set_current_canvas(&VR_screen_pages[!VR_current_page])
3919 dd_gr_set_current_canvas(get_current_game_screen()),
3920 gr_set_current_canvas(get_current_game_screen())
3924 if (Scanline_double)
3925 gr_bm_ubitblt_double_slow(window_canv.cv_bitmap.bm_w*2, extra_part_h*2, window_x, big_window_bottom+1, 0, window_canv.cv_bitmap.bm_h-extra_part_h, &window_canv.cv_bitmap, &grd_curcanv->cv_bitmap);
3927 #endif // note link to above if
3929 dd_gr_blt_notrans(&overlap_canv, 0,0,0,0,
3930 dd_grd_curcanv, window_x, big_window_bottom+1, 0,0),
3931 gr_bitmap(window_x,big_window_bottom+1,&overlap_canv.cv_bitmap)
3934 overlap_dirty[win] = 1;
3939 PA_DFX (goto skip_this_junk);
3942 dd_gr_set_current_canvas(get_current_game_screen()),
3943 gr_set_current_canvas(get_current_game_screen())
3947 copy_gauge_box(box,&dd_VR_render_buffer[0]),
3948 copy_gauge_box(box,&VR_render_buffer[0].cv_bitmap)
3951 if (Scanline_double)
3952 copy_gauge_box_double(box,&VR_render_buffer[0].cv_bitmap); // pixel double the external view
3954 // Only do this if we are not running under RAVE, otherwise we erase all of the rendering RAVE has done.
3957 copy_gauge_box(box,&VR_render_buffer[0].cv_bitmap);
3962 PA_DFX(skip_this_junk:)
3964 #if defined(MACINTOSH) && defined(POLY_ACC)
3967 pa_set_context(kGamePlayDrawContextID, NULL);
3971 //force redraw when done
3972 old_weapon[win][VR_current_page] = old_ammo_count[win][VR_current_page] = -1;
3976 Viewer = viewer_save;
3978 Rear_view = rear_view_save;
3982 void calculate_sub_view_window_bounds(int inSubWindowNum, TQARect* outBoundsRect)
3985 gauge_box* currentGaugeBox = NULL;
3992 Assert(outBoundsRect);
3993 Assert((inSubWindowNum == 0) || (inSubWindowNum == 1));
3994 Assert(!Scanline_double);
3996 switch (Cockpit_mode)
3998 case CM_FULL_SCREEN:
3999 // note: this calculation is taken from do_cockpit_window_view for the full
4002 w = (VR_render_buffer[0].cv_bitmap.bm_w) / 6;
4003 h = (i2f(w)) / (grd_curscreen->sc_aspect);
4005 dx = (inSubWindowNum==0)?-(w+(w/10)):(w/10);
4007 window_x = ((VR_render_buffer[0].cv_bitmap.bm_w) / 2) + dx;
4008 window_y = (VR_render_buffer[0].cv_bitmap.bm_h) - h - (h/10);
4010 outBoundsRect->top = window_x;
4011 outBoundsRect->left = window_y;
4012 outBoundsRect->bottom = window_x + w;
4013 outBoundsRect->right = window_y + h;
4016 case CM_FULL_COCKPIT:
4018 if (inSubWindowNum == 0)
4020 boxNumber = SB_PRIMARY_BOX;
4024 boxNumber = SB_SECONDARY_BOX;
4027 //boxNumber = (Current_display_mode * 4) + (Cockpit_mode * 2) + inSubWindowNum;
4028 currentGaugeBox = &gauge_boxes[boxNumber];
4029 Assert(currentGaugeBox);
4031 outBoundsRect->top = currentGaugeBox->top;
4032 outBoundsRect->left = currentGaugeBox->left;
4033 outBoundsRect->bottom = currentGaugeBox->bot + 1;
4034 outBoundsRect->right = currentGaugeBox->right + 1;