1 /* $Id: gauges.c,v 1.8 2003-06-06 23:51:21 btb Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 * Inferno gauge drivers
20 * Revision 1.15 1995/10/31 10:22:37 allender
23 * Revision 1.14 1995/10/26 14:11:05 allender
24 * do copy of weapon boxes in cockpit correctly
26 * Revision 1.13 1995/10/21 22:54:56 allender
27 * fixed up player names on hud
29 * Revision 1.12 1995/10/12 17:39:27 allender
30 * fixed status bar lives display
32 * Revision 1.11 1995/09/22 15:21:46 allender
33 * fixed hud problems (reticle and kill lists) for
34 * non pixel doubled mode
36 * Revision 1.10 1995/09/13 11:38:47 allender
37 * show KB left in heap instead of piggy cache
39 * Revision 1.9 1995/09/04 15:52:28 allender
40 * fix vulcan ammo count to update without overwritting itself
42 * Revision 1.8 1995/08/31 14:11:20 allender
43 * worked on hud kill list for non pixel doubled mode
45 * Revision 1.7 1995/08/24 16:05:05 allender
46 * more gauge placement -- still not done!
48 * Revision 1.6 1995/08/18 15:44:56 allender
49 * put in PC gauges for keys, lives, and reticle when pixel doubling
51 * Revision 1.5 1995/08/18 10:24:47 allender
52 * added proper support for cockpit mode -- still needs
54 * Revision 1.4 1995/07/26 16:56:34 allender
55 * more gauge stuff for status bar. still problem
58 * Revision 1.3 1995/07/17 08:55:57 allender
59 * fix up for large status bar. Still needs some work though
61 * Revision 1.2 1995/06/20 09:54:29 allender
62 * stopgap measure to get status bar "working" until real mac
63 * status bar gets added
65 * Revision 1.1 1995/05/16 15:26:05 allender
68 * Revision 2.7 1995/12/19 16:18:33 john
69 * Made weapon info align with canvas width, not 315.
71 * Revision 2.6 1995/03/21 14:39:25 john
72 * Ifdef'd out the NETWORK code.
74 * Revision 2.5 1995/03/14 12:31:25 john
75 * Prevent negative shields from printing.
77 * Revision 2.4 1995/03/10 12:57:58 allender
78 * move rear view text up four pixels up when playing back demo
80 * Revision 2.3 1995/03/09 11:47:51 john
81 * Added HUD for VR helmets.
83 * Revision 2.2 1995/03/06 15:23:26 john
84 * New screen techniques.
86 * Revision 2.1 1995/02/27 13:13:45 john
87 * Removed floating point.
89 * Revision 2.0 1995/02/27 11:29:06 john
90 * New version 2.0, which has no anonymous unions, builds with
91 * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
93 * Revision 1.203 1995/02/11 01:56:45 mike
94 * move up weapons text on fullscreen hud, missiles was offscreen.
96 * Revision 1.202 1995/02/09 13:23:34 rob
97 * Added reticle names in demo playback.
99 * Revision 1.201 1995/02/08 19:20:46 rob
100 * Show cloaked teammates on H
101 * UD. Get rid of show ID's in anarchy option.
103 * Revision 1.200 1995/02/07 21:09:00 mike
104 * add flashing to invulnerability and cloak on fullscreen.
106 * Revision 1.199 1995/02/02 21:55:57 matt
107 * Added new colored key icons for fullscreen
109 * Revision 1.198 1995/01/30 17:17:07 rob
110 * Fixed teammate names on hud.
112 * Revision 1.197 1995/01/28 17:40:49 mike
113 * fix gauge fontcolor.
115 * Revision 1.196 1995/01/27 17:03:14 mike
116 * fix placement of weapon info in multiplayer fullscreen, as per AP request.
118 * Revision 1.195 1995/01/27 11:51:23 rob
119 * Put deaths tally into cooperative mode
121 * Revision 1.194 1995/01/27 11:43:24 adam
122 * fiddled with key display
124 * Revision 1.193 1995/01/25 23:38:35 mike
125 * fix keys on fullscreen.
127 * Revision 1.192 1995/01/24 22:03:28 mike
128 * Lotsa hud stuff, put a lot of messages up.
130 * Revision 1.191 1995/01/23 16:47:21 rob
131 * Fixed problem with playing extra life noise in coop.
133 * Revision 1.190 1995/01/22 16:00:46 mike
134 * remove unneeded string.
136 * Revision 1.189 1995/01/22 15:58:22 mike
139 * Revision 1.188 1995/01/20 17:19:45 rob
140 * Fixing colors of hud kill list players.
142 * Revision 1.187 1995/01/20 09:19:18 allender
143 * record player flags when in CM_FULL_SCREEN
145 * Revision 1.186 1995/01/19 16:29:09 allender
146 * made demo recording of weapon change be in this file for shareware only
148 * Revision 1.185 1995/01/19 15:00:33 allender
149 * code to record shield, energy, and ammo in fullscreen
151 * Revision 1.184 1995/01/19 13:43:13 matt
152 * Fixed "cheater" message on HUD
154 * Revision 1.183 1995/01/18 16:11:58 mike
155 * Don't show added scores of 0.
157 * Revision 1.182 1995/01/17 17:42:39 allender
158 * do ammo counts in demo recording
160 * Revision 1.181 1995/01/16 17:26:25 rob
161 * Fixed problem with coloration of team kill list.
163 * Revision 1.180 1995/01/16 17:22:39 john
164 * Made so that KB and framerate don't collide.
166 * Revision 1.179 1995/01/16 14:58:31 matt
167 * Changed score_added display to print "Cheater!" when cheats enabled
169 * Revision 1.178 1995/01/15 19:42:07 matt
170 * Ripped out hostage faces for registered version
172 * Revision 1.177 1995/01/15 19:25:07 mike
173 * show vulcan ammo and secondary ammo in fullscreen view.
175 * Revision 1.176 1995/01/15 13:16:12 john
176 * Made so that paging always happens, lowmem just loads less.
177 * Also, make KB load print to hud.
179 * Revision 1.175 1995/01/14 19:17:32 john
180 * First version of piggy paging.
182 * Revision 1.174 1995/01/05 21:25:23 rob
183 * Re-did some changes lost due to RCS weirdness.
185 * Revision 1.173 1995/01/05 12:22:34 rob
186 * Don't show player names for cloaked players.
188 * Revision 1.172 1995/01/04 17:14:50 allender
189 * make init_gauges work properly on demo playback
191 * Revision 1.171 1995/01/04 15:04:42 allender
192 * new demo calls for registered version
194 * Revision 1.167 1995/01/03 13:03:57 allender
195 * pass score points instead of total points. Added ifdef for
198 * Revision 1.166 1995/01/03 11:45:02 allender
199 * add hook to record player score
201 * Revision 1.165 1995/01/03 11:25:19 allender
202 * remove newdemo stuff around score display
204 * Revision 1.163 1995/01/02 21:03:53 rob
205 * Fixing up the hud-score-list for coop games.
207 * Revision 1.162 1994/12/31 20:54:40 rob
208 * Added coop mode HUD score list.
209 * Added more generic system for player names on HUD.
211 * Revision 1.161 1994/12/30 20:13:01 rob
212 * Ifdef reticle names on shareware.
213 * Added robot reticle naming.
215 * Revision 1.160 1994/12/29 17:53:51 mike
216 * move up energy/shield in fullscreen to get out of way of kill list.
218 * Revision 1.159 1994/12/29 16:44:05 mike
219 * add energy and shield showing.
221 * Revision 1.158 1994/12/28 16:34:29 mike
222 * make warning beep go away on Player_is_dead.
224 * Revision 1.157 1994/12/28 10:00:43 allender
225 * change in init_gauges to for multiplayer demo playbacks
227 * Revision 1.156 1994/12/27 11:06:46 allender
228 * removed some previous code to for demo playback stuff
230 * Revision 1.155 1994/12/23 14:23:06 john
231 * Added floating reticle for VR helments.
233 * Revision 1.154 1994/12/21 12:56:41 allender
234 * on multiplayer demo playback, show kills and deaths
236 * Revision 1.153 1994/12/19 20:28:42 rob
237 * Get rid of kill list in coop games.
239 * Revision 1.152 1994/12/14 18:06:44 matt
240 * Removed compile warnings
242 * Revision 1.151 1994/12/14 15:21:28 rob
243 * Made gauges align in status_bar net game.
245 * Revision 1.150 1994/12/12 17:20:33 matt
246 * Don't get bonus points when cheating
248 * Revision 1.149 1994/12/12 16:47:00 matt
249 * When cheating, get no score. Change level cheat to prompt for and
252 * Revision 1.148 1994/12/12 12:05:45 rob
253 * Grey out players who are disconnected.
255 * Revision 1.147 1994/12/09 16:19:48 yuan
258 * Revision 1.146 1994/12/09 16:12:34 rob
259 * Fixed up the status bar kills gauges for net play.
261 * Revision 1.145 1994/12/09 01:55:34 rob
262 * Added kills list to HUD/status bar.
263 * Added something for Mark.
265 * Revision 1.144 1994/12/08 21:03:30 allender
266 * pass old player flags to record_player_flags
268 * Revision 1.143 1994/12/07 22:49:33 mike
269 * no homing missile warning during endlevel sequence.
271 * Revision 1.142 1994/12/06 13:55:31 matt
272 * Use new rounding func, f2ir()
274 * Revision 1.141 1994/12/03 19:03:37 matt
275 * Fixed vulcan ammo HUD message
277 * Revision 1.140 1994/12/03 18:43:18 matt
278 * Fixed (hopefully) claok gauge
280 * Revision 1.139 1994/12/03 14:26:21 yuan
283 * Revision 1.138 1994/12/03 14:17:30 yuan
303 #include "pa_enabl.h" //$$POLY_ACC
311 #include "menu.h" // For the font.
316 #include "gamefont.h"
325 #include "endlevel.h"
326 #include "cntrlcen.h"
327 #include "controls.h"
336 #include "ogl_init.h"
339 #if defined(POLY_ACC)
340 #include "poly_acc.h"
343 void draw_ammo_info(int x,int y,int ammo_count,int primary);
344 extern void draw_guided_crosshair(void);
346 bitmap_index Gauges[MAX_GAUGE_BMS]; // Array of all gauge bitmaps.
347 bitmap_index Gauges_hires[MAX_GAUGE_BMS]; // hires gauges
349 grs_canvas *Canv_LeftEnergyGauge;
350 grs_canvas *Canv_AfterburnerGauge;
351 grs_canvas *Canv_SBEnergyGauge;
352 grs_canvas *Canv_SBAfterburnerGauge;
353 grs_canvas *Canv_RightEnergyGauge;
354 grs_canvas *Canv_NumericalGauge;
356 //Flags for gauges/hud stuff
359 //bitmap numbers for gauges
361 #define GAUGE_SHIELDS 0 //0..9, in decreasing order (100%,90%...0%)
363 #define GAUGE_INVULNERABLE 10 //10..19
364 #define N_INVULNERABLE_FRAMES 10
366 #define GAUGE_AFTERBURNER 20
367 #define GAUGE_ENERGY_LEFT 21
368 #define GAUGE_ENERGY_RIGHT 22
369 #define GAUGE_NUMERICAL 23
371 #define GAUGE_BLUE_KEY 24
372 #define GAUGE_GOLD_KEY 25
373 #define GAUGE_RED_KEY 26
374 #define GAUGE_BLUE_KEY_OFF 27
375 #define GAUGE_GOLD_KEY_OFF 28
376 #define GAUGE_RED_KEY_OFF 29
378 #define SB_GAUGE_BLUE_KEY 30
379 #define SB_GAUGE_GOLD_KEY 31
380 #define SB_GAUGE_RED_KEY 32
381 #define SB_GAUGE_BLUE_KEY_OFF 33
382 #define SB_GAUGE_GOLD_KEY_OFF 34
383 #define SB_GAUGE_RED_KEY_OFF 35
385 #define SB_GAUGE_ENERGY 36
387 #define GAUGE_LIVES 37
389 #define GAUGE_SHIPS 38
390 #define GAUGE_SHIPS_LAST 45
392 #define RETICLE_CROSS 46
393 #define RETICLE_PRIMARY 48
394 #define RETICLE_SECONDARY 51
395 #define RETICLE_LAST 55
397 #define GAUGE_HOMING_WARNING_ON 56
398 #define GAUGE_HOMING_WARNING_OFF 57
400 #define SML_RETICLE_CROSS 58
401 #define SML_RETICLE_PRIMARY 60
402 #define SML_RETICLE_SECONDARY 63
403 #define SML_RETICLE_LAST 67
405 #define KEY_ICON_BLUE 68
406 #define KEY_ICON_YELLOW 69
407 #define KEY_ICON_RED 70
409 #define SB_GAUGE_AFTERBURNER 71
411 #define FLAG_ICON_RED 72
412 #define FLAG_ICON_BLUE 73
415 /* Use static inline function under GCC to avoid CR/LF issues */
417 #define PAGE_IN_GAUGE(x) _page_in_gauge(x)
418 static inline void _page_in_gauge(int x)
421 PIGGY_PAGE_IN(Gauges_hires[x]);
423 PIGGY_PAGE_IN(Gauges[x]);
428 #define PAGE_IN_GAUGE(x) \
431 PIGGY_PAGE_IN(Gauges_hires[x]); \
433 PIGGY_PAGE_IN(Gauges[x]); \
439 #define GET_GAUGE_INDEX(x) (FontHires?Gauges_hires[x].index:Gauges[x].index)
441 //change MAX_GAUGE_BMS when adding gauges
443 //Coordinats for gauges
445 extern int Current_display_mode;
449 #define GAUGE_BLUE_KEY_X_L 272
450 #define GAUGE_BLUE_KEY_Y_L 152
451 #define GAUGE_BLUE_KEY_X_H 535
452 #define GAUGE_BLUE_KEY_Y_H 374
453 #define GAUGE_BLUE_KEY_X (Current_display_mode?GAUGE_BLUE_KEY_X_H:GAUGE_BLUE_KEY_X_L)
454 #define GAUGE_BLUE_KEY_Y (Current_display_mode?GAUGE_BLUE_KEY_Y_H:GAUGE_BLUE_KEY_Y_L)
456 #define GAUGE_GOLD_KEY_X_L 273
457 #define GAUGE_GOLD_KEY_Y_L 162
458 #define GAUGE_GOLD_KEY_X_H 537
459 #define GAUGE_GOLD_KEY_Y_H 395
460 #define GAUGE_GOLD_KEY_X (Current_display_mode?GAUGE_GOLD_KEY_X_H:GAUGE_GOLD_KEY_X_L)
461 #define GAUGE_GOLD_KEY_Y (Current_display_mode?GAUGE_GOLD_KEY_Y_H:GAUGE_GOLD_KEY_Y_L)
463 #define GAUGE_RED_KEY_X_L 274
464 #define GAUGE_RED_KEY_Y_L 172
465 #define GAUGE_RED_KEY_X_H 539
466 #define GAUGE_RED_KEY_Y_H 416
467 #define GAUGE_RED_KEY_X (Current_display_mode?GAUGE_RED_KEY_X_H:GAUGE_RED_KEY_X_L)
468 #define GAUGE_RED_KEY_Y (Current_display_mode?GAUGE_RED_KEY_Y_H:GAUGE_RED_KEY_Y_L)
472 #define SB_GAUGE_KEYS_X_L 11
473 #define SB_GAUGE_KEYS_X_H 26
474 #define SB_GAUGE_KEYS_X (Current_display_mode?SB_GAUGE_KEYS_X_H:SB_GAUGE_KEYS_X_L)
476 #define SB_GAUGE_BLUE_KEY_Y_L 153
477 #define SB_GAUGE_GOLD_KEY_Y_L 169
478 #define SB_GAUGE_RED_KEY_Y_L 185
480 #define SB_GAUGE_BLUE_KEY_Y_H 390
481 #define SB_GAUGE_GOLD_KEY_Y_H 422
482 #define SB_GAUGE_RED_KEY_Y_H 454
484 #define SB_GAUGE_BLUE_KEY_Y (Current_display_mode?SB_GAUGE_BLUE_KEY_Y_H:SB_GAUGE_BLUE_KEY_Y_L)
485 #define SB_GAUGE_GOLD_KEY_Y (Current_display_mode?SB_GAUGE_GOLD_KEY_Y_H:SB_GAUGE_GOLD_KEY_Y_L)
486 #define SB_GAUGE_RED_KEY_Y (Current_display_mode?SB_GAUGE_RED_KEY_Y_H:SB_GAUGE_RED_KEY_Y_L)
488 // cockpit enery gauges
490 #define LEFT_ENERGY_GAUGE_X_L 70
491 #define LEFT_ENERGY_GAUGE_Y_L 131
492 #define LEFT_ENERGY_GAUGE_W_L 64
493 #define LEFT_ENERGY_GAUGE_H_L 8
495 #define LEFT_ENERGY_GAUGE_X_H 137
496 #define LEFT_ENERGY_GAUGE_Y_H 314
497 #define LEFT_ENERGY_GAUGE_W_H 133
498 #define LEFT_ENERGY_GAUGE_H_H 21
500 #define LEFT_ENERGY_GAUGE_X (Current_display_mode?LEFT_ENERGY_GAUGE_X_H:LEFT_ENERGY_GAUGE_X_L)
501 #define LEFT_ENERGY_GAUGE_Y (Current_display_mode?LEFT_ENERGY_GAUGE_Y_H:LEFT_ENERGY_GAUGE_Y_L)
502 #define LEFT_ENERGY_GAUGE_W (Current_display_mode?LEFT_ENERGY_GAUGE_W_H:LEFT_ENERGY_GAUGE_W_L)
503 #define LEFT_ENERGY_GAUGE_H (Current_display_mode?LEFT_ENERGY_GAUGE_H_H:LEFT_ENERGY_GAUGE_H_L)
505 #define RIGHT_ENERGY_GAUGE_X (Current_display_mode?380:190)
506 #define RIGHT_ENERGY_GAUGE_Y (Current_display_mode?314:131)
507 #define RIGHT_ENERGY_GAUGE_W (Current_display_mode?133:64)
508 #define RIGHT_ENERGY_GAUGE_H (Current_display_mode?21:8)
510 // cockpit afterburner gauge
512 #define AFTERBURNER_GAUGE_X_L 45-1
513 #define AFTERBURNER_GAUGE_Y_L 158
514 #define AFTERBURNER_GAUGE_W_L 12
515 #define AFTERBURNER_GAUGE_H_L 32
517 #define AFTERBURNER_GAUGE_X_H 88
518 #define AFTERBURNER_GAUGE_Y_H 377
519 #define AFTERBURNER_GAUGE_W_H 21
520 #define AFTERBURNER_GAUGE_H_H 65
522 #define AFTERBURNER_GAUGE_X (Current_display_mode?AFTERBURNER_GAUGE_X_H:AFTERBURNER_GAUGE_X_L)
523 #define AFTERBURNER_GAUGE_Y (Current_display_mode?AFTERBURNER_GAUGE_Y_H:AFTERBURNER_GAUGE_Y_L)
524 #define AFTERBURNER_GAUGE_W (Current_display_mode?AFTERBURNER_GAUGE_W_H:AFTERBURNER_GAUGE_W_L)
525 #define AFTERBURNER_GAUGE_H (Current_display_mode?AFTERBURNER_GAUGE_H_H:AFTERBURNER_GAUGE_H_L)
529 #define SB_ENERGY_GAUGE_X (Current_display_mode?196:98)
530 #define SB_ENERGY_GAUGE_Y (Current_display_mode?382:(155-2))
531 #define SB_ENERGY_GAUGE_W (Current_display_mode?32:16)
532 #define SB_ENERGY_GAUGE_H (Current_display_mode?60:29)
534 // sb afterburner gauge
536 #define SB_AFTERBURNER_GAUGE_X (Current_display_mode?196:98)
537 #define SB_AFTERBURNER_GAUGE_Y (Current_display_mode?446:184)
538 #define SB_AFTERBURNER_GAUGE_W (Current_display_mode?33:16)
539 #define SB_AFTERBURNER_GAUGE_H (Current_display_mode?29:13)
541 #define SB_ENERGY_NUM_X (SB_ENERGY_GAUGE_X+(Current_display_mode?4:2))
542 #define SB_ENERGY_NUM_Y (Current_display_mode?457:175)
544 #define SHIELD_GAUGE_X (Current_display_mode?292:146)
545 #define SHIELD_GAUGE_Y (Current_display_mode?374:155)
546 #define SHIELD_GAUGE_W (Current_display_mode?70:35)
547 #define SHIELD_GAUGE_H (Current_display_mode?77:32)
549 #define SHIP_GAUGE_X (SHIELD_GAUGE_X+(Current_display_mode?11:5))
550 #define SHIP_GAUGE_Y (SHIELD_GAUGE_Y+(Current_display_mode?10:5))
552 #define SB_SHIELD_GAUGE_X (Current_display_mode?247:123) //139
553 #define SB_SHIELD_GAUGE_Y (Current_display_mode?395:163)
555 #define SB_SHIP_GAUGE_X (SB_SHIELD_GAUGE_X+(Current_display_mode?11:5))
556 #define SB_SHIP_GAUGE_Y (SB_SHIELD_GAUGE_Y+(Current_display_mode?10:5))
558 #define SB_SHIELD_NUM_X (SB_SHIELD_GAUGE_X+(Current_display_mode?21:12)) //151
559 #define SB_SHIELD_NUM_Y (SB_SHIELD_GAUGE_Y-(Current_display_mode?16:8)) //156 -- MWA used to be hard coded to 156
561 #define NUMERICAL_GAUGE_X (Current_display_mode?308:154)
562 #define NUMERICAL_GAUGE_Y (Current_display_mode?316:130)
563 #define NUMERICAL_GAUGE_W (Current_display_mode?38:19)
564 #define NUMERICAL_GAUGE_H (Current_display_mode?55:22)
566 #define PRIMARY_W_PIC_X (Current_display_mode?(135-10):64)
567 #define PRIMARY_W_PIC_Y (Current_display_mode?370:154)
568 #define PRIMARY_W_TEXT_X (Current_display_mode?182:87)
569 #define PRIMARY_W_TEXT_Y (Current_display_mode?400:157)
570 #define PRIMARY_AMMO_X (Current_display_mode?186:(96-3))
571 #define PRIMARY_AMMO_Y (Current_display_mode?420:171)
573 #define SECONDARY_W_PIC_X (Current_display_mode?466:234)
574 #define SECONDARY_W_PIC_Y (Current_display_mode?374:154)
575 #define SECONDARY_W_TEXT_X (Current_display_mode?413:207)
576 #define SECONDARY_W_TEXT_Y (Current_display_mode?378:157)
577 #define SECONDARY_AMMO_X (Current_display_mode?428:213)
578 #define SECONDARY_AMMO_Y (Current_display_mode?407:171)
580 #define SB_LIVES_X (Current_display_mode?(550-10-3):266)
581 #define SB_LIVES_Y (Current_display_mode?450-3:185)
582 #define SB_LIVES_LABEL_X (Current_display_mode?475:237)
583 #define SB_LIVES_LABEL_Y (SB_LIVES_Y+1)
585 #define SB_SCORE_RIGHT_L 301
586 #define SB_SCORE_RIGHT_H (605+8)
587 #define SB_SCORE_RIGHT (Current_display_mode?SB_SCORE_RIGHT_H:SB_SCORE_RIGHT_L)
589 #define SB_SCORE_Y (Current_display_mode?398:158)
590 #define SB_SCORE_LABEL_X (Current_display_mode?475:237)
592 #define SB_SCORE_ADDED_RIGHT (Current_display_mode?SB_SCORE_RIGHT_H:SB_SCORE_RIGHT_L)
593 #define SB_SCORE_ADDED_Y (Current_display_mode?413:165)
595 #define HOMING_WARNING_X (Current_display_mode?14:7)
596 #define HOMING_WARNING_Y (Current_display_mode?415:171)
598 #define BOMB_COUNT_X (Current_display_mode?546:275)
599 #define BOMB_COUNT_Y (Current_display_mode?445:186)
601 #define SB_BOMB_COUNT_X (Current_display_mode?342:171)
602 #define SB_BOMB_COUNT_Y (Current_display_mode?458:191)
605 #define LHX(x) ((x)*(Current_display_mode?2:1))
606 #define LHY(y) ((y)*(Current_display_mode?2.4:1))
608 #define LHX(x) ((x)*(MenuHires?2:1))
609 #define LHY(y) ((y)*(MenuHires?2.4:1))
612 static int score_display[2];
613 static fix score_time;
615 static int old_score[2] = { -1, -1 };
616 static int old_energy[2] = { -1, -1 };
617 static int old_shields[2] = { -1, -1 };
618 static int old_flags[2] = { -1, -1 };
619 static int old_weapon[2][2] = {{ -1, -1 },{-1,-1}};
620 static int old_ammo_count[2][2] = {{ -1, -1 },{-1,-1}};
621 static int Old_Omega_charge[2] = { -1, -1 };
622 static int old_laser_level[2] = { -1, -1 };
623 static int old_cloak[2] = { 0, 0 };
624 static int old_lives[2] = { -1, -1 };
625 static fix old_afterburner[2] = { -1, -1 };
626 static int old_bombcount[2] = { 0, 0 };
628 static int invulnerable_frame = 0;
630 static int cloak_fade_state; //0=steady, -1 fading out, 1 fading in
632 #define WS_SET 0 //in correct state
633 #define WS_FADING_OUT 1
634 #define WS_FADING_IN 2
636 int weapon_box_user[2]={WBU_WEAPON,WBU_WEAPON}; //see WBU_ constants in gauges.h
637 int weapon_box_states[2];
638 fix weapon_box_fade_values[2];
640 #define FADE_SCALE (2*i2f(GR_FADE_LEVELS)/REARM_TIME) // fade out and back in REARM_TIME, in fade levels per seconds (int)
642 typedef struct span {
646 //store delta x values from left of box
647 span weapon_window_left[] = { //first span 67,151
694 //store delta x values from left of box
695 span weapon_window_right[] = { //first span 207,154
741 //store delta x values from left of box
742 span weapon_window_left_hires[] = { //first span 67,154
853 //store delta x values from left of box
854 span weapon_window_right_hires[] = { //first span 207,154
965 #define N_LEFT_WINDOW_SPANS (sizeof(weapon_window_left)/sizeof(*weapon_window_left))
966 #define N_RIGHT_WINDOW_SPANS (sizeof(weapon_window_right)/sizeof(*weapon_window_right))
968 #define N_LEFT_WINDOW_SPANS_H (sizeof(weapon_window_left_hires)/sizeof(*weapon_window_left_hires))
969 #define N_RIGHT_WINDOW_SPANS_H (sizeof(weapon_window_right_hires)/sizeof(*weapon_window_right_hires))
971 // defining box boundries for weapon pictures
973 #define PRIMARY_W_BOX_LEFT_L 63
974 #define PRIMARY_W_BOX_TOP_L 151 //154
975 #define PRIMARY_W_BOX_RIGHT_L (PRIMARY_W_BOX_LEFT_L+58)
976 #define PRIMARY_W_BOX_BOT_L (PRIMARY_W_BOX_TOP_L+N_LEFT_WINDOW_SPANS-1)
978 #define PRIMARY_W_BOX_LEFT_H 121
979 #define PRIMARY_W_BOX_TOP_H 364
980 #define PRIMARY_W_BOX_RIGHT_H 242
981 #define PRIMARY_W_BOX_BOT_H (PRIMARY_W_BOX_TOP_H+N_LEFT_WINDOW_SPANS_H-1) //470
983 #define PRIMARY_W_BOX_LEFT (Current_display_mode?PRIMARY_W_BOX_LEFT_H:PRIMARY_W_BOX_LEFT_L)
984 #define PRIMARY_W_BOX_TOP (Current_display_mode?PRIMARY_W_BOX_TOP_H:PRIMARY_W_BOX_TOP_L)
985 #define PRIMARY_W_BOX_RIGHT (Current_display_mode?PRIMARY_W_BOX_RIGHT_H:PRIMARY_W_BOX_RIGHT_L)
986 #define PRIMARY_W_BOX_BOT (Current_display_mode?PRIMARY_W_BOX_BOT_H:PRIMARY_W_BOX_BOT_L)
988 #define SECONDARY_W_BOX_LEFT_L 202 //207
989 #define SECONDARY_W_BOX_TOP_L 151
990 #define SECONDARY_W_BOX_RIGHT_L 263 //(SECONDARY_W_BOX_LEFT+54)
991 #define SECONDARY_W_BOX_BOT_L (SECONDARY_W_BOX_TOP_L+N_RIGHT_WINDOW_SPANS-1)
993 #define SECONDARY_W_BOX_LEFT_H 404
994 #define SECONDARY_W_BOX_TOP_H 363
995 #define SECONDARY_W_BOX_RIGHT_H 529
996 #define SECONDARY_W_BOX_BOT_H (SECONDARY_W_BOX_TOP_H+N_RIGHT_WINDOW_SPANS_H-1) //470
998 #define SECONDARY_W_BOX_LEFT (Current_display_mode?SECONDARY_W_BOX_LEFT_H:SECONDARY_W_BOX_LEFT_L)
999 #define SECONDARY_W_BOX_TOP (Current_display_mode?SECONDARY_W_BOX_TOP_H:SECONDARY_W_BOX_TOP_L)
1000 #define SECONDARY_W_BOX_RIGHT (Current_display_mode?SECONDARY_W_BOX_RIGHT_H:SECONDARY_W_BOX_RIGHT_L)
1001 #define SECONDARY_W_BOX_BOT (Current_display_mode?SECONDARY_W_BOX_BOT_H:SECONDARY_W_BOX_BOT_L)
1003 #define SB_PRIMARY_W_BOX_LEFT_L 34 //50
1004 #define SB_PRIMARY_W_BOX_TOP_L 153
1005 #define SB_PRIMARY_W_BOX_RIGHT_L (SB_PRIMARY_W_BOX_LEFT_L+53+2)
1006 #define SB_PRIMARY_W_BOX_BOT_L (195+1)
1008 #define SB_PRIMARY_W_BOX_LEFT_H 68
1009 #define SB_PRIMARY_W_BOX_TOP_H 381
1010 #define SB_PRIMARY_W_BOX_RIGHT_H 179
1011 #define SB_PRIMARY_W_BOX_BOT_H 473
1013 #define SB_PRIMARY_W_BOX_LEFT (Current_display_mode?SB_PRIMARY_W_BOX_LEFT_H:SB_PRIMARY_W_BOX_LEFT_L)
1014 #define SB_PRIMARY_W_BOX_TOP (Current_display_mode?SB_PRIMARY_W_BOX_TOP_H:SB_PRIMARY_W_BOX_TOP_L)
1015 #define SB_PRIMARY_W_BOX_RIGHT (Current_display_mode?SB_PRIMARY_W_BOX_RIGHT_H:SB_PRIMARY_W_BOX_RIGHT_L)
1016 #define SB_PRIMARY_W_BOX_BOT (Current_display_mode?SB_PRIMARY_W_BOX_BOT_H:SB_PRIMARY_W_BOX_BOT_L)
1018 #define SB_SECONDARY_W_BOX_LEFT_L 169
1019 #define SB_SECONDARY_W_BOX_TOP_L 153
1020 #define SB_SECONDARY_W_BOX_RIGHT_L (SB_SECONDARY_W_BOX_LEFT_L+54+1)
1021 #define SB_SECONDARY_W_BOX_BOT_L (153+43)
1023 #define SB_SECONDARY_W_BOX_LEFT_H 338
1024 #define SB_SECONDARY_W_BOX_TOP_H 381
1025 #define SB_SECONDARY_W_BOX_RIGHT_H 449
1026 #define SB_SECONDARY_W_BOX_BOT_H 473
1028 #define SB_SECONDARY_W_BOX_LEFT (Current_display_mode?SB_SECONDARY_W_BOX_LEFT_H:SB_SECONDARY_W_BOX_LEFT_L) //210
1029 #define SB_SECONDARY_W_BOX_TOP (Current_display_mode?SB_SECONDARY_W_BOX_TOP_H:SB_SECONDARY_W_BOX_TOP_L)
1030 #define SB_SECONDARY_W_BOX_RIGHT (Current_display_mode?SB_SECONDARY_W_BOX_RIGHT_H:SB_SECONDARY_W_BOX_RIGHT_L)
1031 #define SB_SECONDARY_W_BOX_BOT (Current_display_mode?SB_SECONDARY_W_BOX_BOT_H:SB_SECONDARY_W_BOX_BOT_L)
1033 #define SB_PRIMARY_W_PIC_X (SB_PRIMARY_W_BOX_LEFT+1) //51
1034 #define SB_PRIMARY_W_PIC_Y (Current_display_mode?382:154)
1035 #define SB_PRIMARY_W_TEXT_X (SB_PRIMARY_W_BOX_LEFT+(Current_display_mode?50:24)) //(51+23)
1036 #define SB_PRIMARY_W_TEXT_Y (Current_display_mode?390:157)
1037 #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)
1038 #define SB_PRIMARY_AMMO_Y (Current_display_mode?410:171)
1040 #define SB_SECONDARY_W_PIC_X (Current_display_mode?385:(SB_SECONDARY_W_BOX_LEFT+29)) //(212+27)
1041 #define SB_SECONDARY_W_PIC_Y (Current_display_mode?382:154)
1042 #define SB_SECONDARY_W_TEXT_X (SB_SECONDARY_W_BOX_LEFT+2) //212
1043 #define SB_SECONDARY_W_TEXT_Y (Current_display_mode?389:157)
1044 #define SB_SECONDARY_AMMO_X (SB_SECONDARY_W_BOX_LEFT+(Current_display_mode?(14-4):11)) //(212+9)
1045 #define SB_SECONDARY_AMMO_Y (Current_display_mode?414:171)
1047 typedef struct gauge_box {
1049 int right,bot; //maximal box
1050 span *spanlist; //list of left,right spans for copy
1053 gauge_box gauge_boxes[] = {
1055 // primary left/right low res
1056 {PRIMARY_W_BOX_LEFT_L,PRIMARY_W_BOX_TOP_L,PRIMARY_W_BOX_RIGHT_L,PRIMARY_W_BOX_BOT_L,weapon_window_left},
1057 {SECONDARY_W_BOX_LEFT_L,SECONDARY_W_BOX_TOP_L,SECONDARY_W_BOX_RIGHT_L,SECONDARY_W_BOX_BOT_L,weapon_window_right},
1059 //sb left/right low res
1060 {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},
1061 {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},
1063 // primary left/right hires
1064 {PRIMARY_W_BOX_LEFT_H,PRIMARY_W_BOX_TOP_H,PRIMARY_W_BOX_RIGHT_H,PRIMARY_W_BOX_BOT_H,weapon_window_left_hires},
1065 {SECONDARY_W_BOX_LEFT_H,SECONDARY_W_BOX_TOP_H,SECONDARY_W_BOX_RIGHT_H,SECONDARY_W_BOX_BOT_H,weapon_window_right_hires},
1067 // sb left/right hires
1068 {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},
1069 {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},
1072 // these macros refer to arrays above
1074 #define COCKPIT_PRIMARY_BOX (!Current_display_mode?0:4)
1075 #define COCKPIT_SECONDARY_BOX (!Current_display_mode?1:5)
1076 #define SB_PRIMARY_BOX (!Current_display_mode?2:6)
1077 #define SB_SECONDARY_BOX (!Current_display_mode?3:7)
1079 int Color_0_31_0 = -1;
1081 //copy a box from the off-screen buffer to the visible page
1083 void copy_gauge_box(gauge_box *box,dd_grs_canvas *cv)
1085 // This is kind of funny. If we are in a full cockpit mode
1086 // we have a system offscreen buffer for our canvas.
1087 // Since this is true of cockpit mode only, we should do a
1088 // direct copy from system to video memory without blting.
1090 if (box->spanlist) {
1091 int n_spans = box->bot-box->top+1;
1094 if (Cockpit_mode==CM_FULL_COCKPIT && cv->sram) {
1099 DDGRLOCK(dd_grd_curcanv);
1100 bm = &cv->canvas.cv_bitmap;
1102 for (cnt=0,y=box->top;cnt<n_spans;cnt++,y++)
1104 gr_bm_ubitblt(box->spanlist[cnt].r-box->spanlist[cnt].l+1,1,
1105 box->left+box->spanlist[cnt].l,y,box->left+box->spanlist[cnt].l,y,bm,&grd_curcanv->cv_bitmap);
1107 DDGRUNLOCK(dd_grd_curcanv);
1111 for (cnt=0,y=box->top;cnt<n_spans;cnt++,y++)
1113 dd_gr_blt_notrans(cv,
1114 box->left+box->spanlist[cnt].l,y,
1115 box->spanlist[cnt].r-box->spanlist[cnt].l+1,1,
1117 box->left+box->spanlist[cnt].l,y,
1118 box->spanlist[cnt].r-box->spanlist[cnt].l+1,1);
1123 dd_gr_blt_notrans(cv, box->left, box->top,
1124 box->right-box->left+1, box->bot-box->top+1,
1125 dd_grd_curcanv, box->left, box->top,
1126 box->right-box->left+1, box->bot-box->top+1);
1132 void copy_gauge_box(gauge_box *box,grs_bitmap *bm)
1134 if (box->spanlist) {
1135 int n_spans = box->bot-box->top+1;
1138 //gr_setcolor(BM_XRGB(31,0,0));
1140 for (cnt=0,y=box->top;cnt<n_spans;cnt++,y++) {
1141 PA_DFX (pa_set_frontbuffer_current());
1142 PA_DFX (pa_set_back_to_read());
1144 gr_bm_ubitblt(box->spanlist[cnt].r-box->spanlist[cnt].l+1,1,
1145 box->left+box->spanlist[cnt].l,y,box->left+box->spanlist[cnt].l,y,bm,&grd_curcanv->cv_bitmap);
1147 //gr_scanline(box->left+box->spanlist[cnt].l,box->left+box->spanlist[cnt].r,y);
1148 PA_DFX (pa_set_backbuffer_current());
1149 PA_DFX (pa_set_front_to_read());
1155 PA_DFX (pa_set_frontbuffer_current());
1156 PA_DFX (pa_set_back_to_read());
1158 gr_bm_ubitblt(box->right-box->left+1,box->bot-box->top+1,
1159 box->left,box->top,box->left,box->top,
1160 bm,&grd_curcanv->cv_bitmap);
1161 PA_DFX (pa_set_backbuffer_current());
1162 PA_DFX (pa_set_front_to_read());
1169 extern int gr_bitblt_double;
1171 int copy_whole_box = 0;
1173 void copy_gauge_box_double(gauge_box *box,grs_bitmap *bm)
1176 if (!copy_whole_box && box->spanlist) {
1177 int n_spans = box->bot-box->top+1;
1178 int cnt, sx, dx, sy, dy;
1181 for (cnt=0; cnt < n_spans; cnt++) {
1187 dx = box->left+box->spanlist[cnt].l;
1189 sbits = bm->bm_data + (bm->bm_rowsize * sy) + sx;
1190 dbits = grd_curcanv->cv_bitmap.bm_data + (grd_curcanv->cv_bitmap.bm_rowsize * dy) + dx;
1192 for (j = box->spanlist[cnt].l; j < box->spanlist[cnt].r+1; j++)
1193 *dbits++ = sbits[j/2];
1203 gr_bm_ubitblt_double_slow(box->right-box->left+1,box->bot-box->top,
1204 box->left,box->top,box->left,box->top,
1205 bm,&grd_curcanv->cv_bitmap);
1210 //fills in the coords of the hostage video window
1211 void get_hostage_window_coords(int *x,int *y,int *w,int *h)
1213 if (Cockpit_mode == CM_STATUS_BAR) {
1214 *x = SB_SECONDARY_W_BOX_LEFT;
1215 *y = SB_SECONDARY_W_BOX_TOP;
1216 *w = SB_SECONDARY_W_BOX_RIGHT - SB_SECONDARY_W_BOX_LEFT + 1;
1217 *h = SB_SECONDARY_W_BOX_BOT - SB_SECONDARY_W_BOX_TOP + 1;
1220 *x = SECONDARY_W_BOX_LEFT;
1221 *y = SECONDARY_W_BOX_TOP;
1222 *w = SECONDARY_W_BOX_RIGHT - SECONDARY_W_BOX_LEFT + 1;
1223 *h = SECONDARY_W_BOX_BOT - SECONDARY_W_BOX_TOP + 1;
1228 //these should be in gr.h
1229 #define cv_w cv_bitmap.bm_w
1230 #define cv_h cv_bitmap.bm_h
1232 extern int HUD_nmessages, hud_first; // From hud.c
1233 extern char HUD_messages[HUD_MAX_NUM][HUD_MESSAGE_LENGTH+5];
1234 extern fix ThisLevelTime;
1235 extern fix Omega_charge;
1237 void hud_show_score()
1242 if ((HUD_nmessages > 0) && (strlen(HUD_messages[hud_first]) > 38))
1245 gr_set_curfont( GAME_FONT );
1247 if ( ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) ) {
1248 sprintf(score_str, "%s: %5d", TXT_KILLS, Players[Player_num].net_kills_total);
1250 sprintf(score_str, "%s: %5d", TXT_SCORE, Players[Player_num].score);
1253 gr_get_string_size(score_str, &w, &h, &aw );
1255 if (Color_0_31_0 == -1)
1256 Color_0_31_0 = gr_getcolor(0,31,0);
1257 gr_set_fontcolor(Color_0_31_0, -1);
1259 gr_printf(grd_curcanv->cv_w-w-LHX(2), 3, score_str);
1262 void hud_show_timer_count()
1270 if ((HUD_nmessages > 0) && (strlen(HUD_messages[hud_first]) > 38))
1274 if ((Game_mode & GM_NETWORK) && Netgame.PlayTimeAllowed)
1276 timevar=i2f (Netgame.PlayTimeAllowed*5*60);
1277 i=f2i(timevar-ThisLevelTime);
1280 sprintf(score_str, "T - %5d", i);
1282 gr_get_string_size(score_str, &w, &h, &aw );
1284 if (Color_0_31_0 == -1)
1285 Color_0_31_0 = gr_getcolor(0,31,0);
1286 gr_set_fontcolor(Color_0_31_0, -1);
1288 if (i>-1 && !Control_center_destroyed)
1289 gr_printf(grd_curcanv->cv_w-w-LHX(10), LHX(11), score_str);
1295 //y offset between lines on HUD
1298 void hud_show_score_added()
1304 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1307 if (score_display[0] == 0)
1310 gr_set_curfont( GAME_FONT );
1312 score_time -= FrameTime;
1313 if (score_time > 0) {
1314 color = f2i(score_time * 20) + 12;
1316 if (color < 10) color = 12;
1317 if (color > 31) color = 30;
1319 color = color - (color % 4); // Only allowing colors 12,16,20,24,28 speeds up gr_getcolor, improves caching
1322 sprintf(score_str, "%s", TXT_CHEATER);
1324 sprintf(score_str, "%5d", score_display[0]);
1326 gr_get_string_size(score_str, &w, &h, &aw );
1327 gr_set_fontcolor(gr_getcolor(0, color, 0),-1 );
1328 gr_printf(grd_curcanv->cv_w-w-LHX(2+10), Line_spacing+4, score_str);
1331 score_display[0] = 0;
1336 void sb_show_score()
1341 static int last_x[4]={SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_H,SB_SCORE_RIGHT_H};
1344 WIN(DDGRLOCK(dd_grd_curcanv));
1345 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1350 if (old_score[VR_current_page]==redraw_score) {
1351 gr_set_curfont( GAME_FONT );
1352 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1354 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1356 PA_DFX(pa_set_frontbuffer_current());
1357 PA_DFX(gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_KILLS));
1358 PA_DFX(pa_set_backbuffer_current());
1359 gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_KILLS);
1363 PA_DFX (pa_set_frontbuffer_current() );
1364 PA_DFX (gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_SCORE) );
1365 PA_DFX(pa_set_backbuffer_current());
1366 gr_printf(SB_SCORE_LABEL_X,SB_SCORE_Y,"%s:", TXT_SCORE);
1370 gr_set_curfont( GAME_FONT );
1371 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1372 sprintf(score_str, "%5d", Players[Player_num].net_kills_total);
1374 sprintf(score_str, "%5d", Players[Player_num].score);
1375 gr_get_string_size(score_str, &w, &h, &aw );
1377 x = SB_SCORE_RIGHT-w-LHX(2);
1381 gr_setcolor(BM_XRGB(0,0,0));
1382 PA_DFX (pa_set_frontbuffer_current());
1383 PA_DFX (gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],y,SB_SCORE_RIGHT,y+GAME_FONT->ft_h));
1384 PA_DFX(pa_set_backbuffer_current());
1385 gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page],y,SB_SCORE_RIGHT,y+GAME_FONT->ft_h);
1387 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1388 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1390 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1392 PA_DFX (pa_set_frontbuffer_current());
1393 PA_DFX (gr_printf(x,y,score_str));
1394 PA_DFX(pa_set_backbuffer_current());
1395 gr_printf(x,y,score_str);
1397 last_x[(Current_display_mode?2:0)+VR_current_page] = x;
1398 WIN(DDGRUNLOCK(dd_grd_curcanv));
1401 void sb_show_score_added()
1407 static int last_x[4]={SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_H,SB_SCORE_RIGHT_H};
1408 static int last_score_display[2] = { -1, -1};
1412 if ( (Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP) )
1415 if (score_display[VR_current_page] == 0)
1418 WIN(DDGRLOCK(dd_grd_curcanv));
1419 gr_set_curfont( GAME_FONT );
1421 score_time -= FrameTime;
1422 if (score_time > 0) {
1423 if (score_display[VR_current_page] != last_score_display[VR_current_page] || frc) {
1424 gr_setcolor(BM_XRGB(0,0,0));
1425 PA_DFX (pa_set_frontbuffer_current());
1426 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));
1427 PA_DFX(pa_set_backbuffer_current());
1428 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);
1430 last_score_display[VR_current_page] = score_display[VR_current_page];
1433 color = f2i(score_time * 20) + 10;
1435 if (color < 10) color = 10;
1436 if (color > 31) color = 31;
1439 sprintf(score_str, "%s", TXT_CHEATER);
1441 sprintf(score_str, "%5d", score_display[VR_current_page]);
1443 gr_get_string_size(score_str, &w, &h, &aw );
1445 x = SB_SCORE_ADDED_RIGHT-w-LHX(2);
1447 gr_set_fontcolor(gr_getcolor(0, color, 0),-1 );
1449 PA_DFX (pa_set_frontbuffer_current());
1450 PA_DFX (gr_printf(x, SB_SCORE_ADDED_Y, score_str));
1451 PA_DFX(pa_set_backbuffer_current());
1452 gr_printf(x, SB_SCORE_ADDED_Y, score_str);
1455 last_x[(Current_display_mode?2:0)+VR_current_page] = x;
1459 gr_setcolor(BM_XRGB(0,0,0));
1460 PA_DFX (pa_set_frontbuffer_current());
1461 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));
1462 PA_DFX(pa_set_backbuffer_current());
1463 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);
1466 score_display[VR_current_page] = 0;
1469 WIN(DDGRUNLOCK(dd_grd_curcanv));
1472 fix Last_warning_beep_time[2] = {0,0}; // Time we last played homing missile warning beep.
1474 // -----------------------------------------------------------------------------
1475 void play_homing_warning(void)
1479 if (Endlevel_sequence || Player_is_dead)
1482 if (Players[Player_num].homing_object_dist >= 0) {
1483 beep_delay = Players[Player_num].homing_object_dist/128;
1484 if (beep_delay > F1_0)
1486 else if (beep_delay < F1_0/8)
1487 beep_delay = F1_0/8;
1489 if (Last_warning_beep_time[VR_current_page] > GameTime)
1490 Last_warning_beep_time[VR_current_page] = 0;
1492 if (GameTime - Last_warning_beep_time[VR_current_page] > beep_delay/2) {
1493 digi_play_sample( SOUND_HOMING_WARNING, F1_0 );
1494 Last_warning_beep_time[VR_current_page] = GameTime;
1499 int Last_homing_warning_shown[2]={-1,-1};
1501 // -----------------------------------------------------------------------------
1502 void show_homing_warning(void)
1504 if ((Cockpit_mode == CM_STATUS_BAR) || (Endlevel_sequence)) {
1505 if (Last_homing_warning_shown[VR_current_page] == 1) {
1506 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_OFF );
1508 WIN(DDGRLOCK(dd_grd_curcanv));
1509 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_OFF) ] );
1510 WIN(DDGRUNLOCK(dd_grd_curcanv));
1512 Last_homing_warning_shown[VR_current_page] = 0;
1518 dd_gr_set_current_canvas( get_current_game_screen() ),
1519 gr_set_current_canvas( get_current_game_screen() )
1523 WIN(DDGRLOCK(dd_grd_curcanv))
1525 if (Players[Player_num].homing_object_dist >= 0) {
1527 if (GameTime & 0x4000) {
1528 if (Last_homing_warning_shown[VR_current_page] != 1) {
1529 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_ON );
1530 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_ON) ] );
1531 Last_homing_warning_shown[VR_current_page] = 1;
1534 if (Last_homing_warning_shown[VR_current_page] != 0) {
1535 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_OFF );
1536 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_OFF) ] );
1537 Last_homing_warning_shown[VR_current_page] = 0;
1540 } else if (Last_homing_warning_shown[VR_current_page] != 0) {
1541 PAGE_IN_GAUGE( GAUGE_HOMING_WARNING_OFF );
1542 gr_ubitmapm( HOMING_WARNING_X, HOMING_WARNING_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_HOMING_WARNING_OFF) ] );
1543 Last_homing_warning_shown[VR_current_page] = 0;
1546 WIN(DDGRUNLOCK(dd_grd_curcanv));
1550 #define MAX_SHOWN_LIVES 4
1552 extern int Game_window_y;
1555 void hud_show_homing_warning(void)
1557 if (Players[Player_num].homing_object_dist >= 0) {
1558 if (GameTime & 0x4000) {
1559 int x=0x8000, y=grd_curcanv->cv_h-Line_spacing;
1561 if (weapon_box_user[0] != WBU_WEAPON || weapon_box_user[1] != WBU_WEAPON) {
1562 int wy = (weapon_box_user[0] != WBU_WEAPON)?SW_y[0]:SW_y[1];
1563 y = min(y,(wy - Line_spacing - Game_window_y));
1566 gr_set_curfont( GAME_FONT );
1567 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1568 gr_printf(x,y,TXT_LOCK);
1573 void hud_show_keys(void)
1575 int y = 3*Line_spacing;
1576 int dx = GAME_FONT->ft_w+GAME_FONT->ft_w/2;
1578 if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY) {
1579 PAGE_IN_GAUGE( KEY_ICON_BLUE );
1580 gr_ubitmapm(2,y,&GameBitmaps[ GET_GAUGE_INDEX(KEY_ICON_BLUE) ] );
1584 if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) {
1585 PAGE_IN_GAUGE( KEY_ICON_YELLOW );
1586 gr_ubitmapm(2+dx,y,&GameBitmaps[ GET_GAUGE_INDEX(KEY_ICON_YELLOW) ] );
1589 if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) {
1590 PAGE_IN_GAUGE( KEY_ICON_RED );
1591 gr_ubitmapm(2+2*dx,y,&GameBitmaps[ GET_GAUGE_INDEX(KEY_ICON_RED) ] );
1597 extern grs_bitmap Orb_icons[2];
1599 void hud_show_orbs (void)
1601 if (Game_mode & GM_HOARD) {
1607 if (Cockpit_mode == CM_FULL_COCKPIT) {
1609 x = 4*GAME_FONT->ft_w;
1611 else if (Cockpit_mode == CM_STATUS_BAR) {
1613 x = GAME_FONT->ft_w;
1615 else if (Cockpit_mode == CM_FULL_SCREEN) {
1617 x = GAME_FONT->ft_w;
1622 Int3(); //what sort of cockpit?
1624 bm = &Orb_icons[FontHires];
1625 gr_ubitmapm(x,y,bm);
1627 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1628 gr_printf(x+bm->bm_w+bm->bm_w/2, y+(FontHires?2:1), "x %d", Players[Player_num].secondary_ammo[PROXIMITY_INDEX]);
1633 void hud_show_flag(void)
1635 if ((Game_mode & GM_CAPTURE) && (Players[Player_num].flags & PLAYER_FLAGS_FLAG)) {
1640 if (Cockpit_mode == CM_FULL_COCKPIT) {
1642 x = 4*GAME_FONT->ft_w;
1644 else if (Cockpit_mode == CM_STATUS_BAR) {
1646 x = GAME_FONT->ft_w;
1648 else if (Cockpit_mode == CM_FULL_SCREEN) {
1650 x = GAME_FONT->ft_w;
1655 Int3(); //what sort of cockpit?
1658 icon = (get_team(Player_num) == TEAM_BLUE)?FLAG_ICON_RED:FLAG_ICON_BLUE;
1660 PAGE_IN_GAUGE( icon );
1661 gr_ubitmapm(x,y,&GameBitmaps[ GET_GAUGE_INDEX(icon) ] );
1667 void hud_show_energy(void)
1669 //gr_set_current_canvas(&VR_render_sub_buffer[0]); //render off-screen
1670 gr_set_curfont( GAME_FONT );
1671 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1672 if (Game_mode & GM_MULTI)
1673 gr_printf(2, grd_curcanv->cv_h-5*Line_spacing,"%s: %i", TXT_ENERGY, f2ir(Players[Player_num].energy));
1675 gr_printf(2, grd_curcanv->cv_h-Line_spacing,"%s: %i", TXT_ENERGY, f2ir(Players[Player_num].energy));
1677 if (Newdemo_state==ND_STATE_RECORDING ) {
1678 int energy = f2ir(Players[Player_num].energy);
1680 if (energy != old_energy[VR_current_page]) {
1681 newdemo_record_player_energy(old_energy[VR_current_page], energy);
1682 old_energy[VR_current_page] = energy;
1687 void hud_show_afterburner(void)
1691 if (! (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER))
1692 return; //don't draw if don't have
1694 gr_set_curfont( GAME_FONT );
1695 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1697 y = (Game_mode & GM_MULTI)?(-8*Line_spacing):(-3*Line_spacing);
1699 gr_printf(2, grd_curcanv->cv_h+y, "burn: %d%%" , fixmul(Afterburner_charge,100));
1701 if (Newdemo_state==ND_STATE_RECORDING ) {
1703 if (Afterburner_charge != old_afterburner[VR_current_page]) {
1704 newdemo_record_player_afterburner(old_afterburner[VR_current_page], Afterburner_charge);
1705 old_afterburner[VR_current_page] = Afterburner_charge;
1710 char *d2_very_short_secondary_weapon_names[] =
1711 {"Flash","Guided","SmrtMine","Mercury","Shaker"};
1713 #define SECONDARY_WEAPON_NAMES_VERY_SHORT(weapon_num) \
1714 ((weapon_num <= MEGA_INDEX)?(*(&TXT_CONCUSSION + (weapon_num))): \
1715 d2_very_short_secondary_weapon_names[weapon_num-SMISSILE1_INDEX])
1717 //return which bomb will be dropped next time the bomb key is pressed
1718 extern int which_bomb();
1720 void show_bomb_count(int x,int y,int bg_color,int always_show)
1722 int bomb,count,countx;
1725 bomb = which_bomb();
1726 count = Players[Player_num].secondary_ammo[bomb];
1729 count = min(count,99); //only have room for 2 digits - cheating give 200
1732 countx = (bomb==PROXIMITY_INDEX)?count:-count;
1734 if (always_show && count == 0) //no bombs, draw nothing on HUD
1737 if (!always_show && countx == old_bombcount[VR_current_page])
1740 WIN(DDGRLOCK(dd_grd_curcanv));
1742 // I hate doing this off of hard coded coords!!!!
1744 if (Cockpit_mode == CM_STATUS_BAR) { //draw background
1745 gr_setcolor(bg_color);
1746 if (!Current_display_mode) {
1747 gr_rect(169,189,189,196);
1748 gr_setcolor(gr_find_closest_color(10,10,10));
1749 gr_scanline(168,189,189);
1751 PA_DFX (pa_set_frontbuffer_current());
1752 PA_DFX (gr_rect(338,453,378,470));
1753 PA_DFX(pa_set_backbuffer_current());
1754 gr_rect(338,453,378,470);
1756 gr_setcolor(gr_find_closest_color(10,10,10));
1757 PA_DFX (pa_set_frontbuffer_current());
1758 PA_DFX (gr_scanline(336,378,453));
1759 PA_DFX(pa_set_backbuffer_current());
1760 gr_scanline(336,378,453);
1765 gr_set_fontcolor((bomb==PROXIMITY_INDEX)?gr_find_closest_color(55,0,0):gr_getcolor(59,50,21),bg_color);
1767 gr_set_fontcolor(bg_color,bg_color); //erase by drawing in background color
1769 sprintf(txt,"B:%02d",count);
1771 while ((t=strchr(txt,'1')) != NULL)
1772 *t = '\x84'; //convert to wide '1'
1774 PA_DFX (pa_set_frontbuffer_current());
1775 PA_DFX (gr_string(x,y,txt));
1776 PA_DFX(pa_set_backbuffer_current());
1779 WIN(DDGRUNLOCK(dd_grd_curcanv));
1781 old_bombcount[VR_current_page] = countx;
1784 void draw_primary_ammo_info(int ammo_count)
1786 if (Cockpit_mode == CM_STATUS_BAR)
1787 draw_ammo_info(SB_PRIMARY_AMMO_X,SB_PRIMARY_AMMO_Y,ammo_count,1);
1789 draw_ammo_info(PRIMARY_AMMO_X,PRIMARY_AMMO_Y,ammo_count,1);
1792 //convert '1' characters to special wide ones
1793 #define convert_1s(s) do {char *p=s; while ((p=strchr(p,'1')) != NULL) *p=132;} while(0)
1795 void hud_show_weapons(void)
1800 char weapon_str[32];
1802 // gr_set_current_canvas(&VR_render_sub_buffer[0]); //render off-screen
1803 gr_set_curfont( GAME_FONT );
1804 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1806 y = grd_curcanv->cv_h;
1808 if (Game_mode & GM_MULTI)
1809 y -= 4*Line_spacing;
1811 weapon_name = PRIMARY_WEAPON_NAMES_SHORT(Primary_weapon);
1813 switch (Primary_weapon) {
1815 if (Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)
1816 sprintf(weapon_str, "%s %s %i", TXT_QUAD, weapon_name, Players[Player_num].laser_level+1);
1818 sprintf(weapon_str, "%s %i", weapon_name, Players[Player_num].laser_level+1);
1821 case SUPER_LASER_INDEX: Int3(); break; //no such thing as super laser
1825 sprintf(weapon_str, "%s: %i", weapon_name, f2i((unsigned) Players[Player_num].primary_ammo[VULCAN_INDEX] * (unsigned) VULCAN_AMMO_SCALE));
1826 convert_1s(weapon_str);
1829 case SPREADFIRE_INDEX:
1834 strcpy(weapon_str, weapon_name);
1837 sprintf(weapon_str, "%s: %03i", weapon_name, Omega_charge * 100/MAX_OMEGA_CHARGE);
1838 convert_1s(weapon_str);
1841 default: Int3(); weapon_str[0] = 0; break;
1844 gr_get_string_size(weapon_str, &w, &h, &aw );
1845 gr_printf(grd_curcanv->cv_bitmap.bm_w-5-w, y-2*Line_spacing, weapon_str);
1847 if (Primary_weapon == VULCAN_INDEX) {
1848 if (Players[Player_num].primary_ammo[Primary_weapon] != old_ammo_count[0][VR_current_page]) {
1849 if (Newdemo_state == ND_STATE_RECORDING)
1850 newdemo_record_primary_ammo(old_ammo_count[0][VR_current_page], Players[Player_num].primary_ammo[Primary_weapon]);
1851 old_ammo_count[0][VR_current_page] = Players[Player_num].primary_ammo[Primary_weapon];
1855 if (Primary_weapon == OMEGA_INDEX) {
1856 if (Omega_charge != Old_Omega_charge[VR_current_page]) {
1857 if (Newdemo_state == ND_STATE_RECORDING)
1858 newdemo_record_primary_ammo(Old_Omega_charge[VR_current_page], Omega_charge);
1859 Old_Omega_charge[VR_current_page] = Omega_charge;
1863 weapon_name = SECONDARY_WEAPON_NAMES_VERY_SHORT(Secondary_weapon);
1865 sprintf(weapon_str, "%s %d",weapon_name,Players[Player_num].secondary_ammo[Secondary_weapon]);
1866 gr_get_string_size(weapon_str, &w, &h, &aw );
1867 gr_printf(grd_curcanv->cv_bitmap.bm_w-5-w, y-Line_spacing, weapon_str);
1869 if (Players[Player_num].secondary_ammo[Secondary_weapon] != old_ammo_count[1][VR_current_page]) {
1870 if (Newdemo_state == ND_STATE_RECORDING)
1871 newdemo_record_secondary_ammo(old_ammo_count[1][VR_current_page], Players[Player_num].secondary_ammo[Secondary_weapon]);
1872 old_ammo_count[1][VR_current_page] = Players[Player_num].secondary_ammo[Secondary_weapon];
1875 show_bomb_count(grd_curcanv->cv_bitmap.bm_w-(3*GAME_FONT->ft_w+(FontHires?0:2)), y-3*Line_spacing,-1,1);
1878 void hud_show_cloak_invuln(void)
1880 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1882 if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) {
1883 int y = grd_curcanv->cv_h;
1885 if (Game_mode & GM_MULTI)
1886 y -= 7*Line_spacing;
1888 y -= 4*Line_spacing;
1890 if ((Players[Player_num].cloak_time+CLOAK_TIME_MAX - GameTime > F1_0*3 ) || (GameTime & 0x8000))
1891 gr_printf(2, y, "%s", TXT_CLOAKED);
1894 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
1895 int y = grd_curcanv->cv_h;
1897 if (Game_mode & GM_MULTI)
1898 y -= 10*Line_spacing;
1900 y -= 5*Line_spacing;
1902 if (((Players[Player_num].invulnerable_time + INVULNERABLE_TIME_MAX - GameTime) > F1_0*4) || (GameTime & 0x8000))
1903 gr_printf(2, y, "%s", TXT_INVULNERABLE);
1908 void hud_show_shield(void)
1910 // gr_set_current_canvas(&VR_render_sub_buffer[0]); //render off-screen
1911 gr_set_curfont( GAME_FONT );
1912 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1914 if ( Players[Player_num].shields >= 0 ) {
1915 if (Game_mode & GM_MULTI)
1916 gr_printf(2, grd_curcanv->cv_h-6*Line_spacing,"%s: %i", TXT_SHIELD, f2ir(Players[Player_num].shields));
1918 gr_printf(2, grd_curcanv->cv_h-2*Line_spacing,"%s: %i", TXT_SHIELD, f2ir(Players[Player_num].shields));
1920 if (Game_mode & GM_MULTI)
1921 gr_printf(2, grd_curcanv->cv_h-6*Line_spacing,"%s: 0", TXT_SHIELD );
1923 gr_printf(2, grd_curcanv->cv_h-2*Line_spacing,"%s: 0", TXT_SHIELD );
1926 if (Newdemo_state==ND_STATE_RECORDING ) {
1927 int shields = f2ir(Players[Player_num].shields);
1929 if (shields != old_shields[VR_current_page]) { // Draw the shield gauge
1930 newdemo_record_player_shields(old_shields[VR_current_page], shields);
1931 old_shields[VR_current_page] = shields;
1936 //draw the icons for number of lives
1937 void hud_show_lives()
1939 if ((HUD_nmessages > 0) && (strlen(HUD_messages[hud_first]) > 38))
1942 if (Game_mode & GM_MULTI) {
1943 gr_set_curfont( GAME_FONT );
1944 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
1945 gr_printf(10, 3, "%s: %d", TXT_DEATHS, Players[Player_num].net_killed_total);
1947 else if (Players[Player_num].lives > 1) {
1949 gr_set_curfont( GAME_FONT );
1950 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1951 PAGE_IN_GAUGE( GAUGE_LIVES );
1952 bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_LIVES) ];
1953 gr_ubitmapm(10,3,bm);
1954 gr_printf(10+bm->bm_w+bm->bm_w/2, 4, "x %d", Players[Player_num].lives-1);
1959 void sb_show_lives()
1962 grs_bitmap * bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_LIVES) ];
1969 WIN(DDGRLOCK(dd_grd_curcanv));
1970 if (old_lives[VR_current_page]==-1 || frc) {
1971 gr_set_curfont( GAME_FONT );
1972 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
1973 if (Game_mode & GM_MULTI)
1975 PA_DFX (pa_set_frontbuffer_current());
1976 PA_DFX (gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_DEATHS));
1977 PA_DFX (pa_set_backbuffer_current());
1978 gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_DEATHS);
1983 PA_DFX (pa_set_frontbuffer_current());
1984 PA_DFX (gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_LIVES));
1985 PA_DFX (pa_set_backbuffer_current());
1986 gr_printf(SB_LIVES_LABEL_X,SB_LIVES_LABEL_Y,"%s:", TXT_LIVES);
1990 WIN(DDGRUNLOCK(dd_grd_curcanv));
1992 if (Game_mode & GM_MULTI)
1994 char killed_str[20];
1996 static int last_x[4] = {SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_L,SB_SCORE_RIGHT_H,SB_SCORE_RIGHT_H};
1999 WIN(DDGRLOCK(dd_grd_curcanv));
2000 sprintf(killed_str, "%5d", Players[Player_num].net_killed_total);
2001 gr_get_string_size(killed_str, &w, &h, &aw);
2002 gr_setcolor(BM_XRGB(0,0,0));
2003 gr_rect(last_x[(Current_display_mode?2:0)+VR_current_page], y+1, SB_SCORE_RIGHT, y+GAME_FONT->ft_h);
2004 gr_set_fontcolor(gr_getcolor(0,20,0),-1);
2005 x = SB_SCORE_RIGHT-w-2;
2006 gr_printf(x, y+1, killed_str);
2007 last_x[(Current_display_mode?2:0)+VR_current_page] = x;
2008 WIN(DDGRUNLOCK(dd_grd_curcanv));
2012 if (frc || old_lives[VR_current_page]==-1 || Players[Player_num].lives != old_lives[VR_current_page]) {
2013 WIN(DDGRLOCK(dd_grd_curcanv));
2017 gr_setcolor(BM_XRGB(0,0,0));
2019 PA_DFX (pa_set_frontbuffer_current());
2020 gr_rect(x, y, SB_SCORE_RIGHT, y+bm->bm_h);
2021 PA_DFX (pa_set_backbuffer_current());
2022 gr_rect(x, y, SB_SCORE_RIGHT, y+bm->bm_h);
2024 if (Players[Player_num].lives-1 > 0) {
2025 gr_set_curfont( GAME_FONT );
2026 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
2027 PAGE_IN_GAUGE( GAUGE_LIVES );
2028 #ifdef PA_3DFX_VOODOO
2029 PA_DFX (pa_set_frontbuffer_current());
2030 gr_ubitmapm(x, y,bm);
2031 gr_printf(x+bm->bm_w+GAME_FONT->ft_w, y, "x %d", Players[Player_num].lives-1);
2034 PA_DFX (pa_set_backbuffer_current());
2035 gr_ubitmapm(x, y,bm);
2036 gr_printf(x+bm->bm_w+GAME_FONT->ft_w, y, "x %d", Players[Player_num].lives-1);
2038 // gr_printf(x+12, y, "x %d", Players[Player_num].lives-1);
2040 WIN(DDGRUNLOCK(dd_grd_curcanv));
2043 // for (i=0;i<draw_count;i++,x+=bm->bm_w+2)
2044 // gr_ubitmapm(x,y,bm);
2050 #ifdef PIGGY_USE_PAGING
2051 extern int Piggy_bitmap_cache_next;
2056 int secs = f2i(Players[Player_num].time_level) % 60;
2057 int mins = f2i(Players[Player_num].time_level) / 60;
2059 gr_set_curfont( GAME_FONT );
2061 if (Color_0_31_0 == -1)
2062 Color_0_31_0 = gr_getcolor(0,31,0);
2063 gr_set_fontcolor(Color_0_31_0, -1 );
2065 gr_printf(grd_curcanv->cv_w-4*GAME_FONT->ft_w,grd_curcanv->cv_h-4*Line_spacing,"%d:%02d", mins, secs);
2067 //@@#ifdef PIGGY_USE_PAGING
2071 //@@ sprintf( text, "%d KB", Piggy_bitmap_cache_next/1024 );
2072 //@@ gr_get_string_size( text, &w, &h, &aw );
2073 //@@ gr_printf(grd_curcanv->cv_w-10-w,grd_curcanv->cv_h/2, text );
2080 #define EXTRA_SHIP_SCORE 50000 //get new ship every this many points
2082 void add_points_to_score(int points)
2086 score_time += f1_0*2;
2087 score_display[0] += points;
2088 score_display[1] += points;
2089 if (score_time > f1_0*4) score_time = f1_0*4;
2091 if (points == 0 || Cheats_enabled)
2094 if ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))
2097 prev_score=Players[Player_num].score;
2099 Players[Player_num].score += points;
2101 if (Newdemo_state == ND_STATE_RECORDING)
2102 newdemo_record_player_score(points);
2105 if (Game_mode & GM_MULTI_COOP)
2108 if (Game_mode & GM_MULTI)
2112 if (Players[Player_num].score/EXTRA_SHIP_SCORE != prev_score/EXTRA_SHIP_SCORE) {
2114 Players[Player_num].lives += Players[Player_num].score/EXTRA_SHIP_SCORE - prev_score/EXTRA_SHIP_SCORE;
2115 powerup_basic(20, 20, 20, 0, TXT_EXTRA_LIFE);
2116 if ((snd=Powerup_info[POW_EXTRA_LIFE].hit_sound) > -1 )
2117 digi_play_sample( snd, F1_0 );
2121 void add_bonus_points_to_score(int points)
2125 if (points == 0 || Cheats_enabled)
2128 prev_score=Players[Player_num].score;
2130 Players[Player_num].score += points;
2133 if (Newdemo_state == ND_STATE_RECORDING)
2134 newdemo_record_player_score(points);
2136 if (Game_mode & GM_MULTI)
2139 if (Players[Player_num].score/EXTRA_SHIP_SCORE != prev_score/EXTRA_SHIP_SCORE) {
2141 Players[Player_num].lives += Players[Player_num].score/EXTRA_SHIP_SCORE - prev_score/EXTRA_SHIP_SCORE;
2142 if ((snd=Powerup_info[POW_EXTRA_LIFE].hit_sound) > -1 )
2143 digi_play_sample( snd, F1_0 );
2149 void init_gauge_canvases()
2151 PAGE_IN_GAUGE( SB_GAUGE_ENERGY );
2152 PAGE_IN_GAUGE( GAUGE_AFTERBURNER );
2154 Canv_LeftEnergyGauge = gr_create_canvas( LEFT_ENERGY_GAUGE_W, LEFT_ENERGY_GAUGE_H );
2155 Canv_SBEnergyGauge = gr_create_canvas( SB_ENERGY_GAUGE_W, SB_ENERGY_GAUGE_H );
2156 Canv_SBAfterburnerGauge = gr_create_canvas( SB_AFTERBURNER_GAUGE_W, SB_AFTERBURNER_GAUGE_H );
2157 Canv_RightEnergyGauge = gr_create_canvas( RIGHT_ENERGY_GAUGE_W, RIGHT_ENERGY_GAUGE_H );
2158 Canv_NumericalGauge = gr_create_canvas( NUMERICAL_GAUGE_W, NUMERICAL_GAUGE_H );
2159 Canv_AfterburnerGauge = gr_create_canvas( AFTERBURNER_GAUGE_W, AFTERBURNER_GAUGE_H );
2163 void close_gauge_canvases()
2165 gr_free_canvas( Canv_LeftEnergyGauge );
2166 gr_free_canvas( Canv_SBEnergyGauge );
2167 gr_free_canvas( Canv_SBAfterburnerGauge );
2168 gr_free_canvas( Canv_RightEnergyGauge );
2169 gr_free_canvas( Canv_NumericalGauge );
2170 gr_free_canvas( Canv_AfterburnerGauge );
2177 //draw_gauges_on = 1;
2179 for (i=0; i<2; i++ ) {
2180 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)) )
2185 old_shields[i] = -1;
2189 old_afterburner[i] = -1;
2190 old_bombcount[i] = 0;
2191 old_laser_level[i] = 0;
2193 old_weapon[0][i] = old_weapon[1][i] = -1;
2194 old_ammo_count[0][i] = old_ammo_count[1][i] = -1;
2195 Old_Omega_charge[i] = -1;
2198 cloak_fade_state = 0;
2200 weapon_box_user[0] = weapon_box_user[1] = WBU_WEAPON;
2203 void draw_energy_bar(int energy)
2208 // Draw left energy bar
2209 gr_set_current_canvas( Canv_LeftEnergyGauge );
2210 PAGE_IN_GAUGE( GAUGE_ENERGY_LEFT );
2211 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_ENERGY_LEFT)] );
2212 gr_setcolor( BM_XRGB(0,0,0) );
2214 if ( !Current_display_mode )
2215 not_energy = 61 - (energy*61)/100;
2217 not_energy = 125 - (energy*125)/100;
2220 for (y=0; y < LEFT_ENERGY_GAUGE_H; y++) {
2221 x1 = LEFT_ENERGY_GAUGE_H - 1 - y;
2222 x2 = LEFT_ENERGY_GAUGE_H - 1 - y + not_energy;
2224 if ( y>=0 && y<(LEFT_ENERGY_GAUGE_H/4) ) if (x2 > LEFT_ENERGY_GAUGE_W - 1) x2 = LEFT_ENERGY_GAUGE_W - 1;
2225 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;
2226 if ( y>=((LEFT_ENERGY_GAUGE_H*3)/4) ) if (x2 > LEFT_ENERGY_GAUGE_W - 3) x2 = LEFT_ENERGY_GAUGE_W - 3;
2228 if (x2 > x1) gr_uscanline( x1, x2, y );
2232 dd_gr_set_current_canvas(get_current_game_screen()),
2233 gr_set_current_canvas( get_current_game_screen() )
2235 WIN(DDGRLOCK(dd_grd_curcanv));
2236 gr_ubitmapm( LEFT_ENERGY_GAUGE_X, LEFT_ENERGY_GAUGE_Y, &Canv_LeftEnergyGauge->cv_bitmap );
2237 WIN(DDGRUNLOCK(dd_grd_curcanv));
2239 // Draw right energy bar
2240 gr_set_current_canvas( Canv_RightEnergyGauge );
2241 PAGE_IN_GAUGE( GAUGE_ENERGY_RIGHT );
2242 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_ENERGY_RIGHT) ] );
2243 gr_setcolor( BM_XRGB(0,0,0) );
2246 for (y=0; y < RIGHT_ENERGY_GAUGE_H; y++) {
2247 x1 = RIGHT_ENERGY_GAUGE_W - RIGHT_ENERGY_GAUGE_H + y - not_energy;
2248 x2 = RIGHT_ENERGY_GAUGE_W - RIGHT_ENERGY_GAUGE_H + y;
2250 if ( y>=0 && y<(RIGHT_ENERGY_GAUGE_H/4) ) if (x1 < 0) x1 = 0;
2251 if ( y>=(RIGHT_ENERGY_GAUGE_H/4) && y<((RIGHT_ENERGY_GAUGE_H*3)/4) ) if (x1 < 1) x1 = 1;
2252 if ( y>=((RIGHT_ENERGY_GAUGE_H*3)/4) ) if (x1 < 2) x1 = 2;
2254 if (x2 > x1) gr_uscanline( x1, x2, y );
2258 dd_gr_set_current_canvas(get_current_game_screen()),
2259 gr_set_current_canvas( get_current_game_screen() )
2261 WIN(DDGRLOCK(dd_grd_curcanv));
2262 gr_ubitmapm( RIGHT_ENERGY_GAUGE_X, RIGHT_ENERGY_GAUGE_Y, &Canv_RightEnergyGauge->cv_bitmap );
2263 WIN(DDGRUNLOCK(dd_grd_curcanv));
2266 ubyte afterburner_bar_table[AFTERBURNER_GAUGE_H_L*2] = {
2301 ubyte afterburner_bar_table_hires[AFTERBURNER_GAUGE_H_H*2] = {
2376 void draw_afterburner_bar(int afterburner)
2378 int not_afterburner;
2381 // Draw afterburner bar
2382 gr_set_current_canvas( Canv_AfterburnerGauge );
2383 PAGE_IN_GAUGE( GAUGE_AFTERBURNER );
2384 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_AFTERBURNER) ] );
2385 gr_setcolor( BM_XRGB(0,0,0) );
2387 not_afterburner = fixmul(f1_0 - afterburner,AFTERBURNER_GAUGE_H);
2389 for (y=0;y<not_afterburner;y++) {
2391 gr_uscanline( (Current_display_mode?afterburner_bar_table_hires[y*2]:afterburner_bar_table[y*2]),
2392 (Current_display_mode?afterburner_bar_table_hires[y*2+1]:afterburner_bar_table[y*2+1]), y );
2396 dd_gr_set_current_canvas(get_current_game_screen()),
2397 gr_set_current_canvas( get_current_game_screen() )
2399 WIN(DDGRLOCK(dd_grd_curcanv));
2400 gr_ubitmapm( AFTERBURNER_GAUGE_X, AFTERBURNER_GAUGE_Y, &Canv_AfterburnerGauge->cv_bitmap );
2401 WIN(DDGRUNLOCK(dd_grd_curcanv));
2404 void draw_shield_bar(int shield)
2406 int bm_num = shield>=100?9:(shield / 10);
2408 PAGE_IN_GAUGE( GAUGE_SHIELDS+9-bm_num );
2409 WIN(DDGRLOCK(dd_grd_curcanv));
2410 PA_DFX (pa_set_frontbuffer_current());
2411 PA_DFX (gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] ));
2412 PA_DFX (pa_set_backbuffer_current());
2413 gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] );
2415 WIN(DDGRUNLOCK(dd_grd_curcanv));
2418 #define CLOAK_FADE_WAIT_TIME 0x400
2420 void draw_player_ship(int cloak_state,int old_cloak_state,int x, int y)
2422 static fix cloak_fade_timer=0;
2423 static int cloak_fade_value=GR_FADE_LEVELS-1;
2424 static int refade = 0;
2425 grs_bitmap *bm = NULL;
2427 if (Game_mode & GM_TEAM) {
2429 PAGE_IN_GAUGE( GAUGE_SHIPS+get_team(Player_num) );
2430 bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIPS+get_team(Player_num)) ];
2433 PAGE_IN_GAUGE( GAUGE_SHIPS+Player_num );
2434 bm = &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_SHIPS+Player_num) ];
2438 if (old_cloak_state==-1 && cloak_state)
2441 // mprintf((0, "cloak/oldcloak %d/%d", cloak_state, old_cloak_state));
2444 cloak_fade_value=GR_FADE_LEVELS-1;
2445 cloak_fade_state = 0;
2448 if (cloak_state==1 && old_cloak_state==0)
2449 cloak_fade_state = -1;
2450 //else if (cloak_state==0 && old_cloak_state==1)
2451 // cloak_fade_state = 1;
2453 if (cloak_state==old_cloak_state) //doing "about-to-uncloak" effect
2454 if (cloak_fade_state==0)
2455 cloak_fade_state = 2;
2458 if (cloak_fade_state)
2459 cloak_fade_timer -= FrameTime;
2461 while (cloak_fade_state && cloak_fade_timer < 0) {
2463 cloak_fade_timer += CLOAK_FADE_WAIT_TIME;
2465 cloak_fade_value += cloak_fade_state;
2467 if (cloak_fade_value >= GR_FADE_LEVELS-1) {
2468 cloak_fade_value = GR_FADE_LEVELS-1;
2469 if (cloak_fade_state == 2 && cloak_state)
2470 cloak_fade_state = -2;
2472 cloak_fade_state = 0;
2474 else if (cloak_fade_value <= 0) {
2475 cloak_fade_value = 0;
2476 if (cloak_fade_state == -2)
2477 cloak_fade_state = 2;
2479 cloak_fade_state = 0;
2483 // To fade out both pages in a paged mode.
2484 if (refade) refade = 0;
2485 else if (cloak_state && old_cloak_state && !cloak_fade_state && !refade) {
2486 cloak_fade_state = -1;
2490 #if defined(POLY_ACC)
2494 Gr_scanline_darkening_level = cloak_fade_value;
2495 gr_set_current_canvas( get_current_game_screen() );
2496 PA_DFX (pa_set_frontbuffer_current());
2497 PA_DFX (pa_blit_lit(&grd_curcanv->cv_bitmap, x, y, bm, 0, 0, bm->bm_w, bm->bm_h));
2498 PA_DFX (pa_set_backbuffer_current());
2499 pa_blit_lit(&grd_curcanv->cv_bitmap, x, y, bm, 0, 0, bm->bm_w, bm->bm_h);
2501 Gr_scanline_darkening_level = GR_FADE_LEVELS;
2505 // Gr_scanline_darkening_level = GR_FADE_LEVELS;
2506 // mprintf ((1,"HEY! HIT THIS!\n"));
2514 dd_gr_set_current_canvas(&dd_VR_render_buffer[0]),
2515 gr_set_current_canvas(&VR_render_buffer[0])
2518 WIN(DDGRLOCK(dd_grd_curcanv));
2519 gr_ubitmap( x, y, bm);
2521 Gr_scanline_darkening_level = cloak_fade_value;
2522 gr_rect(x, y, x+bm->bm_w-1, y+bm->bm_h-1);
2523 Gr_scanline_darkening_level = GR_FADE_LEVELS;
2524 WIN(DDGRUNLOCK(dd_grd_curcanv));
2527 dd_gr_set_current_canvas(get_current_game_screen()),
2528 gr_set_current_canvas( get_current_game_screen() )
2532 DDGRLOCK(dd_grd_curcanv);
2533 if (dd_grd_curcanv->lpdds != dd_VR_render_buffer[0].lpdds) {
2534 DDGRLOCK(&dd_VR_render_buffer[0]);
2537 dd_gr_dup_hack(&dd_VR_render_buffer[0], dd_grd_curcanv);
2541 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),
2542 gr_bm_ubitbltm( bm->bm_w, bm->bm_h, x, y, x, y, &VR_render_buffer[0].cv_bitmap, &grd_curcanv->cv_bitmap)
2545 if (dd_grd_curcanv->lpdds != dd_VR_render_buffer[0].lpdds) {
2546 DDGRUNLOCK(&dd_VR_render_buffer[0]);
2549 dd_gr_dup_unhack(&dd_VR_render_buffer[0]);
2551 DDGRUNLOCK(dd_grd_curcanv);
2555 #define INV_FRAME_TIME (f1_0/10) //how long for each frame
2557 void draw_numerical_display(int shield, int energy)
2559 gr_set_current_canvas( Canv_NumericalGauge );
2560 gr_set_curfont( GAME_FONT );
2561 PAGE_IN_GAUGE( GAUGE_NUMERICAL );
2562 gr_ubitmap( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_NUMERICAL) ] );
2564 gr_set_fontcolor(gr_getcolor(14,14,23),-1 );
2566 if (!Current_display_mode) {
2567 gr_printf((shield>99)?3:((shield>9)?5:7),15,"%d",shield);
2568 gr_set_fontcolor(gr_getcolor(25,18,6),-1 );
2569 gr_printf((energy>99)?3:((energy>9)?5:7),2,"%d",energy);
2571 gr_printf((shield>99)?7:((shield>9)?11:15),33,"%d",shield);
2572 gr_set_fontcolor(gr_getcolor(25,18,6),-1 );
2573 gr_printf((energy>99)?7:((energy>9)?11:15),4,"%d",energy);
2577 dd_gr_set_current_canvas(get_current_game_screen()),
2578 gr_set_current_canvas( get_current_game_screen() )
2580 WIN(DDGRLOCK(dd_grd_curcanv));
2581 gr_ubitmapm( NUMERICAL_GAUGE_X, NUMERICAL_GAUGE_Y, &Canv_NumericalGauge->cv_bitmap );
2582 WIN(DDGRUNLOCK(dd_grd_curcanv));
2589 dd_gr_set_current_canvas( get_current_game_screen() ),
2590 gr_set_current_canvas( get_current_game_screen() )
2593 WIN(DDGRLOCK(dd_grd_curcanv));
2594 if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY ) {
2595 PAGE_IN_GAUGE( GAUGE_BLUE_KEY );
2596 gr_ubitmapm( GAUGE_BLUE_KEY_X, GAUGE_BLUE_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_BLUE_KEY) ] );
2598 PAGE_IN_GAUGE( GAUGE_BLUE_KEY_OFF );
2599 gr_ubitmapm( GAUGE_BLUE_KEY_X, GAUGE_BLUE_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_BLUE_KEY_OFF) ] );
2602 if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY) {
2603 PAGE_IN_GAUGE( GAUGE_GOLD_KEY );
2604 gr_ubitmapm( GAUGE_GOLD_KEY_X, GAUGE_GOLD_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_GOLD_KEY) ] );
2606 PAGE_IN_GAUGE( GAUGE_GOLD_KEY_OFF );
2607 gr_ubitmapm( GAUGE_GOLD_KEY_X, GAUGE_GOLD_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_GOLD_KEY_OFF) ] );
2610 if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY) {
2611 PAGE_IN_GAUGE( GAUGE_RED_KEY );
2612 gr_ubitmapm( GAUGE_RED_KEY_X, GAUGE_RED_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_RED_KEY) ] );
2614 PAGE_IN_GAUGE( GAUGE_RED_KEY_OFF );
2615 gr_ubitmapm( GAUGE_RED_KEY_X, GAUGE_RED_KEY_Y, &GameBitmaps[ GET_GAUGE_INDEX(GAUGE_RED_KEY_OFF) ] );
2617 WIN(DDGRUNLOCK(dd_grd_curcanv));
2621 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)
2627 gr_setcolor(BM_XRGB(0,0,0));
2629 // PA_DFX (pa_set_frontbuffer_current());
2630 // PA_DFX (gr_rect(box->left,box->top,box->right,box->bot));
2631 PA_DFX (pa_set_backbuffer_current());
2632 gr_rect(box->left,box->top,box->right,box->bot);
2635 if (Current_display_mode) {
2636 bm=&GameBitmaps[Weapon_info[info_index].hires_picture.index];
2637 PIGGY_PAGE_IN( Weapon_info[info_index].hires_picture );
2640 bm=&GameBitmaps[Weapon_info[info_index].picture.index];
2641 PIGGY_PAGE_IN( Weapon_info[info_index].picture );
2648 // PA_DFX (pa_set_frontbuffer_current());
2649 // PA_DFX (gr_ubitmapm(pic_x,pic_y,bm));
2650 PA_DFX (pa_set_backbuffer_current());
2651 gr_ubitmapm(pic_x,pic_y,bm);
2653 gr_set_fontcolor(gr_getcolor(0,20,0),-1 );
2655 if ((p=strchr(name,'\n'))!=NULL) {
2657 #ifdef PA_3DFX_VOODOO
2658 // pa_set_frontbuffer_current();
2659 // gr_printf(text_x,text_y,name);
2660 // gr_printf(text_x,text_y+grd_curcanv->cv_font->ft_h+1,p+1);
2662 PA_DFX (pa_set_backbuffer_current());
2663 gr_printf(text_x,text_y,name);
2664 gr_printf(text_x,text_y+grd_curcanv->cv_font->ft_h+1,p+1);
2668 // PA_DFX(pa_set_frontbuffer_current());
2669 // PA_DFX (gr_printf(text_x,text_y,name));
2670 PA_DFX(pa_set_backbuffer_current());
2671 gr_printf(text_x,text_y,name);
2674 // For laser, show level and quadness
2675 if (info_index == LASER_ID || info_index == SUPER_LASER_ID) {
2678 sprintf(temp_str, "%s: 0", TXT_LVL);
2680 temp_str[5] = Players[Player_num].laser_level+1 + '0';
2682 // PA_DFX(pa_set_frontbuffer_current());
2683 // PA_DFX (gr_printf(text_x,text_y+Line_spacing, temp_str));
2684 PA_DFX(pa_set_backbuffer_current());
2685 NO_DFX (gr_printf(text_x,text_y+Line_spacing, temp_str));
2686 PA_DFX (gr_printf(text_x,text_y+12, temp_str));
2688 if (Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS) {
2689 strcpy(temp_str, TXT_QUAD);
2690 // PA_DFX(pa_set_frontbuffer_current());
2691 // PA_DFX (gr_printf(text_x,text_y+2*Line_spacing, temp_str));
2692 PA_DFX(pa_set_backbuffer_current());
2693 gr_printf(text_x,text_y+2*Line_spacing, temp_str);
2701 void draw_weapon_info(int weapon_type,int weapon_num,int laser_level)
2705 if (weapon_type == 0) {
2706 info_index = Primary_weapon_to_weapon_info[weapon_num];
2708 if (info_index == LASER_ID && laser_level > MAX_LASER_LEVEL)
2709 info_index = SUPER_LASER_ID;
2711 if (Cockpit_mode == CM_STATUS_BAR)
2712 draw_weapon_info_sub(info_index,
2713 &gauge_boxes[SB_PRIMARY_BOX],
2714 SB_PRIMARY_W_PIC_X,SB_PRIMARY_W_PIC_Y,
2715 PRIMARY_WEAPON_NAMES_SHORT(weapon_num),
2716 SB_PRIMARY_W_TEXT_X,SB_PRIMARY_W_TEXT_Y);
2718 draw_weapon_info_sub(info_index,
2719 &gauge_boxes[COCKPIT_PRIMARY_BOX],
2720 PRIMARY_W_PIC_X,PRIMARY_W_PIC_Y,
2721 PRIMARY_WEAPON_NAMES_SHORT(weapon_num),
2722 PRIMARY_W_TEXT_X,PRIMARY_W_TEXT_Y);
2726 info_index = Secondary_weapon_to_weapon_info[weapon_num];
2728 if (Cockpit_mode == CM_STATUS_BAR)
2729 draw_weapon_info_sub(info_index,
2730 &gauge_boxes[SB_SECONDARY_BOX],
2731 SB_SECONDARY_W_PIC_X,SB_SECONDARY_W_PIC_Y,
2732 SECONDARY_WEAPON_NAMES_SHORT(weapon_num),
2733 SB_SECONDARY_W_TEXT_X,SB_SECONDARY_W_TEXT_Y);
2735 draw_weapon_info_sub(info_index,
2736 &gauge_boxes[COCKPIT_SECONDARY_BOX],
2737 SECONDARY_W_PIC_X,SECONDARY_W_PIC_Y,
2738 SECONDARY_WEAPON_NAMES_SHORT(weapon_num),
2739 SECONDARY_W_TEXT_X,SECONDARY_W_TEXT_Y);
2743 void draw_ammo_info(int x,int y,int ammo_count,int primary)
2749 w = (grd_curcanv->cv_font->ft_w*7)/2;
2751 w = (grd_curcanv->cv_font->ft_w*5)/2;
2753 WIN(DDGRLOCK(dd_grd_curcanv));
2756 PA_DFX (pa_set_frontbuffer_current());
2758 gr_setcolor(BM_XRGB(0,0,0));
2759 gr_rect(x,y,x+w,y+grd_curcanv->cv_font->ft_h);
2760 gr_set_fontcolor(gr_getcolor(20,0,0),-1 );
2761 sprintf(str,"%03d",ammo_count);
2765 PA_DFX (pa_set_backbuffer_current());
2766 gr_rect(x,y,x+w,y+grd_curcanv->cv_font->ft_h);
2770 WIN(DDGRUNLOCK(dd_grd_curcanv));
2773 void draw_secondary_ammo_info(int ammo_count)
2775 if (Cockpit_mode == CM_STATUS_BAR)
2776 draw_ammo_info(SB_SECONDARY_AMMO_X,SB_SECONDARY_AMMO_Y,ammo_count,0);
2778 draw_ammo_info(SECONDARY_AMMO_X,SECONDARY_AMMO_Y,ammo_count,0);
2781 //returns true if drew picture
2782 int draw_weapon_box(int weapon_type,int weapon_num)
2785 int laser_level_changed;
2788 dd_gr_set_current_canvas(&dd_VR_render_buffer[0]),
2789 gr_set_current_canvas(&VR_render_buffer[0])
2792 PA_DFX (pa_set_backbuffer_current());
2794 WIN(DDGRLOCK(dd_grd_curcanv));
2795 gr_set_curfont( GAME_FONT );
2797 laser_level_changed = (weapon_type==0 && weapon_num==LASER_INDEX && (Players[Player_num].laser_level != old_laser_level[VR_current_page]));
2799 if ((weapon_num != old_weapon[weapon_type][VR_current_page] || laser_level_changed) && weapon_box_states[weapon_type] == WS_SET) {
2800 weapon_box_states[weapon_type] = WS_FADING_OUT;
2801 weapon_box_fade_values[weapon_type]=i2f(GR_FADE_LEVELS-1);
2804 if (old_weapon[weapon_type][VR_current_page] == -1) {
2805 //@@if (laser_level_changed)
2806 //@@ old_weapon[weapon_type][VR_current_page] = LASER_INDEX;
2809 draw_weapon_info(weapon_type,weapon_num,Players[Player_num].laser_level);
2810 old_weapon[weapon_type][VR_current_page] = weapon_num;
2811 old_ammo_count[weapon_type][VR_current_page]=-1;
2812 Old_Omega_charge[VR_current_page]=-1;
2813 old_laser_level[VR_current_page] = Players[Player_num].laser_level;
2815 weapon_box_states[weapon_type] = WS_SET;
2819 if (weapon_box_states[weapon_type] == WS_FADING_OUT) {
2820 draw_weapon_info(weapon_type,old_weapon[weapon_type][VR_current_page],old_laser_level[VR_current_page]);
2821 old_ammo_count[weapon_type][VR_current_page]=-1;
2822 Old_Omega_charge[VR_current_page]=-1;
2824 weapon_box_fade_values[weapon_type] -= FrameTime * FADE_SCALE;
2825 if (weapon_box_fade_values[weapon_type] <= 0) {
2826 weapon_box_states[weapon_type] = WS_FADING_IN;
2827 old_weapon[weapon_type][VR_current_page] = weapon_num;
2828 old_weapon[weapon_type][!VR_current_page] = weapon_num;
2829 old_laser_level[VR_current_page] = Players[Player_num].laser_level;
2830 old_laser_level[!VR_current_page] = Players[Player_num].laser_level;
2831 weapon_box_fade_values[weapon_type] = 0;
2834 else if (weapon_box_states[weapon_type] == WS_FADING_IN) {
2835 if (weapon_num != old_weapon[weapon_type][VR_current_page]) {
2836 weapon_box_states[weapon_type] = WS_FADING_OUT;
2839 draw_weapon_info(weapon_type,weapon_num,Players[Player_num].laser_level);
2840 old_ammo_count[weapon_type][VR_current_page]=-1;
2841 Old_Omega_charge[VR_current_page]=-1;
2843 weapon_box_fade_values[weapon_type] += FrameTime * FADE_SCALE;
2844 if (weapon_box_fade_values[weapon_type] >= i2f(GR_FADE_LEVELS-1)) {
2845 weapon_box_states[weapon_type] = WS_SET;
2846 old_weapon[weapon_type][!VR_current_page] = -1; //force redraw (at full fade-in) of other page
2851 if (weapon_box_states[weapon_type] != WS_SET) { //fade gauge
2852 int fade_value = f2i(weapon_box_fade_values[weapon_type]);
2853 int boxofs = (Cockpit_mode==CM_STATUS_BAR)?SB_PRIMARY_BOX:COCKPIT_PRIMARY_BOX;
2855 Gr_scanline_darkening_level = fade_value;
2856 // PA_DFX (pa_set_frontbuffer_current());
2857 // 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));
2858 PA_DFX (pa_set_backbuffer_current());
2859 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);
2861 Gr_scanline_darkening_level = GR_FADE_LEVELS;
2863 WIN(DDGRUNLOCK(dd_grd_curcanv));
2866 dd_gr_set_current_canvas(get_current_game_screen()),
2867 gr_set_current_canvas(get_current_game_screen())
2874 void draw_static(int win)
2876 vclip *vc = &Vclip[VCLIP_MONITOR_STATIC];
2879 int boxofs = (Cockpit_mode==CM_STATUS_BAR)?SB_PRIMARY_BOX:COCKPIT_PRIMARY_BOX;
2882 static_time[win] += FrameTime;
2883 if (static_time[win] >= vc->play_time) {
2884 weapon_box_user[win] = WBU_WEAPON;
2888 framenum = static_time[win] * vc->num_frames / vc->play_time;
2890 PIGGY_PAGE_IN(vc->frames[framenum]);
2892 bmp = &GameBitmaps[vc->frames[framenum].index];
2895 dd_gr_set_current_canvas(&dd_VR_render_buffer[0]),
2896 gr_set_current_canvas(&VR_render_buffer[0])
2898 WIN(DDGRLOCK(dd_grd_curcanv));
2899 PA_DFX (pa_set_backbuffer_current());
2900 PA_DFX (pa_bypass_mode (0));
2901 PA_DFX (pa_clip_window (gauge_boxes[boxofs+win].left,gauge_boxes[boxofs+win].top,
2902 gauge_boxes[boxofs+win].right,gauge_boxes[boxofs+win].bot));
2904 for (x=gauge_boxes[boxofs+win].left;x<gauge_boxes[boxofs+win].right;x+=bmp->bm_w)
2905 for (y=gauge_boxes[boxofs+win].top;y<gauge_boxes[boxofs+win].bot;y+=bmp->bm_h)
2908 PA_DFX (pa_bypass_mode(1));
2909 PA_DFX (pa_clip_window (0,0,640,480));
2911 WIN(DDGRUNLOCK(dd_grd_curcanv));
2914 dd_gr_set_current_canvas(get_current_game_screen()),
2915 gr_set_current_canvas(get_current_game_screen())
2921 copy_gauge_box(&gauge_boxes[boxofs+win],&dd_VR_render_buffer[0]),
2922 copy_gauge_box(&gauge_boxes[boxofs+win],&VR_render_buffer[0].cv_bitmap)
2926 void draw_weapon_boxes()
2928 int boxofs = (Cockpit_mode==CM_STATUS_BAR)?SB_PRIMARY_BOX:COCKPIT_PRIMARY_BOX;
2931 if (weapon_box_user[0] == WBU_WEAPON) {
2932 drew = draw_weapon_box(0,Primary_weapon);
2935 copy_gauge_box(&gauge_boxes[boxofs+0],&dd_VR_render_buffer[0]),
2936 copy_gauge_box(&gauge_boxes[boxofs+0],&VR_render_buffer[0].cv_bitmap)
2939 if (weapon_box_states[0] == WS_SET) {
2940 if ((Primary_weapon == VULCAN_INDEX) || (Primary_weapon == GAUSS_INDEX)) {
2941 if (Players[Player_num].primary_ammo[VULCAN_INDEX] != old_ammo_count[0][VR_current_page]) {
2942 if (Newdemo_state == ND_STATE_RECORDING)
2943 newdemo_record_primary_ammo(old_ammo_count[0][VR_current_page], Players[Player_num].primary_ammo[VULCAN_INDEX]);
2944 draw_primary_ammo_info(f2i((unsigned) VULCAN_AMMO_SCALE * (unsigned) Players[Player_num].primary_ammo[VULCAN_INDEX]));
2945 old_ammo_count[0][VR_current_page] = Players[Player_num].primary_ammo[VULCAN_INDEX];
2949 if (Primary_weapon == OMEGA_INDEX) {
2950 if (Omega_charge != Old_Omega_charge[VR_current_page]) {
2951 if (Newdemo_state == ND_STATE_RECORDING)
2952 newdemo_record_primary_ammo(Old_Omega_charge[VR_current_page], Omega_charge);
2953 draw_primary_ammo_info(Omega_charge * 100/MAX_OMEGA_CHARGE);
2954 Old_Omega_charge[VR_current_page] = Omega_charge;
2959 else if (weapon_box_user[0] == WBU_STATIC)
2962 if (weapon_box_user[1] == WBU_WEAPON) {
2963 drew = draw_weapon_box(1,Secondary_weapon);
2966 copy_gauge_box(&gauge_boxes[boxofs+1],&dd_VR_render_buffer[0]),
2967 copy_gauge_box(&gauge_boxes[boxofs+1],&VR_render_buffer[0].cv_bitmap)
2970 if (weapon_box_states[1] == WS_SET)
2971 if (Players[Player_num].secondary_ammo[Secondary_weapon] != old_ammo_count[1][VR_current_page]) {
2972 old_bombcount[VR_current_page] = 0x7fff; //force redraw
2973 if (Newdemo_state == ND_STATE_RECORDING)
2974 newdemo_record_secondary_ammo(old_ammo_count[1][VR_current_page], Players[Player_num].secondary_ammo[Secondary_weapon]);
2975 draw_secondary_ammo_info(Players[Player_num].secondary_ammo[Secondary_weapon]);
2976 old_ammo_count[1][VR_current_page] = Players[Player_num].secondary_ammo[Secondary_weapon];
2979 else if (weapon_box_user[1] == WBU_STATIC)
2984 void sb_draw_energy_bar(energy)
2986 int erase_height, w, h, aw;
2987 char energy_str[20];
2989 gr_set_current_canvas( Canv_SBEnergyGauge );
2991 PAGE_IN_GAUGE( SB_GAUGE_ENERGY );
2992 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(SB_GAUGE_ENERGY) ] );
2994 erase_height = (100 - energy) * SB_ENERGY_GAUGE_H / 100;
2996 if (erase_height > 0) {
2997 gr_setcolor( BM_XRGB(0,0,0) );
2998 gr_rect(0,0,SB_ENERGY_GAUGE_W-1,erase_height-1);
3002 dd_gr_set_current_canvas(get_current_game_screen()),
3003 gr_set_current_canvas(get_current_game_screen())
3006 WIN(DDGRLOCK(dd_grd_curcanv));
3007 PA_DFX (pa_set_frontbuffer_current());
3008 PA_DFX (gr_ubitmapm( SB_ENERGY_GAUGE_X, SB_ENERGY_GAUGE_Y, &Canv_SBEnergyGauge->cv_bitmap));
3009 PA_DFX (pa_set_backbuffer_current());
3010 gr_ubitmapm( SB_ENERGY_GAUGE_X, SB_ENERGY_GAUGE_Y, &Canv_SBEnergyGauge->cv_bitmap );
3013 sprintf(energy_str, "%d", energy);
3014 gr_get_string_size(energy_str, &w, &h, &aw );
3015 gr_set_fontcolor(gr_getcolor(25,18,6),-1 );
3016 PA_DFX (pa_set_frontbuffer_current());
3017 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));
3018 PA_DFX (pa_set_backbuffer_current());
3019 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);
3020 WIN(DDGRUNLOCK(dd_grd_curcanv));
3023 void sb_draw_afterburner()
3025 int erase_height, w, h, aw;
3026 char ab_str[3] = "AB";
3028 gr_set_current_canvas( Canv_SBAfterburnerGauge );
3029 PAGE_IN_GAUGE( SB_GAUGE_AFTERBURNER );
3030 gr_ubitmapm( 0, 0, &GameBitmaps[ GET_GAUGE_INDEX(SB_GAUGE_AFTERBURNER) ] );
3032 erase_height = fixmul((f1_0 - Afterburner_charge),SB_AFTERBURNER_GAUGE_H);
3034 if (erase_height > 0) {
3035 gr_setcolor( BM_XRGB(0,0,0) );
3036 gr_rect(0,0,SB_AFTERBURNER_GAUGE_W-1,erase_height-1);
3040 dd_gr_set_current_canvas(get_current_game_screen()),
3041 gr_set_current_canvas(get_current_game_screen())
3043 WIN(DDGRLOCK(dd_grd_curcanv));
3044 PA_DFX (pa_set_frontbuffer_current());
3045 gr_ubitmapm( SB_AFTERBURNER_GAUGE_X, SB_AFTERBURNER_GAUGE_Y, &Canv_SBAfterburnerGauge->cv_bitmap );
3046 PA_DFX (pa_set_backbuffer_current());
3047 PA_DFX (gr_ubitmapm( SB_AFTERBURNER_GAUGE_X, SB_AFTERBURNER_GAUGE_Y, &Canv_SBAfterburnerGauge->cv_bitmap ));
3050 if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER)
3051 gr_set_fontcolor(gr_getcolor(45,0,0),-1 );
3053 gr_set_fontcolor(gr_getcolor(12,12,12),-1 );
3055 gr_get_string_size(ab_str, &w, &h, &aw );
3056 PA_DFX (pa_set_frontbuffer_current());
3057 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"));
3058 PA_DFX (pa_set_backbuffer_current());
3059 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");
3061 WIN(DDGRUNLOCK(dd_grd_curcanv));
3064 void sb_draw_shield_num(int shield)
3068 gr_set_curfont( GAME_FONT );
3069 gr_set_fontcolor(gr_getcolor(14,14,23),-1 );
3072 PIGGY_PAGE_IN( cockpit_bitmap[Cockpit_mode+(Current_display_mode?(Num_cockpits/2):0)] );
3074 WIN(DDGRLOCK(dd_grd_curcanv));
3075 PA_DFX (pa_set_back_to_read());
3076 gr_setcolor(gr_gpixel(&grd_curcanv->cv_bitmap,SB_SHIELD_NUM_X-1,SB_SHIELD_NUM_Y-1));
3077 PA_DFX (pa_set_front_to_read());
3079 PA_DFX (pa_set_frontbuffer_current());
3081 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);
3082 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);
3084 PA_DFX (pa_set_backbuffer_current());
3085 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));
3086 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));
3088 WIN(DDGRUNLOCK(dd_grd_curcanv));
3091 void sb_draw_shield_bar(int shield)
3093 int bm_num = shield>=100?9:(shield / 10);
3096 dd_gr_set_current_canvas(get_current_game_screen()),
3097 gr_set_current_canvas(get_current_game_screen())
3099 WIN(DDGRLOCK(dd_grd_curcanv));
3100 PAGE_IN_GAUGE( GAUGE_SHIELDS+9-bm_num );
3101 PA_DFX (pa_set_frontbuffer_current());
3102 gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] );
3103 PA_DFX (pa_set_backbuffer_current());
3104 PA_DFX (gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_SHIELDS+9-bm_num) ] ));
3106 WIN(DDGRUNLOCK(dd_grd_curcanv));
3112 int flags = Players[Player_num].flags;
3115 dd_gr_set_current_canvas(get_current_game_screen()),
3116 gr_set_current_canvas(get_current_game_screen())
3118 WIN(DDGRLOCK(dd_grd_curcanv));
3119 PA_DFX (pa_set_frontbuffer_current());
3120 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF) ];
3121 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF );
3122 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_BLUE_KEY_Y, bm );
3123 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF) ];
3124 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF );
3125 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_GOLD_KEY_Y, bm );
3126 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF) ];
3127 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF );
3128 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_RED_KEY_Y, bm );
3129 #ifdef PA_3DFX_VOODOO
3130 PA_DFX (pa_set_backbuffer_current());
3131 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF) ];
3132 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_BLUE_KEY)?SB_GAUGE_BLUE_KEY:SB_GAUGE_BLUE_KEY_OFF );
3133 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_BLUE_KEY_Y, bm );
3134 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF) ];
3135 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_GOLD_KEY)?SB_GAUGE_GOLD_KEY:SB_GAUGE_GOLD_KEY_OFF );
3136 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_GOLD_KEY_Y, bm );
3137 bm = &GameBitmaps[ GET_GAUGE_INDEX((flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF) ];
3138 PAGE_IN_GAUGE( (flags&PLAYER_FLAGS_RED_KEY)?SB_GAUGE_RED_KEY:SB_GAUGE_RED_KEY_OFF );
3139 gr_ubitmapm( SB_GAUGE_KEYS_X, SB_GAUGE_RED_KEY_Y, bm );
3142 WIN(DDGRUNLOCK(dd_grd_curcanv));
3145 // Draws invulnerable ship, or maybe the flashing ship, depending on invulnerability time left.
3146 void draw_invulnerable_ship()
3151 dd_gr_set_current_canvas(get_current_game_screen()),
3152 gr_set_current_canvas(get_current_game_screen())
3154 WIN(DDGRLOCK(dd_grd_curcanv));
3156 if (((Players[Player_num].invulnerable_time + INVULNERABLE_TIME_MAX - GameTime) > F1_0*4) || (GameTime & 0x8000)) {
3158 if (Cockpit_mode == CM_STATUS_BAR) {
3159 PAGE_IN_GAUGE( GAUGE_INVULNERABLE+invulnerable_frame );
3160 PA_DFX (pa_set_frontbuffer_current());
3161 gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame) ] );
3162 PA_DFX (pa_set_backbuffer_current());
3163 PA_DFX (gr_ubitmapm( SB_SHIELD_GAUGE_X, SB_SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame) ] ));
3165 PAGE_IN_GAUGE( GAUGE_INVULNERABLE+invulnerable_frame );
3166 PA_DFX (pa_set_frontbuffer_current());
3167 PA_DFX (gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame)] ));
3168 PA_DFX (pa_set_backbuffer_current());
3169 gr_ubitmapm( SHIELD_GAUGE_X, SHIELD_GAUGE_Y, &GameBitmaps[GET_GAUGE_INDEX(GAUGE_INVULNERABLE+invulnerable_frame)] );
3174 while (time > INV_FRAME_TIME) {
3175 time -= INV_FRAME_TIME;
3176 if (++invulnerable_frame == N_INVULNERABLE_FRAMES)
3177 invulnerable_frame=0;
3179 } else if (Cockpit_mode == CM_STATUS_BAR)
3180 sb_draw_shield_bar(f2ir(Players[Player_num].shields));
3182 draw_shield_bar(f2ir(Players[Player_num].shields));
3183 WIN(DDGRUNLOCK(dd_grd_curcanv));
3186 extern int Missile_gun;
3187 extern int allowed_to_fire_laser(void);
3188 extern int allowed_to_fire_missile(void);
3190 rgb player_rgb[] = {
3201 extern ubyte Newdemo_flying_guided;
3202 extern int max_window_w;
3204 typedef struct {byte x,y;} xy;
3206 //offsets for reticle parts: high-big high-sml low-big low-sml
3207 xy cross_offsets[4] = { {-8,-5}, {-4,-2}, {-4,-2}, {-2,-1} };
3208 xy primary_offsets[4] = { {-30,14}, {-16,6}, {-15,6}, {-8, 2} };
3209 xy secondary_offsets[4] = { {-24,2}, {-12,0}, {-12,1}, {-6,-2} };
3212 void show_reticle(int force_big_one)
3215 int laser_ready,missile_ready,laser_ammo,missile_ammo;
3216 int cross_bm_num,primary_bm_num,secondary_bm_num;
3217 int use_hires_reticle,small_reticle,ofs,gauge_index;
3219 if (Newdemo_state==ND_STATE_PLAYBACK && Newdemo_flying_guided)
3221 WIN(DDGRLOCK(dd_grd_curcanv));
3222 draw_guided_crosshair();
3223 WIN(DDGRUNLOCK(dd_grd_curcanv));
3227 x = grd_curcanv->cv_w/2;
3228 y = grd_curcanv->cv_h/2;
3230 laser_ready = allowed_to_fire_laser();
3231 missile_ready = allowed_to_fire_missile();
3233 laser_ammo = player_has_weapon(Primary_weapon,0);
3234 missile_ammo = player_has_weapon(Secondary_weapon,1);
3236 primary_bm_num = (laser_ready && laser_ammo==HAS_ALL);
3237 secondary_bm_num = (missile_ready && missile_ammo==HAS_ALL);
3239 if (primary_bm_num && Primary_weapon==LASER_INDEX && (Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS))
3242 if (Secondary_weapon_to_gun_num[Secondary_weapon]==7)
3243 secondary_bm_num += 3; //now value is 0,1 or 3,4
3244 else if (secondary_bm_num && !(Missile_gun&1))
3247 cross_bm_num = ((primary_bm_num > 0) || (secondary_bm_num > 0));
3249 Assert(primary_bm_num <= 2);
3250 Assert(secondary_bm_num <= 4);
3251 Assert(cross_bm_num <= 1);
3253 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);
3259 use_hires_reticle = (FontHires != 0);
3261 use_hires_reticle = !Scanline_double;
3264 WIN(DDGRLOCK(dd_grd_curcanv));
3267 small_reticle = !(grd_curcanv->cv_bitmap.bm_w*3 > max_window_w*2 || force_big_one);
3269 small_reticle = !(grd_curcanv->cv_bitmap.bm_w*3 > max_window_w*(Scanline_double?1:2) || force_big_one);
3271 ofs = (use_hires_reticle?0:2) + small_reticle;
3273 gauge_index = (small_reticle?SML_RETICLE_CROSS:RETICLE_CROSS) + cross_bm_num;
3274 PAGE_IN_GAUGE( gauge_index );
3275 gr_ubitmapm(x+cross_offsets[ofs].x,y+cross_offsets[ofs].y,&GameBitmaps[GET_GAUGE_INDEX(gauge_index)] );
3277 gauge_index = (small_reticle?SML_RETICLE_PRIMARY:RETICLE_PRIMARY) + primary_bm_num;
3278 PAGE_IN_GAUGE( gauge_index );
3279 gr_ubitmapm(x+primary_offsets[ofs].x,y+primary_offsets[ofs].y,&GameBitmaps[GET_GAUGE_INDEX(gauge_index)] );
3281 gauge_index = (small_reticle?SML_RETICLE_SECONDARY:RETICLE_SECONDARY) + secondary_bm_num;
3282 PAGE_IN_GAUGE( gauge_index );
3283 gr_ubitmapm(x+secondary_offsets[ofs].x,y+secondary_offsets[ofs].y,&GameBitmaps[GET_GAUGE_INDEX(gauge_index)] );
3285 WIN(DDGRUNLOCK(dd_grd_curcanv));
3292 void hud_show_kill_list()
3294 int n_players,player_list[MAX_NUM_NET_PLAYERS];
3295 int n_left,i,x0,x1,y,save_y,fth;
3297 // ugly hack since placement of netgame players and kills is based off of
3298 // menuhires (which is always 1 for mac). This throws off placement of
3299 // players in pixel double mode.
3302 MenuHires = !(Scanline_double);
3305 if (Show_kill_list_timer > 0)
3307 Show_kill_list_timer -= FrameTime;
3308 if (Show_kill_list_timer < 0)
3312 gr_set_curfont( GAME_FONT );
3314 n_players = multi_get_kill_list(player_list);
3316 if (Show_kill_list == 3)
3322 n_left = (n_players+1)/2;
3324 //If font size changes, this code might not work right anymore
3325 //Assert(GAME_FONT->ft_h==5 && GAME_FONT->ft_w==7);
3327 fth = GAME_FONT->ft_h;
3329 x0 = LHX(1); x1 = LHX(43);
3331 if (Game_mode & GM_MULTI_COOP)
3334 save_y = y = grd_curcanv->cv_h - n_left*(fth+1);
3336 if (Cockpit_mode == CM_FULL_COCKPIT) {
3337 save_y = y -= LHX(6);
3338 if (Game_mode & GM_MULTI_COOP)
3344 for (i=0;i<n_players;i++) {
3350 if (Cockpit_mode == CM_FULL_COCKPIT)
3351 x0 = grd_curcanv->cv_w - LHX(53);
3353 x0 = grd_curcanv->cv_w - LHX(60);
3354 if (Game_mode & GM_MULTI_COOP)
3355 x1 = grd_curcanv->cv_w - LHX(27);
3357 x1 = grd_curcanv->cv_w - LHX(15); // Right edge of name, change this for width problems
3361 if (Netgame.KillGoal || Netgame.PlayTimeAllowed)
3367 else if (Netgame.KillGoal || Netgame.PlayTimeAllowed)
3375 if (Show_kill_list == 3)
3378 player_num = player_list[i];
3380 if (Show_kill_list == 1 || Show_kill_list==2)
3384 if (Players[player_num].connected != 1)
3385 gr_set_fontcolor(gr_getcolor(12, 12, 12), -1);
3386 else if (Game_mode & GM_TEAM) {
3387 color = get_team(player_num);
3388 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
3392 gr_set_fontcolor(gr_getcolor(player_rgb[color].r,player_rgb[color].g,player_rgb[color].b),-1 );
3398 gr_set_fontcolor(gr_getcolor(player_rgb[player_num].r,player_rgb[player_num].g,player_rgb[player_num].b),-1 );
3401 if (Show_kill_list == 3)
3402 strcpy(name, Netgame.team_name[i]);
3404 strcpy(name,Players[player_num].callsign); // Note link to above if!!
3405 gr_get_string_size(name,&sw,&sh,&aw);
3406 while (sw > (x1-x0-LHX(2))) {
3407 name[strlen(name)-1]=0;
3408 gr_get_string_size(name,&sw,&sh,&aw);
3410 gr_printf(x0,y,"%s",name);
3412 if (Show_kill_list==2)
3414 if (Players[player_num].net_killed_total+Players[player_num].net_kills_total==0)
3415 gr_printf (x1,y,"NA");
3417 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));
3419 else if (Show_kill_list == 3)
3420 gr_printf(x1,y,"%3d",team_kills[i]);
3421 else if (Game_mode & GM_MULTI_COOP)
3422 gr_printf(x1,y,"%-6d",Players[player_num].score);
3423 else if (Netgame.PlayTimeAllowed || Netgame.KillGoal)
3424 gr_printf(x1,y,"%3d(%d)",Players[player_num].net_kills_total,Players[player_num].KillGoalCount);
3426 gr_printf(x1,y,"%3d",Players[player_num].net_kills_total);
3439 extern int Saving_movie_frames;
3441 #define Saving_movie_frames 0
3444 //returns true if viewer can see object
3445 int see_object(int objnum)
3451 //see if we can see this player
3453 fq.p0 = &Viewer->pos;
3454 fq.p1 = &Objects[objnum].pos;
3456 fq.thisobjnum = Viewer - Objects;
3457 fq.flags = FQ_TRANSWALL | FQ_CHECK_OBJS;
3458 fq.startseg = Viewer->segnum;
3459 fq.ignore_obj_list = NULL;
3461 hit_type = find_vector_intersection(&fq, &hit_data);
3463 return (hit_type == HIT_OBJECT && hit_data.hit_object == objnum);
3467 //show names of teammates & players carrying flags
3468 void show_HUD_names()
3470 int show_team_names,show_all_names,show_flags,player_team;
3473 show_all_names = ((Newdemo_state == ND_STATE_PLAYBACK) || (Netgame.ShowAllNames && Show_reticle_name));
3474 show_team_names = (((Game_mode & GM_MULTI_COOP) || (Game_mode & GM_TEAM)) && Show_reticle_name);
3475 show_flags = (Game_mode & GM_CAPTURE) | (Game_mode & GM_HOARD);
3477 if (! (show_all_names || show_team_names || show_flags))
3480 player_team = get_team(Player_num);
3482 for (p=0;p<N_players;p++) { //check all players
3484 int show_name,has_flag;
3486 show_name = ((show_all_names && !(Players[p].flags & PLAYER_FLAGS_CLOAKED)) || (show_team_names && get_team(p)==player_team));
3487 has_flag = (Players[p].connected && Players[p].flags & PLAYER_FLAGS_FLAG);
3489 if (Newdemo_state == ND_STATE_PLAYBACK) {
3490 //if this is a demo, the objnum in the player struct is wrong,
3491 //so we search the object list for the objnum
3493 for (objnum=0;objnum<=Highest_object_index;objnum++)
3494 if (Objects[objnum].type==OBJ_PLAYER && Objects[objnum].id == p)
3496 if (objnum > Highest_object_index) //not in list, thus not visible
3497 show_name = has_flag = 0; //..so don't show name
3500 objnum = Players[p].objnum;
3502 if ((show_name || has_flag) && see_object(objnum)) {
3503 g3s_point player_point;
3505 g3_rotate_point(&player_point,&Objects[objnum].pos);
3507 if (player_point.p3_codes == 0) { //on screen
3509 g3_project_point(&player_point);
3511 if (! (player_point.p3_flags & PF_OVERFLOW)) {
3514 x = player_point.p3_sx;
3515 y = player_point.p3_sy;
3517 if (show_name) { // Draw callsign on HUD
3518 char s[CALLSIGN_LEN+1];
3523 color_num = (Game_mode & GM_TEAM)?get_team(p):p;
3525 sprintf(s, "%s", Players[p].callsign);
3526 gr_get_string_size(s, &w, &h, &aw);
3527 gr_set_fontcolor(gr_getcolor(player_rgb[color_num].r,player_rgb[color_num].g,player_rgb[color_num].b),-1 );
3530 gr_string (x1, y1, s);
3533 if (has_flag) { // Draw box on HUD
3536 dy = -fixmuldiv(fixmul(Objects[objnum].size,Matrix_scale.y),i2f(grd_curcanv->cv_h)/2,player_point.p3_z);
3537 dx = fixmul(dy,grd_curscreen->sc_aspect);
3542 if (Game_mode & GM_CAPTURE)
3543 gr_setcolor((get_team(p) == TEAM_BLUE)?BM_XRGB(31,0,0):BM_XRGB(0,0,31));
3544 else if (Game_mode & GM_HOARD)
3546 if (Game_mode & GM_TEAM)
3547 gr_setcolor((get_team(p) == TEAM_RED)?BM_XRGB(31,0,0):BM_XRGB(0,0,31));
3549 gr_setcolor(BM_XRGB(0,31,0));
3552 gr_line(x+dx-w,y-dy,x+dx,y-dy);
3553 gr_line(x+dx,y-dy,x+dx,y-dy+h);
3555 gr_line(x-dx,y-dy,x-dx+w,y-dy);
3556 gr_line(x-dx,y-dy,x-dx,y-dy+h);
3558 gr_line(x+dx-w,y+dy,x+dx,y+dy);
3559 gr_line(x+dx,y+dy,x+dx,y+dy-h);
3561 gr_line(x-dx,y+dy,x-dx+w,y+dy);
3562 gr_line(x-dx,y+dy,x-dx,y+dy-h);
3572 extern int last_drawn_cockpit[2];
3574 //draw all the things on the HUD
3579 if (Cockpit_mode==CM_STATUS_BAR){
3580 //ogl needs to redraw every frame, at least currently.
3582 last_drawn_cockpit[0]=-1;
3583 last_drawn_cockpit[1]=-1;
3586 // vr_reset_display();
3592 if (Scanline_double) // I should be shot for this ugly hack....
3595 Line_spacing = GAME_FONT->ft_h + GAME_FONT->ft_h/4;
3597 if (Scanline_double)
3601 WIN(DDGRLOCK(dd_grd_curcanv));
3602 // Show score so long as not in rearview
3603 if ( !Rear_view && Cockpit_mode!=CM_REAR_VIEW && Cockpit_mode!=CM_STATUS_BAR && !Saving_movie_frames) {
3606 hud_show_score_added();
3609 if ( !Rear_view && Cockpit_mode!=CM_REAR_VIEW && !Saving_movie_frames)
3610 hud_show_timer_count();
3612 // Show other stuff if not in rearview or letterbox.
3613 if (!Rear_view && Cockpit_mode!=CM_REAR_VIEW) { // && Cockpit_mode!=CM_LETTERBOX) {
3614 if (Cockpit_mode==CM_STATUS_BAR || Cockpit_mode==CM_FULL_SCREEN)
3615 hud_show_homing_warning();
3617 if (Cockpit_mode==CM_FULL_SCREEN) {
3620 hud_show_afterburner();
3622 if (!Saving_movie_frames)
3624 hud_show_cloak_invuln();
3626 if ( ( Newdemo_state==ND_STATE_RECORDING ) && ( Players[Player_num].flags != old_flags[VR_current_page] )) {
3627 newdemo_record_player_flags(old_flags[VR_current_page], Players[Player_num].flags);
3628 old_flags[VR_current_page] = Players[Player_num].flags;
3634 if (!(Game_mode&GM_MULTI && Show_kill_list) && !Saving_movie_frames)
3638 if (Reticle_on && Cockpit_mode != CM_LETTERBOX && (!Use_player_head_angles))
3644 if (Cockpit_mode != CM_LETTERBOX && Cockpit_mode != CM_REAR_VIEW)
3647 if (Cockpit_mode != CM_LETTERBOX && Cockpit_mode != CM_REAR_VIEW)
3651 if (!Saving_movie_frames)
3652 HUD_render_message_frame();
3654 if (Cockpit_mode!=CM_STATUS_BAR && !Saving_movie_frames)
3658 if (Game_mode&GM_MULTI && Show_kill_list)
3659 hud_show_kill_list();
3663 if (Rear_view && Cockpit_mode!=CM_REAR_VIEW) {
3664 HUD_render_message_frame();
3665 gr_set_curfont( GAME_FONT );
3666 gr_set_fontcolor(gr_getcolor(0,31,0),-1 );
3667 if (Newdemo_state == ND_STATE_PLAYBACK)
3668 gr_printf(0x8000,grd_curcanv->cv_h-14,TXT_REAR_VIEW);
3670 gr_printf(0x8000,grd_curcanv->cv_h-10,TXT_REAR_VIEW);
3672 WIN(DDGRUNLOCK(dd_grd_curcanv));
3675 extern short *BackBuffer;
3677 //print out some player statistics
3678 void render_gauges()
3681 static int old_display_mode = 0;
3683 static int old_display_mode = 1;
3685 int energy = f2ir(Players[Player_num].energy);
3686 int shields = f2ir(Players[Player_num].shields);
3687 int cloak = ((Players[Player_num].flags&PLAYER_FLAGS_CLOAKED) != 0);
3691 PA_DFX (pa_set_backbuffer_current());
3693 Assert(Cockpit_mode==CM_FULL_COCKPIT || Cockpit_mode==CM_STATUS_BAR);
3695 // check to see if our display mode has changed since last render time --
3696 // if so, then we need to make new gauge canvases.
3699 if (old_display_mode != Current_display_mode) {
3700 close_gauge_canvases();
3701 init_gauge_canvases();
3702 old_display_mode = Current_display_mode;
3705 if (shields < 0 ) shields = 0;
3708 dd_gr_set_current_canvas(get_current_game_screen()),
3709 gr_set_current_canvas(get_current_game_screen())
3711 gr_set_curfont( GAME_FONT );
3713 if (Newdemo_state == ND_STATE_RECORDING)
3714 if (Players[Player_num].homing_object_dist >= 0)
3715 newdemo_record_homing_distance(Players[Player_num].homing_object_dist);
3717 if (Cockpit_mode == CM_FULL_COCKPIT) {
3718 if (energy != old_energy[VR_current_page]) {
3719 if (Newdemo_state==ND_STATE_RECORDING ) {
3720 newdemo_record_player_energy(old_energy[VR_current_page], energy);
3722 draw_energy_bar(energy);
3723 draw_numerical_display(shields, energy);
3724 old_energy[VR_current_page] = energy;
3727 if (Afterburner_charge != old_afterburner[VR_current_page]) {
3728 if (Newdemo_state==ND_STATE_RECORDING ) {
3729 newdemo_record_player_afterburner(old_afterburner[VR_current_page], Afterburner_charge);
3731 draw_afterburner_bar(Afterburner_charge);
3732 old_afterburner[VR_current_page] = Afterburner_charge;
3735 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
3736 draw_numerical_display(shields, energy);
3737 draw_invulnerable_ship();
3738 old_shields[VR_current_page] = shields ^ 1;
3739 } else if (shields != old_shields[VR_current_page]) { // Draw the shield gauge
3740 if (Newdemo_state==ND_STATE_RECORDING ) {
3741 newdemo_record_player_shields(old_shields[VR_current_page], shields);
3743 draw_shield_bar(shields);
3744 draw_numerical_display(shields, energy);
3745 old_shields[VR_current_page] = shields;
3748 if (Players[Player_num].flags != old_flags[VR_current_page]) {
3749 if (Newdemo_state==ND_STATE_RECORDING )
3750 newdemo_record_player_flags(old_flags[VR_current_page], Players[Player_num].flags);
3752 old_flags[VR_current_page] = Players[Player_num].flags;
3755 show_homing_warning();
3757 show_bomb_count(BOMB_COUNT_X,BOMB_COUNT_Y,gr_find_closest_color(0,0,0),0);
3759 } else if (Cockpit_mode == CM_STATUS_BAR) {
3761 if (energy != old_energy[VR_current_page] || frc) {
3762 if (Newdemo_state==ND_STATE_RECORDING ) {
3763 newdemo_record_player_energy(old_energy[VR_current_page], energy);
3765 sb_draw_energy_bar(energy);
3766 old_energy[VR_current_page] = energy;
3769 if (Afterburner_charge != old_afterburner[VR_current_page] || frc) {
3770 if (Newdemo_state==ND_STATE_RECORDING ) {
3771 newdemo_record_player_afterburner(old_afterburner[VR_current_page], Afterburner_charge);
3773 sb_draw_afterburner();
3774 old_afterburner[VR_current_page] = Afterburner_charge;
3777 if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
3778 draw_invulnerable_ship();
3779 old_shields[VR_current_page] = shields ^ 1;
3780 sb_draw_shield_num(shields);
3783 if (shields != old_shields[VR_current_page] || frc) { // Draw the shield gauge
3784 if (Newdemo_state==ND_STATE_RECORDING ) {
3785 newdemo_record_player_shields(old_shields[VR_current_page], shields);
3787 sb_draw_shield_bar(shields);
3788 old_shields[VR_current_page] = shields;
3789 sb_draw_shield_num(shields);
3792 if (Players[Player_num].flags != old_flags[VR_current_page] || frc) {
3793 if (Newdemo_state==ND_STATE_RECORDING )
3794 newdemo_record_player_flags(old_flags[VR_current_page], Players[Player_num].flags);
3796 old_flags[VR_current_page] = Players[Player_num].flags;
3800 if ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP))
3802 if (Players[Player_num].net_killed_total != old_lives[VR_current_page] || frc) {
3804 old_lives[VR_current_page] = Players[Player_num].net_killed_total;
3809 if (Players[Player_num].lives != old_lives[VR_current_page] || frc) {
3811 old_lives[VR_current_page] = Players[Player_num].lives;
3815 if ((Game_mode&GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) {
3816 if (Players[Player_num].net_kills_total != old_score[VR_current_page] || frc) {
3818 old_score[VR_current_page] = Players[Player_num].net_kills_total;
3822 if (Players[Player_num].score != old_score[VR_current_page] || frc) {
3824 old_score[VR_current_page] = Players[Player_num].score;
3828 sb_show_score_added();
3831 show_bomb_count(SB_BOMB_COUNT_X,SB_BOMB_COUNT_Y,gr_find_closest_color(5,5,5),0);
3834 if (frc || cloak != old_cloak[VR_current_page] || cloak_fade_state || (cloak && GameTime>Players[Player_num].cloak_time+CLOAK_TIME_MAX-i2f(3))) {
3835 if (Cockpit_mode == CM_FULL_COCKPIT)
3836 draw_player_ship(cloak,old_cloak[VR_current_page],SHIP_GAUGE_X,SHIP_GAUGE_Y);
3838 draw_player_ship(cloak,old_cloak[VR_current_page],SB_SHIP_GAUGE_X,SB_SHIP_GAUGE_Y);
3840 old_cloak[VR_current_page]=cloak;
3844 draw_weapon_boxes();
3848 // ---------------------------------------------------------------------------------------------------------
3849 // Call when picked up a laser powerup.
3850 // If laser is active, set old_weapon[0] to -1 to force redraw.
3851 void update_laser_weapon_info(void)
3853 if (old_weapon[0][VR_current_page] == 0)
3854 if (! (Players[Player_num].laser_level > MAX_LASER_LEVEL && old_laser_level[VR_current_page] <= MAX_LASER_LEVEL))
3855 old_weapon[0][VR_current_page] = -1;
3858 extern int Game_window_y;
3859 void fill_background(void);
3861 int SW_drawn[2], SW_x[2], SW_y[2], SW_w[2], SW_h[2];
3863 //draws a 3d view into one of the cockpit windows. win is 0 for left,
3864 //1 for right. viewer is object. NULL object means give up window
3865 //user is one of the WBU_ constants. If rear_view_flag is set, show a
3866 //rear view. If label is non-NULL, print the label at the top of the
3868 void do_cockpit_window_view(int win,object *viewer,int rear_view_flag,int user,char *label)
3871 dd_grs_canvas window_canv,
3872 grs_canvas window_canv
3875 static dd_grs_canvas overlap_canv,
3876 static grs_canvas overlap_canv
3880 int saved_window_x, saved_window_y;
3883 object *viewer_save = Viewer;
3884 static int overlap_dirty[2]={0,0};
3886 static int window_x,window_y;
3888 int rear_view_save = Rear_view;
3893 if (viewer == NULL) { //this user is done
3895 Assert(user == WBU_WEAPON || user == WBU_STATIC);
3897 if (user == WBU_STATIC && weapon_box_user[win] != WBU_STATIC)
3898 static_time[win] = 0;
3900 if (weapon_box_user[win] == WBU_WEAPON || weapon_box_user[win] == WBU_STATIC)
3901 return; //already set
3903 weapon_box_user[win] = user;
3905 if (overlap_dirty[win]) {
3907 dd_gr_set_current_canvas(&dd_VR_screen_pages[VR_current_page]),
3908 gr_set_current_canvas(&VR_screen_pages[VR_current_page])
3911 overlap_dirty[win] = 0;
3917 update_rendered_data(win+1, viewer, rear_view_flag, user);
3919 weapon_box_user[win] = user; //say who's using window
3922 Rear_view = rear_view_flag;
3924 if (Cockpit_mode == CM_FULL_SCREEN)
3927 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
3929 if (Scanline_double)
3933 h = i2f(w) / grd_curscreen->sc_aspect;
3935 dx = (win==0)?-(w+(w/10)):(w/10);
3937 window_x = VR_render_buffer[0].cv_bitmap.bm_w/2+dx;
3938 window_y = VR_render_buffer[0].cv_bitmap.bm_h-h-(h/10);
3941 saved_window_x = window_x;
3942 saved_window_y = window_y;
3943 window_x = dd_VR_render_sub_buffer[0].canvas.cv_bitmap.bm_w/2+dx;
3944 window_y = VR_render_buffer[0].cv_bitmap.bm_h-h-(h/10)-dd_VR_render_sub_buffer[0].yoff;
3948 if (Scanline_double) {
3949 window_x = (VR_render_buffer[0].cv_bitmap.bm_w/2+VR_render_sub_buffer[0].cv_bitmap.bm_x)/2+dx;
3950 window_y = ((VR_render_buffer[0].cv_bitmap.bm_h+VR_render_sub_buffer[0].cv_bitmap.bm_y)/2)-h-(h/10);
3954 //copy these vars so stereo code can get at them
3955 SW_drawn[win]=1; SW_x[win] = window_x; SW_y[win] = window_y; SW_w[win] = w; SW_h[win] = h;
3958 dd_gr_init_sub_canvas(&window_canv, &dd_VR_render_buffer[0],window_x,window_y,w,h),
3959 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],window_x,window_y,w,h)
3963 if (Cockpit_mode == CM_FULL_COCKPIT)
3964 boxnum = (COCKPIT_PRIMARY_BOX)+win;
3965 else if (Cockpit_mode == CM_STATUS_BAR)
3966 boxnum = (SB_PRIMARY_BOX)+win;
3970 box = &gauge_boxes[boxnum];
3974 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),
3975 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],box->left,box->top,box->right-box->left+1,box->bot-box->top+1)
3978 if (Scanline_double)
3979 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);
3981 gr_init_sub_canvas(&window_canv,&VR_render_buffer[0],box->left,box->top,box->right-box->left+1,box->bot-box->top+1);
3986 dd_gr_set_current_canvas(&window_canv),
3987 gr_set_current_canvas(&window_canv)
3990 #if defined(MACINTOSH) && defined(POLY_ACC)
3993 switch (Cockpit_mode)
3995 // copy these vars so stereo code can get at them
3996 // SW_drawn[win]=1; SW_x[win] = window_x; SW_y[win] = window_y; SW_w[win] = w; SW_h[win] = h;
3997 case CM_FULL_SCREEN:
3998 ; // do not switch contexts
3999 pa_set_3d_window_offsets(window_x, window_y);
4001 case CM_FULL_COCKPIT:
4005 pa_set_context(kSubViewZeroDrawContextID, NULL);
4009 pa_set_context(kSubViewOneDrawContextID, NULL);
4013 Int3(); // invalid cockpit mode
4018 WIN(DDGRLOCK(dd_grd_curcanv));
4024 if (Cockpit_mode != CM_FULL_SCREEN)
4032 render_frame(0, win+1);
4038 if (Cockpit_mode != CM_FULL_SCREEN)
4046 WIN(DDGRUNLOCK(dd_grd_curcanv));
4048 // HACK! If guided missile, wake up robots as necessary.
4049 if (viewer->type == OBJ_WEAPON) {
4050 // -- Used to require to be GUIDED -- if (viewer->id == GUIDEDMISS_ID)
4051 wake_up_rendered_objects(viewer, win+1);
4055 WIN(DDGRLOCK(dd_grd_curcanv));
4056 MAC(if (Scanline_double) FontHires = 0;) // get the right font size
4057 gr_set_curfont( GAME_FONT );
4058 if (Color_0_31_0 == -1)
4059 Color_0_31_0 = gr_getcolor(0,31,0);
4060 gr_set_fontcolor(Color_0_31_0, -1);
4061 gr_printf(0x8000,2,label);
4062 MAC(if (Scanline_double) FontHires = 1;) // get the right font size back to normal
4063 WIN(DDGRUNLOCK(dd_grd_curcanv));
4066 if (user == WBU_GUIDED) {
4067 WIN(DDGRLOCK(dd_grd_curcanv));
4068 draw_guided_crosshair();
4069 WIN(DDGRUNLOCK(dd_grd_curcanv));
4072 if (Cockpit_mode == CM_FULL_SCREEN) {
4073 int small_window_bottom,big_window_bottom,extra_part_h;
4075 WIN(DDGRLOCK(dd_grd_curcanv));
4077 gr_setcolor(BM_XRGB(0,0,32));
4078 gr_ubox(0,0,grd_curcanv->cv_bitmap.bm_w-1,grd_curcanv->cv_bitmap.bm_h-1);
4080 WIN(DDGRUNLOCK(dd_grd_curcanv));
4082 //if the window only partially overlaps the big 3d window, copy
4083 //the extra part to the visible screen
4085 #ifdef MACINTOSH // recalc window_x and window_y because of scanline doubling problems
4089 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
4090 h = i2f(w) / grd_curscreen->sc_aspect;
4091 dx = (win==0)?-(w+(w/10)):(w/10);
4092 window_x = VR_render_buffer[0].cv_bitmap.bm_w/2+dx;
4093 window_y = VR_render_buffer[0].cv_bitmap.bm_h-h-(h/10);
4094 if (Scanline_double)
4095 window_x += ((win==0)?2:-1); // a real hack here....
4098 big_window_bottom = Game_window_y + Game_window_h - 1;
4101 window_x = saved_window_x;
4102 window_y = saved_window_y;
4103 // dd_gr_init_sub_canvas(&window_canv, &dd_VR_render_buffer[0],window_x,window_y,
4104 // VR_render_buffer[0].cv_bitmap.bm_w/6,
4105 // i2f(VR_render_buffer[0].cv_bitmap.bm_w/6) / grd_curscreen->sc_aspect);
4109 if (window_y > big_window_bottom) {
4111 //the small window is completely outside the big 3d window, so
4112 //copy it to the visible screen
4114 if (VR_screen_flags & VRF_USE_PAGING)
4116 dd_gr_set_current_canvas(&dd_VR_screen_pages[!VR_current_page]),
4117 gr_set_current_canvas(&VR_screen_pages[!VR_current_page])
4121 dd_gr_set_current_canvas(get_current_game_screen()),
4122 gr_set_current_canvas(get_current_game_screen())
4126 if (Scanline_double)
4127 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);
4129 #endif // note link to above if
4131 dd_gr_blt_notrans(&window_canv, 0,0,0,0,
4132 dd_grd_curcanv, window_x, window_y, 0,0),
4133 gr_bitmap(window_x,window_y,&window_canv.cv_bitmap)
4136 overlap_dirty[win] = 1;
4141 small_window_bottom = window_y + window_canv.canvas.cv_bitmap.bm_h - 1,
4142 small_window_bottom = window_y + window_canv.cv_bitmap.bm_h - 1
4145 if (Scanline_double)
4146 small_window_bottom = window_y + (window_canv.cv_bitmap.bm_h*2) - 1;
4149 extra_part_h = small_window_bottom - big_window_bottom;
4151 if (extra_part_h > 0) {
4154 if (Scanline_double)
4159 dd_gr_init_sub_canvas(&overlap_canv,&window_canv,0,
4160 window_canv.canvas.cv_bitmap.bm_h-extra_part_h,
4161 window_canv.canvas.cv_bitmap.bm_w,extra_part_h),
4162 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)
4165 if (VR_screen_flags & VRF_USE_PAGING)
4167 dd_gr_set_current_canvas(&dd_VR_screen_pages[!VR_current_page]),
4168 gr_set_current_canvas(&VR_screen_pages[!VR_current_page])
4172 dd_gr_set_current_canvas(get_current_game_screen()),
4173 gr_set_current_canvas(get_current_game_screen())
4177 if (Scanline_double)
4178 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);
4180 #endif // note link to above if
4182 dd_gr_blt_notrans(&overlap_canv, 0,0,0,0,
4183 dd_grd_curcanv, window_x, big_window_bottom+1, 0,0),
4184 gr_bitmap(window_x,big_window_bottom+1,&overlap_canv.cv_bitmap)
4187 overlap_dirty[win] = 1;
4192 PA_DFX (goto skip_this_junk);
4195 dd_gr_set_current_canvas(get_current_game_screen()),
4196 gr_set_current_canvas(get_current_game_screen())
4200 copy_gauge_box(box,&dd_VR_render_buffer[0]),
4201 copy_gauge_box(box,&VR_render_buffer[0].cv_bitmap)
4204 if (Scanline_double)
4205 copy_gauge_box_double(box,&VR_render_buffer[0].cv_bitmap); // pixel double the external view
4207 // Only do this if we are not running under RAVE, otherwise we erase all of the rendering RAVE has done.
4210 copy_gauge_box(box,&VR_render_buffer[0].cv_bitmap);
4215 PA_DFX(skip_this_junk:)
4217 #if defined(MACINTOSH) && defined(POLY_ACC)
4220 pa_set_context(kGamePlayDrawContextID, NULL);
4224 //force redraw when done
4225 old_weapon[win][VR_current_page] = old_ammo_count[win][VR_current_page] = -1;
4229 Viewer = viewer_save;
4231 Rear_view = rear_view_save;
4235 void calculate_sub_view_window_bounds(int inSubWindowNum, TQARect* outBoundsRect)
4238 gauge_box* currentGaugeBox = NULL;
4245 Assert(outBoundsRect);
4246 Assert((inSubWindowNum == 0) || (inSubWindowNum == 1));
4247 Assert(!Scanline_double);
4249 switch (Cockpit_mode)
4251 case CM_FULL_SCREEN:
4252 // note: this calculation is taken from do_cockpit_window_view for the full
4255 w = (VR_render_buffer[0].cv_bitmap.bm_w) / 6;
4256 h = (i2f(w)) / (grd_curscreen->sc_aspect);
4258 dx = (inSubWindowNum==0)?-(w+(w/10)):(w/10);
4260 window_x = ((VR_render_buffer[0].cv_bitmap.bm_w) / 2) + dx;
4261 window_y = (VR_render_buffer[0].cv_bitmap.bm_h) - h - (h/10);
4263 outBoundsRect->top = window_x;
4264 outBoundsRect->left = window_y;
4265 outBoundsRect->bottom = window_x + w;
4266 outBoundsRect->right = window_y + h;
4269 case CM_FULL_COCKPIT:
4271 if (inSubWindowNum == 0)
4273 boxNumber = SB_PRIMARY_BOX;
4277 boxNumber = SB_SECONDARY_BOX;
4280 //boxNumber = (Current_display_mode * 4) + (Cockpit_mode * 2) + inSubWindowNum;
4281 currentGaugeBox = &gauge_boxes[boxNumber];
4282 Assert(currentGaugeBox);
4284 outBoundsRect->top = currentGaugeBox->top;
4285 outBoundsRect->left = currentGaugeBox->left;
4286 outBoundsRect->bottom = currentGaugeBox->bot + 1;
4287 outBoundsRect->right = currentGaugeBox->right + 1;