]> icculus.org git repositories - taylor/freespace2.git/blob - src/hud/hudconfig.cpp
const-char warning fixes
[taylor/freespace2.git] / src / hud / hudconfig.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell 
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 /*
10  * $Logfile: /Freespace2/code/Hud/HUDconfig.cpp $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  * C module to handle HUD configuration
16  *
17  * $Log$
18  * Revision 1.7  2005/03/29 02:18:47  taylor
19  * Various 64-bit platform fixes
20  * Fix compiler errors with MAKE_FS1 and fix gr_set_bitmap() too
21  * Make sure that turrets can fire at asteroids for FS1 (needed for a couple missions)
22  * Streaming audio support (big thanks to Pierre Willenbrock!!)
23  * Removed dependance on strings.tbl for FS1 since we don't actually need it now
24  *
25  * Revision 1.6  2004/09/20 01:31:44  theoddone33
26  * GCC 3.4 fixes.
27  *
28  * Revision 1.5  2003/05/25 02:30:42  taylor
29  * Freespace 1 support
30  *
31  * Revision 1.4  2002/06/09 04:41:21  relnev
32  * added copyright header
33  *
34  * Revision 1.3  2002/06/01 07:12:33  relnev
35  * a few NDEBUG updates.
36  *
37  * removed a few warnings.
38  *
39  * Revision 1.2  2002/05/07 03:16:45  theoddone33
40  * The Great Newline Fix
41  *
42  * Revision 1.1.1.1  2002/05/03 03:28:09  root
43  * Initial import.
44  *
45  * 
46  * 19    10/25/99 5:43p Jefff
47  * reassigned some xstr ids
48  * 
49  * 18    10/14/99 2:50p Jefff
50  * localization fixes
51  * 
52  * 17    9/02/99 5:09p Jefff
53  * disabled options now draw as a dark gray color
54  * 
55  * 16    9/01/99 11:16a Dave
56  * Reverse direction of HUD config RGB sliders.
57  * 
58  * 15    8/19/99 3:17p Dave
59  * Fixed talking head disappearing.
60  * 
61  * 14    8/19/99 2:33p Dave
62  * Make sure support gauge and net lag gauge are configurable.
63  * 
64  * 13    8/16/99 5:25p Dave
65  * New hud config. Whee!
66  * 
67  * 12    8/16/99 4:04p Dave
68  * Big honking checkin.
69  * 
70  * 11    7/30/99 10:31p Dave
71  * Added comm menu to the configurable hud files.
72  * 
73  * 10    7/30/99 11:05a Jasenw
74  * Fixed hud config for new text warning gauge,
75  * 
76  * 9     7/24/99 1:54p Dave
77  * Hud text flash gauge. Reworked dead popup to use 4 buttons in red-alert
78  * missions.
79  * 
80  * 8     7/15/99 9:20a Andsager
81  * FS2_DEMO initial checkin
82  * 
83  * 7     6/08/99 2:33p Dave
84  * Fixed release build warning. Put in hud config stuff.
85  * 
86  * 6     6/08/99 1:14a Dave
87  * Multi colored hud test.
88  * 
89  * 5     1/30/99 5:08p Dave
90  * More new hi-res stuff.Support for nice D3D textures.
91  * 
92  * 4     10/13/98 9:28a Dave
93  * Started neatening up freespace.h. Many variables renamed and
94  * reorganized. Added AlphaColors.[h,cpp]
95  * 
96  * 3     10/07/98 11:28a Dave
97  * Removed wacky pragma.
98  * 
99  * 2     10/07/98 10:53a Dave
100  * Initial checkin.
101  * 
102  * 1     10/07/98 10:49a Dave
103  * 
104  * 72    8/25/98 1:48p Dave
105  * First rev of EMP effect. Player side stuff basically done. Next comes
106  * AI code.
107  * 
108  * 71    6/09/98 10:31a Hoffoss
109  * Created index numbers for all xstr() references.  Any new xstr() stuff
110  * added from here on out should be added to the end if the list.  The
111  * current list count can be found in FreeSpace.cpp (search for
112  * XSTR_SIZE).
113  * 
114  * 70    6/01/98 11:43a John
115  * JAS & MK:  Classified all strings for localization.
116  * 
117  * 69    5/24/98 9:01p Lawrance
118  * Add commit sounds when accept is pressed
119  * 
120  * 68    5/23/98 3:31p Dave
121  * Tweaked pxo code. Fixed observer HUD stuff.
122  * 
123  * 67    5/08/98 10:12a Lawrance
124  * play sound for auto-target toggle, don't display HUD message
125  * 
126  * 66    4/29/98 6:00p Dave
127  * Fixed chatbox font colors. Made observer offscreen indicators work.
128  * Numerous small UI fixes. Fix rank limitations for mp games. 
129  * 
130  * 65    4/20/98 12:04a Lawrance
131  * tweak how button light up 
132  * 
133  * 64    4/16/98 4:07p Hoffoss
134  * Fixed bug with palette reseting when loading a new pilot.  Also made
135  * barracks default to palette merging mode.
136  * 
137  * 63    4/16/98 10:48a Lawrance
138  * reposition a couple of gauges
139  * 
140  * 62    4/14/98 6:16p Lawrance
141  * Fix bug that was preventing non-green HUD color from getting set.
142  * 
143  * 61    4/12/98 5:32p Lawrance
144  * don't show talking head in demo version of hud config
145  * 
146  * 60    4/10/98 12:07a Lawrance
147  * Fix up talking head gauge.
148  * 
149  * 59    4/08/98 10:15a Lawrance
150  * allow kills gauge to be popup
151  * 
152  * 58    4/08/98 1:18a Lawrance
153  * Add in kills gauge art to HUD config.
154  * 
155  * 57    4/05/98 7:42p Lawrance
156  * Add kills gauge
157  * 
158  * 56    4/03/98 3:13p Dave
159  * More work on udp reliable transport. Fixed observer hud offset problem.
160  * Made observer join and ingame join work again. Put subnet broadcasting
161  * in for TCP.
162  * 
163  * 55    4/01/98 6:46p Lawrance
164  * default damage popup to on
165  * 
166  * 54    3/31/98 11:47p Lawrance
167  * Add popup functionality for the countermeasure gauge.
168  * 
169  * 53    3/30/98 4:48p Lawrance
170  * Turn on offscreen indicator range by default
171  * 
172  * 52    3/26/98 5:45p Lawrance
173  * Added new gauges to HUD config
174  * 
175  * 51    3/15/98 4:17p Dave
176  * Fixed oberver hud problems. Put in handy netplayer macros. Reduced size
177  * of network orientation matrices.
178  * 
179  * 50    3/12/98 5:45p Dave
180  * Put in new observer HUD. Made it possible for observers to join at the
181  * beginning of a game and follow it around as an observer full-time.
182  * 
183  * 49    3/11/98 12:13a Lawrance
184  * redraw pressed buttons
185  * 
186  * 48    3/05/98 12:39a Lawrance
187  * show comma in 10000
188  * 
189  * 47    2/22/98 4:30p John
190  * More string externalization classification
191  * 
192  * 46    2/22/98 4:17p John
193  * More string externalization classification... 190 left to go!
194  * 
195  * 45    2/22/98 12:19p John
196  * Externalized some strings
197  * 
198  * 44    1/23/98 6:24p Lawrance
199  * Implement wingman status gauge
200  * 
201  * 43    1/22/98 10:45p Lawrance
202  * Add coutermeasures and objective display to hud config.
203  * 
204  * 42    1/19/98 11:37p Lawrance
205  * Fixing Optimization build warnings
206  * 
207  * 41    1/17/98 10:02p Lawrance
208  * Fix bug with damage popup that would sometimes display with <none>.
209  * 
210  * 40    1/17/98 1:30a Lawrance
211  * Add countermeasure gauge
212  * 
213  * 39    1/15/98 5:10p Allender
214  * ton of interface changes.  chatbox in multiplayer now behaves
215  * differently than before.  It's always active in any screen that uses
216  * it.  Only non-printatble characters will get passed back out from
217  * chatbox
218  * 
219  * 38    1/14/98 11:07p Lawrance
220  * Hook in brightness slider to HUD config.
221  * 
222  * 37    1/14/98 6:42p Hoffoss
223  * Massive changes to UI code.  A lot cleaner and better now.  Did all
224  * this to get the new UI_DOT_SLIDER to work properly, which the old code
225  * wasn't flexible enough to handle.
226  * 
227  * 36    1/14/98 12:25p Lawrance
228  * center gauge text, use correct game palette.
229  * 
230  * 35    1/13/98 5:33p Lawrance
231  * Tweaking HUD config.
232  * 
233  * 34    1/13/98 2:20p John
234  * Added code to load palette based on hud color.  Added code to turn off
235  * nebulas using detail.  Added code in WinMain to time out after waiting
236  * too long for window creation.    
237  * 
238  * 33    1/13/98 10:22a Lawrance
239  * Integrate new art changes.
240  * 
241  * 32    1/12/98 11:16p Lawrance
242  * Wonderful HUD config.
243  * 
244  * 31    1/10/98 12:41a Lawrance
245  * start work on new HUD config
246  * 
247  * 30    1/05/98 9:38p Lawrance
248  * Implement flashing HUD gauges.
249  * 
250  * 29    1/02/98 9:10p Lawrance
251  * Big changes to how colors get set on the HUD.
252  * 
253  * 28    12/16/97 9:13p Lawrance
254  * Integrate new gauges into HUD config.
255  * 
256  * 27    12/01/97 12:27a Lawrance
257  * redo default alpha color for HUD, make it easy to modify in the future
258  * 
259  *
260  * $NoKeywords: $
261  *
262 */
263
264 #include "hud.h"
265 #include "hudconfig.h"
266 #include "freespace.h"
267 #include "gamesequence.h"
268 #include "player.h"
269 #include "2d.h"
270
271 #include "key.h"
272 #include "timer.h"
273 #include "math.h"
274 #include "mouse.h"
275 #include "ui.h"
276 #include "bmpman.h"
277 #include "palman.h"
278 #include "hudobserver.h"
279 #include "ui.h"
280 #include "missionshipchoice.h"
281 #include "gamesnd.h"
282 #include "alphacolors.h"
283 #include "popup.h"
284
285
286 //////////////////////////////////////////////////////////////////////////////
287 // Game-wide Globals
288 //////////////////////////////////////////////////////////////////////////////
289
290 #define MAX_HCF_FILES                   30
291 int HC_num_files = -1;                                          // num known hcf files
292 int HC_current_file = -1;                                       // current hcf file
293 char *HC_filenames[MAX_HCF_FILES];
294
295 char HC_fname[MAX_FILENAME_LEN+1] = "";
296 UI_INPUTBOX HC_fname_input;
297 int HC_fname_coords[GR_NUM_RESOLUTIONS][4] = {
298         { // GR_640
299                 44,     449,    218,    17
300         },
301         { // GR_1024
302                 101,    730,    319,    27
303         }
304 };
305
306 HUD_CONFIG_TYPE HUD_config;     // Player HUD configuration
307
308 // specify the max distance that the radar should detect objects
309 // See RR_ #defines in HUDconfig.h.
310 float Radar_ranges[RR_MAX_RANGES] = {
311         2000.0f,                        // short
312         10000.0f,               // med
313         10000000.0f,    // infinity
314 };
315
316 const char *Radar_range_text(int n)
317 {
318         #if RR_MAX_RANGES != 3
319         #error Number of ranges is wrong!
320         #endif
321
322         switch(n)       {
323         case 0:
324                 return XSTR( "2000 M", 246);
325         case 1:
326                 return XSTR( "10,000 M", 247);
327         case 2:
328                 return XSTR( "infinity", 248);
329         }
330         return NULL;
331 };
332
333 // default flags for observer HUD
334 int HUD_observer_default_flags = 
335 {
336         (1<<HUD_CENTER_RETICLE)                 |       
337         (1<<HUD_OFFSCREEN_INDICATOR)    |
338         (1<<HUD_MESSAGE_LINES)                  |
339         (1<<HUD_HOSTILE_TRIANGLE)               |
340         (1<<HUD_TARGET_TRIANGLE)                |
341         (1<<HUD_TARGET_MINI_ICON)               |
342         (1<<HUD_TARGET_MONITOR)                         
343 };
344
345 int HUD_observer_default_flags2 = {
346         (1<<(HUD_OFFSCREEN_RANGE - 32))
347 };
348
349 // default flags for regular HUD
350 int HUD_config_default_flags = 
351 {
352         (1<<HUD_LEAD_INDICATOR) |
353         (1<<HUD_ORIENTATION_TEE) |
354         (1<<HUD_HOSTILE_TRIANGLE) |
355         (1<<HUD_TARGET_TRIANGLE) |
356         (1<<HUD_MISSION_TIME) |
357         (1<<HUD_RETICLE_CIRCLE) |
358         (1<<HUD_THROTTLE_GAUGE) |
359         (1<<HUD_RADAR) |
360         (1<<HUD_TARGET_MONITOR) |
361         (1<<HUD_CENTER_RETICLE) |
362         (1<<HUD_TARGET_MONITOR_EXTRA_DATA) |
363         (1<<HUD_TARGET_SHIELD_ICON) |
364         (1<<HUD_PLAYER_SHIELD_ICON) |
365         (1<<HUD_ETS_GAUGE) |
366         (1<<HUD_AUTO_TARGET) |
367         (1<<HUD_AUTO_SPEED) |
368         (1<<HUD_WEAPONS_GAUGE) |
369         (1<<HUD_ESCORT_VIEW) |
370         (1<<HUD_DIRECTIVES_VIEW) |
371         (1<<HUD_THREAT_GAUGE) |
372         (1<<HUD_AFTERBURNER_ENERGY) |
373         (1<<HUD_WEAPONS_ENERGY) |
374         (1<<HUD_WEAPON_LINKING_GAUGE) |
375         (1<<HUD_TARGET_MINI_ICON) |
376         (1<<HUD_OFFSCREEN_INDICATOR) |
377         (1<<HUD_TALKING_HEAD) |
378         (1<<HUD_DAMAGE_GAUGE) |
379         (1<<HUD_MESSAGE_LINES) |
380         (1<<HUD_MISSILE_WARNING_ARROW) |
381         (1<<HUD_CMEASURE_GAUGE) |
382         (1<<HUD_OBJECTIVES_NOTIFY_GAUGE) |
383         (1<<HUD_WINGMEN_STATUS)
384 };
385
386 int HUD_config_default_flags2 = 
387 {
388         (1<<(HUD_OFFSCREEN_RANGE-32)) |
389         (1<<(HUD_KILLS_GAUGE-32)) |
390         (1<<(HUD_ATTACKING_TARGET_COUNT-32)) | 
391         (1<<(HUD_SUPPORT_GAUGE-32)) | 
392         (1<<(HUD_LAG_GAUGE-32))
393 };
394
395 // bits to tell whether a given gauge should be treated as pop-up or not
396 int HUD_default_popup_mask =
397 {
398         0       |                                                                                       // (1<<HUD_LEAD_INDICATOR) |
399         0       |                                                                                       // (1<<HUD_ORIENTATION_TEE) |
400         0       |                                                                                       //      (1<<HUD_HOSTILE_TRIANGLE) |
401         0       |                                                                                       // (1<<HUD_TARGET_TRIANGLE) |
402         0       |                                                                                       //      (1<<HUD_MISSION_TIME) |
403         0       |                                                                                       //      (1<<HUD_RETICLE_CIRCLE) |
404         0       |                                                                                       //      (1<<HUD_THROTTLE_GAUGE) |
405         0       |                                                                                       //      (1<<HUD_RADAR) |
406         0       |                                                                                       //      (1<<HUD_TARGET_MONITOR) |
407         0       |                                                                                       //      (1<<HUD_CENTER_RETICLE) |
408         0       |                                                                                       //      (1<<HUD_TARGET_MONITOR_EXTRA_DATA) |
409         0       |                                                                                       //      (1<<HUD_TARGET_SHIELD_ICON) |
410         0       |                                                                                       //      (1<<HUD_PLAYER_SHIELD_ICON) |
411         0       |                                                                                       //      (1<<HUD_ETS_GAUGE) |
412         0       |                                                                                       //      (1<<HUD_AUTO_TARGET) |
413         0       |                                                                                       //      (1<<HUD_AUTO_SPEED) |
414         0       |                                                                                       //      (1<<HUD_WEAPONS_GAUGE) |
415         0       |                                                                                       //      (1<<HUD_ESCORT_VIEW) |
416         0       |                                                                                       //      (1<<HUD_DIRECTIVES_VIEW) |
417         0       |                                                                                       //      (1<<HUD_THREAT_GAUGE) |
418         0       |                                                                                       //      (1<<HUD_AFTERBURNER_ENERGY) |
419         0       |                                                                                       //      (1<<HUD_WEAPONS_ENERGY) |
420         0       |                                                                                       //      (1<<HUD_WEAPON_LINKING_GAUGE) |
421         0       |                                                                                       //      (1<<HUD_TARGET_MINI_ICON) |
422         0       |                                                                                       //(1<<HUD_OFFSCREEN_INDICATOR)
423         0  |                                                                                    // talking head
424         0       |                                                                                       // damage gauge
425         0       |                                                                                       // message lines                                
426         0       |                                                                                       // missile warning arrow
427         0       |                                                                                       // countermeasures
428         0                                                                                               // wingman status
429 };
430
431 int HUD_default_popup_mask2 =
432 {
433         0  |                                                                                    // offscreen indicator range
434         0       |
435         0                                                                                       // kills gauge
436 };
437
438 void hud_config_color_save(const char *name);
439 void hud_config_select_all_toggle(int toggle);
440
441 int HC_select_all = 0;
442
443 //////////////////////////////////////////////////////////////////////////////
444 // Module Globals
445 //////////////////////////////////////////////////////////////////////////////
446
447 #ifndef PLAT_UNIX
448 #pragma warning(disable:4710)
449 #endif
450
451 const char *Hud_config_fname[GR_NUM_RESOLUTIONS] = {
452         "HUDConfig",
453         "2_HUDConfig"
454 };
455
456 const char *Hud_config_mask_fname[GR_NUM_RESOLUTIONS] = {
457         "HUDConfig-m",
458         "2_HUDConfig-m"
459 };
460
461 struct HC_gauge_region
462 {
463         const char              *filename;
464         int                     x,y;
465         int                     hotspot;
466         int                     use_iff;
467         int                     can_popup;
468         int                     bitmap;
469         int                     nframes;
470         int                     color;
471         UI_BUTTON       button;
472
473         HC_gauge_region(const char *name, int x1, int y1, int h, int iff, int cp, int b, int nf, int cl) : filename(name), x(x1), y(y1), hotspot(h), use_iff(iff), can_popup(cp), bitmap(b), nframes(nf), color(cl){}
474 };
475
476 // hud config gauges
477 struct HC_gauge_region  HC_gauge_regions[GR_NUM_RESOLUTIONS][NUM_HUD_GAUGES] =
478 {
479         { // GR_640
480         //XSTR:OFF
481 #ifdef MAKE_FS1
482                 HC_gauge_region("HG_07",        377,    106,    7,      1,  0,  -1, 4,  2),      // lead indicator
483                 HC_gauge_region("HG_08",        288,    153,    8,      1,  0,  -1, 4,  2),      // orientation tee
484                 HC_gauge_region("HG_09",        312,    141,    9,      1,  0,  -1, 4,  1),      // hostile triangle
485                 HC_gauge_region("HG_11",        362,    141,    11,     1,  0,  -1, 4,  2),      // target triangle
486                 HC_gauge_region("HG_41",        530,    364,    41,     0,  0,  -1, 0,  0),      // mission time
487                 HC_gauge_region("none",         -1,             -1,             0,      0,  0,  -1, 0,  0),      // reticle circle?
488                 HC_gauge_region("HG_14",        272,    218,    14,     0,  0,  -1, 0,  0),      // throttle gauge
489                 HC_gauge_region("HG_20",        301,    307,    20,     0,  0,  -1, 0,  0),      // radar
490                 HC_gauge_region("HG_04",        126,    271,    4,      0,  0,  -1, 0,  0),      // target monitor
491                 HC_gauge_region("HG_12",        335,    212,    12,     0,  0,  -1, 0,  0),      // center of reticle
492                 HC_gauge_region("HG_03",        126,    246,    3,      0,  0,  -1, 0,  0),      // extra target data
493                 HC_gauge_region("HG_19",        224,    322,    19,     0,  0,  -1, 0,  0),      // target shield icon
494                 HC_gauge_region("HG_21",        403,    322,    21,     0,  0,  -1, 0,  0),      // player shield icon
495                 HC_gauge_region("HG_24",        485,    315,    24,     0,  1,  -1, 0,  0),      // ets gauge
496                 HC_gauge_region("HG_25",        523,    315,    25,     0,  1,  -1, 0,  0),      // auto target
497                 HC_gauge_region("HG_26",        523,    332,    26,     0,  1,  -1, 0,  0),      // auto speed
498                 HC_gauge_region("HG_23",        467,    241,    23,     0,  1,  -1, 0,  0),      // weapons gauge
499                 HC_gauge_region("HG_22",        460,    196,    22,     0,  1,  -1, 0,  0),      // escort view
500                 HC_gauge_region("HG_02",        126,    175,    2,      0,  0,  -1, 0,  0),      // directives view
501                 HC_gauge_region("HG_10",        331,    149,    10,     0,  0,  -1, 0,  0),      // threat gauge
502                 HC_gauge_region("HG_13",        241,    235,    13,     0,  0,  -1, 0,  0),      // afterburner energy
503                 HC_gauge_region("HG_17",        412,    235,    17,     0,  0,  -1, 0,  0),      // weapons energy
504                 HC_gauge_region("HG_16",        396,    226,    16,     0,  0,  -1, 0,  0),      // weapon linking
505                 HC_gauge_region("HG_15",        333,    253,    15,     0,  1,  -1, 0,  0),      // target mini icon (shield)
506                 HC_gauge_region("HG_05",        405,    52,             5,      1,  0,  -1, 4,  2),      // offscreen indicator
507                 HC_gauge_region("HG_01",        126,    76,             1,      0,  0,  -1, 0,  0),      // talking head
508                 HC_gauge_region("HG_06",        292,    78,             6,      0,  1,  -1, 0,  0),      // damage gauge
509                 HC_gauge_region("HG_00",        126,    63,             0,      0,  0,  -1, 0,  0),      // message lines
510                 HC_gauge_region("HG_18",        313,    283,    18,     1,  0,  -1, 4,  3),      // locked missile direction
511                 HC_gauge_region("HG_40",        467,    291,    40,     0,  1,  -1, 0,  0),      // cmeasure gauge
512                 HC_gauge_region("none",         -1,             -1,             -1,     0,  0,  -1, 0,  0),      // objectives notify gauge
513                 HC_gauge_region("HG_39",        504,    153,    39,     0,  0,  -1, 0,  0),      // wingman status gauge
514                 HC_gauge_region("HG_38",        405,    59,             38,     1,  0,  -1, 4,  2),      // offscreen indicator range
515                 HC_gauge_region("HG_42",        467,    303,    42,     0,  1,  -1, 0,  0),      // kills gauge
516                 HC_gauge_region("HG_45",        317,    106,    45,     1,  0,  -1, 4,  1),      // attacking target count
517                 HC_gauge_region("none",         -1,             -1,             -1,     0,  0,  -1, 0,  0),      // text flash gauge
518                 HC_gauge_region("none",         -1,             -1,             -1,     0,  0,  -1, 0,  0),      // comm menu
519                 HC_gauge_region("none",         -1,             -1,             -1,     0,  0,  -1, 0,  0),      // support view gauge
520                 HC_gauge_region("none",         -1,             -1,             -1,     0,  0,  -1, 0,  0),      // netlag icon gauge
521 #else
522                 HC_gauge_region("HCB_35",       407,    69,     35,     1,      0,      -1, 0,  2),                     // lead indicator
523                 HC_gauge_region("HCB_36",       305,    119,    36,     1,      0,      -1, 0,  2),                     // orientation tee
524                 HC_gauge_region("none",         1,              1,              -1,     1,      0,      -1, 0,  0),                     // hostile triangle
525                 HC_gauge_region("HCB_37",       391,    107,    37,     1,      0,      -1, 0,  2),                     // target triangle
526                 HC_gauge_region("HCB_63",       575,    352,    63,     0,      0,      -1, 0,  0),                     // mission time
527                 HC_gauge_region("none",         1,              1,              1,              0,      0,      -1, 0,  0),                     // reticle circle?
528                 HC_gauge_region("HCB_40",       285,    146,    40,     0,      0,      -1, 0,  0),                     // throttle gauge
529                 HC_gauge_region("HCB_50",       317,    291,    50,     0,      0,      -1, 0,  0),                     // radar
530                 HC_gauge_region("HCB_31",       123,    249,    31,     0,      0,      -1, 0,  0),                     // target monitor
531                 HC_gauge_region("HCB_41",       361,    188,    41,     0,      0,      -1, 0,  0),                     // center of reticle
532                 HC_gauge_region("HCB_30",       123,    221,    30,     0,      0,      -1, 0,  0),                     // extra target data
533                 HC_gauge_region("HCB_49",       237,    303,    49,     0,      0,      -1, 0,  0),                     // target shield icon
534                 HC_gauge_region("HCB_51",       435,    304,    51,     0,      0,      -1, 0,  0),                     // player shield icon
535                 HC_gauge_region("HCB_58",       524,    299,    58,     0,      1, -1, 0,       0),                     // ets gauge
536                 HC_gauge_region("HCB_61",       566,    299,    61,     0,      1, -1, 0,       0),                     // auto target
537                 HC_gauge_region("HCB_62",       566,    317,    62,     0,      1, -1, 0,       0),                     // auto speed
538                 HC_gauge_region("HCB_55",       504,    216,    55,     0,      1, -1, 0,       0),                     // weapons gauge
539                 HC_gauge_region("HCB_54",       496,    166,    54,     0,      1, -1, 0,       0),                     // escort view
540                 HC_gauge_region("HCB_29",       123,    142,    29,     0,      0, -1, 0,       0),                     // directives view
541                 HC_gauge_region("HCB_43",       398,    147,    43,     0,      0, -1, 0,       0),                     // threat gauge
542                 HC_gauge_region("HCB_39",       250,    212,    39,     0,      0, -1, 0,       0),                     // afterburner energy
543                 HC_gauge_region("HCB_44",       449,    212,    44,     0,      0, -1, 0,       0),                     // weapons energy
544                 HC_gauge_region("none",         1,              1,              -1,     0,      0, -1, 0,       0),                     // weapon linking
545                 HC_gauge_region("HCB_42",       356,    232,    42,     0,      1, -1, 0,       0),                     // target mini icon (shield)
546                 HC_gauge_region("HCB_34",       438,    5,              34,     1,      0, -1, 0,       2),                     // offscreen indicator
547                 HC_gauge_region("HCB_28",       123,    31,     28,     0,      0, -1, 0,       0),                     // talking head
548                 HC_gauge_region("HCB_32",       309,    33,     32,     0,      1, -1, 0,       0),                     // damage gauge
549                 HC_gauge_region("HCB_27",       124,    19,     27,     0,      0, -1, 0,       0),                     // message lines
550                 HC_gauge_region("HCB_45",       307,    249,    45,     1,      0, -1, 0,       1),                     // missile warnings
551                 HC_gauge_region("HCB_56",       505,    271,    56,     0,      1,      -1, 0,  0),                     // cmeasure gauge
552                 HC_gauge_region("HCB_33",       309,    87,     33,     0,      0,      -1, 0,  0),                     // objectives notify gauge
553                 HC_gauge_region("HCB_53",       546,    117,    53,     0,      0,      -1, 0,  0),                     // wingman status gauge
554                 HC_gauge_region("none",         1,              1,              -1,     0,      0,      -1, 0,  0),                     // offscreen indicator range
555                 HC_gauge_region("HCB_57",       505,    285,    57,     0,      1,      -1, 0,  0),                     // kills gauge
556                 HC_gauge_region("none",         1,              1,              -1,     0,      0,      -1, 0,  0),                     // attacking target count
557                 HC_gauge_region("HCB_38",       342,    138,    38,     0,      0,      -1, 0,  0),                     // text flash gauge
558                 HC_gauge_region("HCB_52",       465,    8,              52,     0,      0,      -1, 0,  0),                     // comm menu
559                 HC_gauge_region("HCB_46",       324,    264,    46,     0,      0,      -1, 0,  0),                     // support view gauge
560                 HC_gauge_region("HCB_47",       418,    262,    47,     0,      0,      -1, 0,  0),                     // netlag icon gauge
561 #endif
562         //XSTR:ON
563         },
564         { // GR_1024
565         //XSTR:OFF
566                 HC_gauge_region("2_HCB_35",     652,    112,    35,     1,      0,      -1, 0,  2),                     // lead indicator
567                 HC_gauge_region("2_HCB_36",     489,    191,    36,     1,      0,      -1, 0,  2),                     // orientation tee
568                 HC_gauge_region("none",                 1,              1,              -1,     1,      0,      -1, 0,  0),                     // hostile triangle
569                 HC_gauge_region("2_HCB_37",     626,    173,    37,     1,      0,      -1, 0,  2),                     // target triangle
570                 HC_gauge_region("2_HCB_63",     920,    564,    63,     0,      0,      -1, 0,  0),                     // mission time
571                 HC_gauge_region("none",                 1,              1,              1,              0,      0,      -1, 0,  0),                     // reticle circle?
572                 HC_gauge_region("2_HCB_40",     456,    235,    40,     0,      0,      -1, 0,  0),                     // throttle gauge
573                 HC_gauge_region("2_HCB_50",     508,    466,    50,     0,      0,      -1, 0,  0),                     // radar
574                 HC_gauge_region("2_HCB_31",     198,    399,    31,     0,      0,      -1, 0,  0),                     // target monitor
575                 HC_gauge_region("2_HCB_41",     578,    302,    41,     0,      0,      -1, 0,  0),                     // center of reticle
576                 HC_gauge_region("2_HCB_30",     198,    354,    30,     0,      0,      -1, 0,  0),                     // extra target data
577                 HC_gauge_region("2_HCB_49",     380,    485,    49,     0,      0,      -1, 0,  0),                     // target shield icon
578                 HC_gauge_region("2_HCB_51",     696,    486,    51,     0,      0,      -1, 0,  0),                     // player shield icon
579                 HC_gauge_region("2_HCB_58",     839,    479,    58,     0,      1, -1, 0,       0),                     // ets gauge
580                 HC_gauge_region("2_HCB_61",     906,    479,    61,     0,      1, -1, 0,       0),                     // auto target
581                 HC_gauge_region("2_HCB_62",     906,    508,    62,     0,      1, -1, 0,       0),                     // auto speed
582                 HC_gauge_region("2_HCB_55",     807,    346,    55,     0,      1, -1, 0,       0),                     // weapons gauge
583                 HC_gauge_region("2_HCB_54",     794,    265,    54,     0,      1, -1, 0,       0),                     // escort view
584                 HC_gauge_region("2_HCB_29",     198,    228,    29,     0,      0, -1, 0,       0),                     // directives view
585                 HC_gauge_region("2_HCB_43",     637,    237,    43,     0,      0, -1, 0,       0),                     // threat gauge
586                 HC_gauge_region("2_HCB_39",     403,    339,    39,     0,      0, -1, 0,       0),                     // afterburner energy
587                 HC_gauge_region("2_HCB_44",     719,    339,    44,     0,      0, -1, 0,       0),                     // weapons energy
588                 HC_gauge_region("none",                 1,              1,              -1,     0,      0, -1, 0,       0),                     // weapon linking
589                 HC_gauge_region("2_HCB_42",     569,    371,    42,     0,      1, -1, 0,       0),                     // target mini icon (shield)
590                 HC_gauge_region("2_HCB_34",     701,    9,              34,     1,      0, -1, 0,       2),                     // offscreen indicator
591                 HC_gauge_region("2_HCB_28",     198,    50,     28,     0,      0, -1, 0,       0),                     // talking head
592                 HC_gauge_region("2_HCB_32",     495,    55,     32,     0,      1, -1, 0,       0),                     // damage gauge
593                 HC_gauge_region("2_HCB_27",     199,    30,     27,     0,      0, -1, 0,       0),                     // message lines
594                 HC_gauge_region("2_HCB_45",     491,    399,    45,     1,      0, -1, 0,       1),                     // missile warnings
595                 HC_gauge_region("2_HCB_56",     808,    433,    56,     0,      1,      -1, 0,  0),                     // cmeasure gauge
596                 HC_gauge_region("2_HCB_33",     495,    141,    33,     0,      0,      -1, 0,  0),                     // objectives notify gauge
597                 HC_gauge_region("2_HCB_53",     873,    188,    53,     0,      0,      -1, 0,  0),                     // wingman status gauge
598                 HC_gauge_region("none",                 1,              1,              -1,     0,      0,      -1, 0,  0),                     // offscreen indicator range
599                 HC_gauge_region("2_HCB_57",     808,    456,    57,     0,      1,      -1, 0,  0),                     // kills gauge
600                 HC_gauge_region("none",                 1,              1,              -1,     0,      0,      -1, 0,  0),                     // attacking target count
601                 HC_gauge_region("2_HCB_38",     548,    222,    38,     0,      0,      -1, 0,  0),                     // text flash gauge
602                 HC_gauge_region("2_HCB_52",     744,    14,     52,     0,      0,      -1, 0,  0),                     // comm menu
603                 HC_gauge_region("2_HCB_46",     520,    422,    46,     0,      0,      -1, 0,  0),                     // support view gauge
604                 HC_gauge_region("2_HCB_47",     670,    419,    47,     0,      0,      -1, 0,  0),                     // netlag icon gauge
605         //XSTR:ON
606         }
607 };
608
609 #ifndef PLAT_UNIX
610 #pragma warning(default:4710)
611 #endif
612
613 int HC_gauge_description_coords[GR_NUM_RESOLUTIONS][3] = {
614         {       // GR_640
615 #ifdef MAKE_FS1
616                 186, 410, 185
617 #else
618                 35, 397, 197
619 #endif
620         },
621         {       // GR_1024
622                 56, 632, 307
623         }
624 };
625
626 const char *HC_gauge_descriptions(int n)
627 {
628         switch(n)       {
629         case 0:
630                 return XSTR( "lead indicator", 249);
631         case 1:
632                 return XSTR( "target orientation", 250);
633         case 2:
634                 return XSTR( "closest attacking hostile", 251);
635         case 3:
636                 return XSTR( "current target direction", 252);
637         case 4:
638                 return XSTR( "mission time", 253);
639         case 5:
640                 return XSTR( "reticle", 254);
641         case 6:
642                 return XSTR( "throttle", 255);
643         case 7:
644                 return XSTR( "radar", 256);
645         case 8:
646                 return XSTR( "target monitor", 257);
647         case 9:
648                 return XSTR( "center of reticle", 258);
649         case 10:
650                 return XSTR( "extra target info", 259);
651         case 11:
652                 return XSTR( "target shield", 260);
653         case 12:
654                 return XSTR( "player shield", 261);
655         case 13:
656                 return XSTR( "power management", 262);
657         case 14:
658                 return XSTR( "auto-target icon", 263);
659         case 15:
660                 return XSTR( "auto-speed-match icon", 264);
661         case 16:
662                 return XSTR( "weapons display", 265);
663         case 17:
664                 return XSTR( "monitoring view", 266);
665         case 18:
666                 return XSTR( "directives view", 267);
667         case 19:
668                 return XSTR( "threat gauge", 268);
669         case 20:
670                 return XSTR( "afterburner energy", 269);
671         case 21:
672                 return XSTR( "weapons energy", 270);
673         case 22:
674                 return XSTR( "weapon linking", 271);
675         case 23:
676                 return XSTR( "target hull/shield icon", 272);
677         case 24:
678                 return XSTR( "offscreen indicator", 273);
679         case 25:
680                 return XSTR( "comm video", 274);
681         case 26:
682                 return XSTR( "damage display", 275);
683         case 27:
684                 return XSTR( "message output", 276);
685         case 28:
686                 return XSTR( "locked missile direction", 277);
687         case 29:
688                 return XSTR( "countermeasures", 278);
689         case 30:
690                 return XSTR( "objective notify", 279);
691         case 31:
692                 return XSTR( "wingmen status", 280);
693         case 32:
694                 return XSTR( "offscreen range", 281);
695         case 33:
696                 return XSTR( "kills gauge", 282);
697         case 34:
698                 return XSTR( "attacking target count", 283);
699         case 35: 
700                 return XSTR("warning flash", 1459);
701         case 36:
702                 return XSTR("comm menu", 1460);
703         case 37: 
704                 return XSTR("support gauge", 1461);
705         case 38:
706                 return XSTR("lag gauge", 1462);
707         }
708         return NULL;
709 }
710
711 #ifdef MAKE_FS1
712         #define NUM_HUD_BUTTONS                 8
713 #else
714         #define NUM_HUD_BUTTONS                 20
715 #endif
716
717 #ifndef MAKE_FS1
718 #define HCB_RED_UP                              0
719 #define HCB_GREEN_UP                            1
720 #define HCB_BLUE_UP                             2
721 #define HCB_I_UP                                        3
722 #define HCB_RED_DOWN                            4
723 #define HCB_GREEN_DOWN                  5
724 #define HCB_BLUE_DOWN                   6
725 #define HCB_I_DOWN                              7
726 #define HCB_ON                                          8
727 #define HCB_OFF                                 9
728 #define HCB_POPUP                                       10
729 #define HCB_SAVE_HCF                            11
730 #define HCB_PREV_HCF                            12
731 #define HCB_NEXT_HCF                            13
732 #define HCB_AMBER                                       14
733 #define HCB_BLUE                                        15
734 #define HCB_GREEN                                       16
735 #define HCB_SELECT_ALL                  17
736 #define HCB_RESET                                       18
737 #define HCB_ACCEPT                              19
738 #else
739 #define HCB_AMBER                               0
740 #define HCB_BLUE                                1
741 #define HCB_GREEN                               2
742 #define HCB_ON                                  3
743 #define HCB_OFF                                 4
744 #define HCB_POPUP                               5
745 #define HCB_RESET                               6
746 #define HCB_ACCEPT                              7
747 #endif
748
749 #ifndef PLAT_UNIX
750 #pragma warning(disable : 4710)
751 #endif
752
753 ui_button_info HC_buttons[GR_NUM_RESOLUTIONS][NUM_HUD_BUTTONS] = {
754         { // GR_640
755 #ifdef MAKE_FS1
756                 ui_button_info("HG_27",                 31,             92,             -1,     -1,     27),    // amber
757                 ui_button_info("HG_28",                 31,             113,    -1,     -1,     28),    // blue
758                 ui_button_info("HG_29",                 31,             133,    -1,     -1,     29),    // green
759                 ui_button_info("HG_30",                 31,             385,    -1,     -1,     30),    // on
760                 ui_button_info("HG_31",                 31,             405,    -1,     -1,     31),    // off
761                 ui_button_info("HG_32",                 31,             424,    -1,     -1,     32),    // popup
762                 ui_button_info("HG_36",                 504,    411,    -1,     -1,     36),    // reset
763                 ui_button_info("HG_37",                 561,    411,    -1,     -1,     37),    // accept
764 #else
765                 ui_button_info("HCB_00",                6,              27,     -1,     -1,     0),
766                 ui_button_info("HCB_01",                30,     27,     -1,     -1,     1),
767                 ui_button_info("HCB_02",                55,     27,     -1,     -1,     2),
768                 ui_button_info("HCB_03",                80,     27,     -1,     -1,     3),
769                 ui_button_info("HCB_08",                6,              291,    -1,     -1,     8),
770                 ui_button_info("HCB_09",                30,     291,    -1,     -1,     9),
771                 ui_button_info("HCB_10",                55,     291,    -1,     -1,     10),
772                 ui_button_info("HCB_11",                80,     291,    -1,     -1,     11),
773                 ui_button_info("HCB_12",                4,              329,    -1,     -1,     12),
774                 ui_button_info("HCB_13",                4,              348,    -1,     -1,     13),
775                 ui_button_info("HCB_14",                4,              367,    -1,     -1,     14),
776                 ui_button_info("HCB_15",                2,              439,    -1,     -1,     15),
777                 ui_button_info("HCB_16",                266,    456,    -1,     -1,     16),
778                 ui_button_info("HCB_17",                292,    456,    -1,     -1,     17),
779                 ui_button_info("HCB_18",                327,    421,    -1,     -1,     18),
780                 ui_button_info("HCB_19",                327,    440,    -1,     -1,     19),
781                 ui_button_info("HCB_20",                327,    459,    -1,     -1,     20),
782                 ui_button_info("HCB_24",                472,    436,    -1,     -1,     24),
783                 ui_button_info("HCB_25",                523,    433,    -1,     -1,     25),
784                 ui_button_info("HCB_26",                576,    434,    -1,     -1,     26),
785 #endif
786         },
787         { // GR_1024
788                 ui_button_info("2_HCB_00",              9,              44,     -1,     -1,     0),
789                 ui_button_info("2_HCB_01",              48,     44,     -1,     -1,     1),
790                 ui_button_info("2_HCB_02",              88,     44,     -1,     -1,     2),
791                 ui_button_info("2_HCB_03",              127,    44,     -1,     -1,     3),
792                 ui_button_info("2_HCB_08",              9,              466,    -1,     -1,     8),
793                 ui_button_info("2_HCB_09",              48,     466,    -1,     -1,     9),
794                 ui_button_info("2_HCB_10",              88,     466,    -1,     -1,     10),
795                 ui_button_info("2_HCB_11",              127,    466,    -1,     -1,     11),
796 #ifndef MAKE_FS1
797                 ui_button_info("2_HCB_12",              6,              526,    -1,     -1,     12),
798                 ui_button_info("2_HCB_13",              6,              556,    -1,     -1,     13),
799                 ui_button_info("2_HCB_14",              6,              586,    -1,     -1,     14),
800                 ui_button_info("2_HCB_15",              3,              703,    -1,     -1,     15),
801                 ui_button_info("2_HCB_16",              426,    730,    -1,     -1,     16),
802                 ui_button_info("2_HCB_17",              467,    730,    -1,     -1,     17),
803                 ui_button_info("2_HCB_18",              524,    674,    -1,     -1,     18),
804                 ui_button_info("2_HCB_19",              524,    704,    -1,     -1,     19),
805                 ui_button_info("2_HCB_20",              524,    734,    -1,     -1,     20),
806                 ui_button_info("2_HCB_24",              755,    698,    -1,     -1,     24),
807                 ui_button_info("2_HCB_25",              837,    693,    -1,     -1,     25),
808                 ui_button_info("2_HCB_26",              922,    695,    -1,     -1,     26),
809 #endif
810         },
811 };
812
813 // text
814 #ifndef MAKE_FS1
815 #define NUM_HUD_TEXT                                    15
816
817 UI_XSTR HC_text[GR_NUM_RESOLUTIONS][NUM_HUD_TEXT] = {
818         { // GR_640
819                 { "R",                          1512,   14,     8,              UI_XSTR_COLOR_GREEN,    -1, NULL },
820                 { "G",                          1513,   37,     8,              UI_XSTR_COLOR_GREEN,    -1, NULL },
821                 { "B",                          1514,   62,     8,              UI_XSTR_COLOR_GREEN,    -1, NULL },
822                 { "I",                          1515,   90,     8,              UI_XSTR_COLOR_GREEN,    -1, NULL },
823                 { "On",                         1285,   36,     334,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_ON].button },
824                 { "Off",                                1286,   36,     353,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_OFF].button },
825                 { "Popup",                      1453,   36,     372,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_POPUP].button },
826                 { "Save",                       1454,   51,     428,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_SAVE_HCF].button },
827                 { "Amber",                      1455,   364,    426,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_AMBER].button },
828                 { "Blue",                       1456,   364,    445,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_BLUE].button },
829                 { "Green",                      1457,   364,    464,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_GREEN].button },         
830                 { "Select",                     1550,   442,    413,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_SELECT_ALL].button },
831                 { "All",                                1551,   442,    424,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_SELECT_ALL].button },
832                 { "Reset",                      1337,   515,    413,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[0][HCB_RESET].button },
833                 { "Accept",                     1035,   573,    413,    UI_XSTR_COLOR_PINK,     -1, &HC_buttons[0][HCB_ACCEPT].button },
834         },
835         { // GR_1024
836                 { "R",                          1512,   23,     14,     UI_XSTR_COLOR_GREEN,    -1, NULL },
837                 { "G",                          1513,   60,     14,     UI_XSTR_COLOR_GREEN,    -1, NULL },
838                 { "B",                          1514,   100,    14,     UI_XSTR_COLOR_GREEN,    -1, NULL },
839                 { "I",                          1515,   144,    14,     UI_XSTR_COLOR_GREEN,    -1, NULL },
840                 { "On",                         1285,   58,     536,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_ON].button },
841                 { "Off",                                1286,   58,     566,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_OFF].button },
842                 { "Popup",                      1453,   58,     596,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_POPUP].button },
843                 { "Save",                       1454,   82,     688,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_SAVE_HCF].button },
844                 { "Amber",                      1455,   582,    685,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_AMBER].button },
845                 { "Blue",                       1456,   582,    715,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_BLUE].button },
846                 { "Green",                      1457,   582,    745,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_GREEN].button },         
847                 { "Select",                     1550,   760,    671,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_SELECT_ALL].button },
848                 { "All",                                1551,   760,    682,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_SELECT_ALL].button },
849                 { "Reset",                      1337,   850,    669,    UI_XSTR_COLOR_GREEN,    -1, &HC_buttons[1][HCB_RESET].button },
850                 { "Accept",                     1035,   930,    670,    UI_XSTR_COLOR_PINK,     -1, &HC_buttons[1][HCB_ACCEPT].button },
851         }
852 };
853 #endif
854
855 void hud_config_set_rgb(int gauge, int r, int g, int b);
856 void hud_config_set_alpha(int gauge, int a);
857
858 #ifdef MAKE_FS1
859 #define NUM_HC_SPECIAL_BITMAPS  2
860 #define HC_SPECIAL_RETICLE                      0
861 #define HC_SPECIAL_TEXT                         1
862 typedef struct HC_special_bitmap
863 {
864         const char *filename;
865         int x,y;
866         int bitmap;
867 } HC_special_bitmap;
868
869 HC_special_bitmap HC_special_bitmaps[NUM_HC_SPECIAL_BITMAPS] =
870 {
871 //XSTR:OFF
872         {"HG_00a", 272, 146, -1},
873         {"HG_04a", 132, 271, -1},
874 //XSTR:ON
875 };
876 #endif // MAKE_FS1
877
878 static int                                                      HC_background_bitmap;
879 static UI_WINDOW                                        HC_ui_window;
880
881 static int                                                      HC_gauge_hot;                   // mouse is over this gauge
882 static int                                                      HC_gauge_selected;      // gauge is selected
883
884 // slider controls
885 #ifdef MAKE_FS1
886 #define HC_NUM_SLIDERS                                                  1
887 #define HC_BRIGHTNESS_SLIDER                                    0
888 struct hc_sliders {
889         // base slider
890         const char *filename;
891         int x, y, xt, yt;
892         int hotspot;
893         int dot_w;
894         int dots;
895
896         // left and right buttons
897         const char *left_filename;
898         int left_mask, left_x, left_y;
899         const char *right_filename;
900         int right_mask, right_x, right_y;
901
902         // slider control
903         UI_DOT_SLIDER_NEW slider;  // because we have a class inside this struct, we need the constructor below..
904
905         hc_sliders(const char *name, int x1, int y1, int xt1, int yt1, int h, int _dot_w, int _dots, const char *_left_filename, int _left_mask, int _left_x, int _left_y, const char *_right_filename, int _right_mask, int _right_x, int _right_y) : 
906                                  filename(name), x(x1), y(y1), xt(xt1), yt(yt1), hotspot(h), dot_w(_dot_w), dots(_dots), left_filename(_left_filename), left_mask(_left_mask), left_x(_left_x), left_y(_left_y), right_filename(_right_filename), right_mask(_right_mask), right_x(_right_x), right_y(_right_y) {}
907 };
908
909 hc_sliders HC_sliders[GR_NUM_RESOLUTIONS][HC_NUM_SLIDERS] = {
910         { // GR_640
911                 /*
912                 hc_sliders( "HCB_22",   419,    379,    -1,     -1,     22,     20,     10,
913                                                 "HCB_23",       23,     611,    379,
914                                                 "HCB_21",       21,     391,    379)
915                 */
916                 // ten dots but 11 frames, use frame count
917                 hc_sliders(     "HG_34",        373,    21,             -1,     -1,     34,     20,     11,                                                     
918                                                 "HG_35",        35,     565,    20,
919                                                 "HG_33",        33,     349,    20)
920         },
921         { // GR_1024
922                 hc_sliders(     "2_HCB_22",     670,    606,    -1,     -1,     22,     32,     10,                                                     
923                                                 "2_HCB_23",     23,     698,    606,
924                                                 "2_HCB_21",     21,     625,    606),
925         }       
926 };
927 #endif  // MAKE_FS1
928
929
930 // HUD colors
931 typedef struct hc_col {
932         ubyte   r, g, b;
933 } hc_col;
934
935 hc_col HC_colors[3] =
936 {
937         {0, 255, 0},            // Green - get RGB from Adam so it matches palette?-??.pcx
938         {67, 123, 203}, // Blue - get RGB from Adam so it matches palette?-??.pcx
939         {255, 197, 0},          // Amber - get RGB from Adam so it matches palette?-??.pcx
940 };
941
942 static HUD_CONFIG_TYPE  HUD_config_backup;              // backup HUD config, used to restore old config if changes not applied
943 static int                                      HUD_config_inited = 0;
944
945 // rgba slider stuff
946 void hud_config_red_slider();
947 void hud_config_green_slider();
948 void hud_config_blue_slider();
949 void hud_config_alpha_slider_up();
950 void hud_config_alpha_slider_down();
951 void hud_config_recalc_alpha_slider();
952 void hud_config_process_colors();
953 void hud_config_color_init();
954 void hud_config_color_close();
955 #define NUM_HC_SLIDERS                  4
956 #define HCS_RED                                 0
957 #define HCS_GREEN                                       1
958 #define HCS_BLUE                                        2
959 #define HCS_ALPHA                                       3
960 UI_SLIDER2 HC_color_sliders[NUM_HC_SLIDERS];
961 int HC_slider_coords[GR_NUM_RESOLUTIONS][NUM_HC_SLIDERS][4] = {
962         { // GR_640
963                 { 8,    53,     15, 225 },
964                 { 33, 53,       15, 225 },
965                 { 58, 53,       15, 225 },
966                 { 83, 53,       15, 225 },
967         },
968         { // GR_1024
969                 { 13,   85, 32, 350 },
970                 { 53, 85, 32, 350 },
971                 { 93, 85, 32, 350 },
972                 { 133, 85, 32, 350 },
973         },      
974 };
975 #define HCS_CONV(__v)                   ( 255 - (__v) )
976
977 const char *HC_slider_fname[GR_NUM_RESOLUTIONS] = {
978         "slider",
979         "2_slider"
980 };
981
982 // sync sliders
983 void hud_config_synch_sliders(int i)
984 {
985 #ifndef MAKE_FS1
986         if(i >= 0){
987                 HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HUD_config.clr[i].red) );
988                 HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HUD_config.clr[i].green) );
989                 HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HUD_config.clr[i].blue) );
990                 HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(HUD_config.clr[i].alpha) );
991         }
992 #endif
993 }
994
995 // reset some ui components based on HUD config data
996 void hud_config_synch_ui()
997 {
998 #ifdef MAKE_FS1
999         game_load_palette();
1000 #endif
1001         HUD_init_hud_color_array();
1002 #ifdef MAKE_FS1
1003         HC_sliders[gr_screen.res][HC_BRIGHTNESS_SLIDER].slider.pos = HUD_color_alpha -3;                // convert to value from 0-10   
1004 #else
1005
1006         // sync sliders to currently selected gauge
1007         hud_config_synch_sliders(HC_gauge_selected);
1008 #endif
1009 }
1010
1011 // Init the UI components
1012 void hud_config_init_ui()
1013 {
1014         int i;
1015         struct HC_gauge_region  *hg;
1016         struct ui_button_info                   *hb;
1017
1018 #ifdef MAKE_FS1
1019         common_set_interface_palette("HUDConfigPalette");  // set the interface palette
1020 #endif
1021         hud_config_synch_ui();
1022         HC_background_bitmap = bm_load(Hud_config_fname[gr_screen.res]);
1023
1024         HC_ui_window.create( 0, 0, gr_screen.max_w, gr_screen.max_h, 0 );
1025         HC_ui_window.set_mask_bmap(Hud_config_mask_fname[gr_screen.res]);
1026
1027         for (i=0; i<NUM_HUD_GAUGES; i++) {
1028                 hg = &HC_gauge_regions[gr_screen.res][i];
1029                 if ( !stricmp(hg->filename, NOX("none")) ) {
1030                         continue;
1031                 }
1032                 hg->button.create(&HC_ui_window, "", hg->x, hg->y, 60, 30, 0, 1);
1033                 // set up callback for when a mouse first goes over a button
1034 //              hg->button.set_highlight_action(common_play_highlight_sound);
1035                 hg->button.hide();
1036                 hg->button.link_hotspot(hg->hotspot);
1037
1038 #ifdef MAKE_FS1
1039                 if ( hg->use_iff ) {
1040                         hg->bitmap = bm_load_animation(hg->filename, &hg->nframes);
1041                 } else {
1042                         hg->bitmap = bm_load(hg->filename);
1043                         hg->nframes = 1;
1044                 }
1045 #else
1046                         hg->bitmap = bm_load(hg->filename);
1047                         hg->nframes = 1;
1048 #endif
1049         }
1050
1051 #ifndef MAKE_FS1
1052         // add text
1053         for(i=0; i<NUM_HUD_TEXT; i++){
1054                 HC_ui_window.add_XSTR(&HC_text[gr_screen.res][i]);
1055         }
1056
1057         // initialize sliders
1058         HC_color_sliders[HCS_RED].create(&HC_ui_window, HC_slider_coords[gr_screen.res][HCS_RED][0], HC_slider_coords[gr_screen.res][HCS_RED][1], HC_slider_coords[gr_screen.res][HCS_RED][2], HC_slider_coords[gr_screen.res][HCS_RED][3],
1059                                                                                 255, HC_slider_fname[gr_screen.res], hud_config_red_slider, hud_config_red_slider, hud_config_red_slider);
1060
1061         HC_color_sliders[HCS_GREEN].create(&HC_ui_window, HC_slider_coords[gr_screen.res][HCS_GREEN][0], HC_slider_coords[gr_screen.res][HCS_GREEN][1], HC_slider_coords[gr_screen.res][HCS_GREEN][2], HC_slider_coords[gr_screen.res][HCS_GREEN][3],
1062                                                                                 255, HC_slider_fname[gr_screen.res], hud_config_green_slider, hud_config_green_slider, hud_config_green_slider);
1063
1064         HC_color_sliders[HCS_BLUE].create(&HC_ui_window, HC_slider_coords[gr_screen.res][HCS_BLUE][0], HC_slider_coords[gr_screen.res][HCS_BLUE][1], HC_slider_coords[gr_screen.res][HCS_BLUE][2], HC_slider_coords[gr_screen.res][HCS_BLUE][3],
1065                                                                                 255, HC_slider_fname[gr_screen.res], hud_config_blue_slider, hud_config_blue_slider, hud_config_blue_slider);
1066
1067         HC_color_sliders[HCS_ALPHA].create(&HC_ui_window, HC_slider_coords[gr_screen.res][HCS_ALPHA][0], HC_slider_coords[gr_screen.res][HCS_ALPHA][1], HC_slider_coords[gr_screen.res][HCS_ALPHA][2], HC_slider_coords[gr_screen.res][HCS_ALPHA][3],
1068                                                                                 255, HC_slider_fname[gr_screen.res], hud_config_alpha_slider_up, hud_config_alpha_slider_down, NULL);
1069 #endif
1070         
1071         hud_config_color_init();
1072
1073         for (i=0; i<NUM_HUD_BUTTONS; i++) {
1074                 hb = &HC_buttons[gr_screen.res][i];
1075                 hb->button.create(&HC_ui_window, "", hb->x, hb->y, 60, 30, 0, 1);
1076                 // set up callback for when a mouse first goes over a button
1077                 hb->button.set_bmaps(hb->filename);
1078                 hb->button.set_highlight_action(common_play_highlight_sound);
1079                 hb->button.link_hotspot(hb->hotspot);
1080         }
1081
1082         // config file input name       
1083         HC_fname_input.create(&HC_ui_window, HC_fname_coords[gr_screen.res][0], HC_fname_coords[gr_screen.res][1], HC_fname_coords[gr_screen.res][2], MAX_FILENAME_LEN, "", UI_INPUTBOX_FLAG_INVIS | UI_INPUTBOX_FLAG_ESC_FOC); 
1084         HC_fname_input.set_text("");
1085
1086 #ifdef MAKE_FS1
1087         for (i=0; i<NUM_HC_SPECIAL_BITMAPS; i++) {
1088                 HC_special_bitmaps[i].bitmap = bm_load(HC_special_bitmaps[i].filename);
1089         }
1090
1091         // create sliders
1092         for(i=0; i<HC_NUM_SLIDERS; i++){
1093                 HC_sliders[gr_screen.res][i].slider.create(&HC_ui_window, HC_sliders[gr_screen.res][i].x, HC_sliders[gr_screen.res][i].y,
1094                                                                                                                                                 HC_sliders[gr_screen.res][i].dots, HC_sliders[gr_screen.res][i].filename,
1095                                                                                                                                                 HC_sliders[gr_screen.res][i].hotspot, HC_sliders[gr_screen.res][i].right_filename, HC_sliders[gr_screen.res][i].right_mask, HC_sliders[gr_screen.res][i].right_x, HC_sliders[gr_screen.res][i].right_y,
1096                                                                                                                                                 HC_sliders[gr_screen.res][i].left_filename, HC_sliders[gr_screen.res][i].left_mask, HC_sliders[gr_screen.res][i].left_x, HC_sliders[gr_screen.res][i].left_y,
1097                                                                                                                                                 HC_sliders[gr_screen.res][i].dot_w);
1098         }
1099         HC_sliders[gr_screen.res][HC_BRIGHTNESS_SLIDER].slider.pos = HUD_color_alpha - 3;
1100 #endif
1101         
1102         
1103         HC_gauge_hot = -1;
1104         HC_gauge_selected = -1;
1105
1106         HC_select_all = 0;
1107
1108         strcpy(HC_fname, "");
1109 }
1110
1111 int hud_config_show_flag_is_set(int i)
1112 {
1113         int show_flag_set;
1114
1115         if ( i < 32 ) {
1116                 show_flag_set = HUD_config.show_flags & (1<<i);
1117         } else {
1118                 show_flag_set = HUD_config.show_flags2 & (1<<(i-32));
1119         }
1120
1121         return show_flag_set;
1122 }
1123
1124 void hud_config_show_flag_set(int i)
1125 {
1126         if ( i < 32 ) {
1127                 HUD_config.show_flags |= (1<<i);
1128         } else {
1129                 HUD_config.show_flags2 |= (1<<(i-32));
1130         }
1131 }
1132
1133 void hud_config_show_flag_clear(int i)
1134 {
1135         if ( i < 32 ) {
1136                 HUD_config.show_flags &= ~(1<<i);
1137         } else {
1138                 HUD_config.show_flags2 &= ~(1<<(i-32));
1139         }
1140 }
1141
1142 int hud_config_popup_flag_is_set(int i)
1143 {
1144         int popup_flag_set;
1145
1146         if ( i < 32 ) {
1147                 popup_flag_set = HUD_config.popup_flags & (1<<i);
1148         } else {
1149                 popup_flag_set = HUD_config.popup_flags2 & (1<<(i-32));
1150         }
1151
1152         return popup_flag_set;
1153 }
1154
1155 void hud_config_popup_flag_set(int i)
1156 {
1157         if ( i < 32 ) {
1158                 HUD_config.popup_flags |= (1<<i);
1159         } else {
1160                 HUD_config.popup_flags2 |= (1<<(i-32));
1161         }
1162 }
1163
1164 void hud_config_popup_flag_clear(int i)
1165 {
1166         if ( i < 32 ) {
1167                 HUD_config.popup_flags &= ~(1<<i);
1168         } else {
1169                 HUD_config.popup_flags2 &= ~(1<<(i-32));
1170         }
1171 }
1172
1173 // render all the hud config gauges
1174 void hud_config_render_gauges()
1175 {
1176         int i;
1177         color use_color;
1178 #ifndef MAKE_FS1
1179         int alpha;
1180 #endif
1181
1182         for ( i=0; i<NUM_HUD_GAUGES; i++ ) {
1183                 if ( (hud_config_show_flag_is_set(i)) ) {
1184                         // set the correct color
1185                         if(!HC_gauge_regions[gr_screen.res][i].use_iff){
1186                                 use_color = HUD_config.clr[i];                  
1187                         } else {
1188 #ifndef MAKE_FS1
1189                                 if(HC_gauge_regions[gr_screen.res][i].color == 1){
1190                                         use_color = IFF_colors[IFF_COLOR_TAGGED][0];
1191                                 } else {
1192                                         use_color = IFF_colors[IFF_COLOR_HOSTILE][0];
1193                                 }
1194                         }
1195
1196                         if ( (HC_gauge_selected == i) || HC_select_all ) {
1197                                 alpha = 255;                            
1198                         } else if ( HC_gauge_hot == i ) {
1199                                 alpha = 200;                            
1200                         } else {                        
1201                                 alpha = 150;                            
1202                         }
1203                         gr_init_alphacolor(&use_color, use_color.red, use_color.green, use_color.blue, alpha, AC_TYPE_HUD);
1204                         gr_set_color_fast(&use_color);                  
1205 #else
1206                                 // set correct frame if using iff
1207                                 if ( HC_gauge_regions[gr_screen.res][i].use_iff ) {
1208                                         int offset=0;
1209                                         
1210                                         if ( HC_gauge_selected == i ) {
1211                                                 offset=2;
1212                                         } else if ( HC_gauge_hot == i ) {
1213                                                 offset=1;
1214                                         }       
1215         
1216                                         // If gauge is disabled, then draw disabled frame
1217                                         if ( !(hud_config_show_flag_is_set(i)) ) {
1218                                                 offset=3;
1219                                         }
1220
1221                                         if ( HC_gauge_regions[gr_screen.res][i].bitmap >= 0 ) {
1222                                                 Assert(offset < HC_gauge_regions[gr_screen.res][i].nframes);
1223                                                 gr_set_bitmap(HC_gauge_regions[gr_screen.res][i].bitmap+offset, GR_ALPHABLEND_NONE, GR_BITBLT_MODE_NORMAL, 1.0f, -1, -1);
1224                                                 gr_bitmap(HC_gauge_regions[gr_screen.res][i].x, HC_gauge_regions[gr_screen.res][i].y);
1225                                         }
1226                                 }
1227                         }
1228 #endif
1229                 } else {
1230                         // if its off, make it dark gray
1231                         gr_init_alphacolor(&use_color, 127, 127, 127, 64, AC_TYPE_HUD);
1232                         gr_set_color_fast(&use_color);                  
1233                 }
1234
1235                 // draw
1236                 if ( HC_gauge_regions[gr_screen.res][i].bitmap >= 0 ) {
1237                         gr_set_bitmap(HC_gauge_regions[gr_screen.res][i].bitmap, GR_ALPHABLEND_NONE, GR_BITBLT_MODE_NORMAL, 1.0f, -1, -1);
1238                         gr_aabitmap(HC_gauge_regions[gr_screen.res][i].x, HC_gauge_regions[gr_screen.res][i].y);
1239                 }
1240                 
1241                 /*
1242                 else {
1243
1244                         int offset=0;
1245                                 // set correct frame if using iff
1246                         if ( HC_gauge_regions[i].use_iff ) {
1247                                 if ( HC_gauge_selected == i ) {
1248                                         offset=2;
1249                                 } else if ( HC_gauge_hot == i ) {
1250                                         offset=1;
1251                                 }
1252
1253                                 // If gauge is disabled, then draw disabled frame
1254                                 if ( !(hud_config_show_flag_is_set(i)) ) {
1255                                         offset=3;
1256                                 }
1257                         }
1258
1259                         if ( HC_gauge_regions[i].bitmap >= 0 ) {
1260                                 Assert(offset < HC_gauge_regions[i].nframes);
1261                                 gr_set_bitmap(HC_gauge_regions[i].bitmap+offset);
1262                                 gr_bitmap(HC_gauge_regions[i].x, HC_gauge_regions[i].y);
1263                         }
1264                 }
1265                 */
1266         }
1267 }
1268
1269 // hud_config_init() is called when the game enters the state GS_STATE_HUD_CONFIG
1270 void hud_config_init()
1271 {
1272         hud_config_init_ui();
1273         hud_config_backup(); // save the HUD configuration in case the player decides to cancel changes
1274         HUD_config_inited = 1;
1275 }
1276
1277 // check for the mouse over gauge regions
1278 void hud_config_check_regions()
1279 {
1280         int                     i;
1281         UI_BUTTON       *b;
1282
1283         for ( i=0; i<NUM_HUD_GAUGES; i++ ) {
1284                 b = &HC_gauge_regions[gr_screen.res][i].button;
1285
1286                 // check for mouse over gauges
1287                 if ( b->button_hilighted() ) {
1288                         HC_gauge_hot = i;
1289                 }
1290
1291                 if ( b->pressed() ) {
1292                         gamesnd_play_iface(SND_USER_SELECT);
1293                         HC_gauge_selected = i;
1294
1295                         // turn off select all
1296                         hud_config_select_all_toggle(0);                        
1297                         
1298                         // maybe setup rgb sliders
1299 #ifndef MAKE_FS1
1300                         if(HC_gauge_regions[gr_screen.res][i].use_iff){
1301                                 HC_color_sliders[HCS_RED].hide();
1302                                 HC_color_sliders[HCS_GREEN].hide();
1303                                 HC_color_sliders[HCS_BLUE].hide();
1304                                 HC_color_sliders[HCS_ALPHA].hide();
1305
1306                                 HC_color_sliders[HCS_RED].disable();
1307                                 HC_color_sliders[HCS_GREEN].disable();
1308                                 HC_color_sliders[HCS_BLUE].disable();
1309                                 HC_color_sliders[HCS_ALPHA].disable();
1310                         } else {
1311                                 HC_color_sliders[HCS_RED].enable();
1312                                 HC_color_sliders[HCS_GREEN].enable();
1313                                 HC_color_sliders[HCS_BLUE].enable();
1314                                 HC_color_sliders[HCS_ALPHA].enable();                   
1315
1316                                 HC_color_sliders[HCS_RED].unhide();
1317                                 HC_color_sliders[HCS_GREEN].unhide();
1318                                 HC_color_sliders[HCS_BLUE].unhide();
1319                                 HC_color_sliders[HCS_ALPHA].unhide();                           
1320
1321                                 HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HUD_config.clr[i].red) );
1322                                 HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HUD_config.clr[i].green) );
1323                                 HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HUD_config.clr[i].blue) );
1324                                 HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(HUD_config.clr[i].alpha) );
1325                         }
1326 #endif
1327
1328                         // recalc alpha slider
1329                         hud_config_recalc_alpha_slider();
1330                 }
1331         }
1332 }
1333
1334 // set the display flags for a HUD gauge
1335 void hud_config_set_gauge_flags(int gauge_index, int on_flag, int popup_flag)
1336 {
1337         if ( on_flag ) {
1338                 hud_config_show_flag_set(gauge_index);
1339         } else {
1340                 hud_config_show_flag_clear(gauge_index);
1341         }
1342
1343         if ( popup_flag ) {
1344                 hud_config_popup_flag_set(gauge_index);
1345         } else {
1346                 hud_config_popup_flag_clear(gauge_index);
1347         }
1348 }
1349
1350 void hud_config_record_color(int color)
1351 {
1352         HUD_config.main_color = color;
1353         HUD_color_red = HC_colors[color].r;
1354         HUD_color_green = HC_colors[color].g;
1355         HUD_color_blue = HC_colors[color].b;
1356 }
1357
1358 // Set the HUD color
1359 void hud_config_set_color(int color)
1360 {
1361         int idx;        
1362
1363         hud_config_record_color(color);
1364
1365 #ifdef MAKE_FS1
1366         game_load_palette();
1367 #endif
1368
1369         HUD_init_hud_color_array();
1370
1371         // apply the color to all gauges
1372         for(idx=0; idx<NUM_HUD_GAUGES; idx++){
1373                 gr_init_alphacolor(&HUD_config.clr[idx], HC_colors[color].r, HC_colors[color].g, HC_colors[color].b, (HUD_color_alpha+1)*16, AC_TYPE_HUD);
1374         }
1375 }
1376
1377 void hud_config_stuff_colors(int r, int g, int b)
1378 {
1379         int idx;
1380
1381         // apply the color to all gauges
1382         for(idx=0; idx<NUM_HUD_GAUGES; idx++){
1383                 gr_init_alphacolor(&HUD_config.clr[idx], r, g, b, 255, AC_TYPE_HUD);
1384         }
1385 }
1386
1387 // leave hud config without accepting changes
1388 void hud_config_cancel()
1389 {
1390         hud_config_restore();
1391         gameseq_post_event(GS_EVENT_PREVIOUS_STATE);
1392 }
1393
1394 // leave hud config with accepting changes
1395 void hud_config_commit()
1396 {
1397         gamesnd_play_iface(SND_COMMIT_PRESSED);
1398         gameseq_post_event(GS_EVENT_PREVIOUS_STATE);
1399 }
1400
1401 // move gauge state from on->off->popup
1402 void hud_cycle_gauge_status()
1403 {
1404         if ( HC_gauge_selected < 0 ) {
1405                 return;
1406         }
1407
1408         // gauge is off, move to popup
1409         if ( !(hud_config_show_flag_is_set(HC_gauge_selected)) ) {
1410                 if ( HC_gauge_regions[gr_screen.res][HC_gauge_selected].can_popup ) {
1411                         hud_config_set_gauge_flags(HC_gauge_selected, 1, 1);    
1412                 } else {
1413                         hud_config_set_gauge_flags(HC_gauge_selected, 1, 0);    
1414                 }
1415                 return;
1416         }
1417
1418         // if gauge is popup, move to on
1419         if ( hud_config_popup_flag_is_set(HC_gauge_selected) ) {
1420                 hud_config_set_gauge_flags(HC_gauge_selected, 1, 0);
1421                 return;
1422         }
1423         
1424         // gauge must be on, move to off
1425         hud_config_set_gauge_flags(HC_gauge_selected, 0, 0);
1426 }
1427
1428 // handle keyboard input while in hud config
1429 void hud_config_handle_keypresses(int k)
1430 {
1431         switch(k) {
1432         case KEY_ESC:
1433                 hud_config_cancel();
1434                 break;
1435         case KEY_CTRLED+KEY_ENTER:
1436                 hud_config_commit();
1437                 break;
1438         case KEY_TAB:
1439                 gamesnd_play_iface(SND_USER_SELECT);
1440                 hud_cycle_gauge_status();
1441                 break;
1442         }
1443 }
1444
1445 // Handlers for when buttons get pressed
1446 void hud_config_button_do(int n)
1447 {
1448 #ifndef MAKE_FS1
1449         int idx;
1450         char name[256] = "";
1451 #endif
1452
1453         switch (n) {
1454         case HCB_AMBER:
1455                 hud_config_set_color(HUD_COLOR_AMBER);
1456                 gamesnd_play_iface(SND_USER_SELECT);
1457                 break;
1458         case HCB_BLUE:
1459                 hud_config_set_color(HUD_COLOR_BLUE);
1460                 gamesnd_play_iface(SND_USER_SELECT);
1461                 break;
1462         case HCB_GREEN:
1463                 hud_config_set_color(HUD_COLOR_GREEN);
1464                 gamesnd_play_iface(SND_USER_SELECT);
1465                 break;
1466         case HCB_ON:
1467                 if ( HC_gauge_selected < 0 ) {
1468                         break;
1469                 }
1470                 gamesnd_play_iface(SND_USER_SELECT);
1471                 hud_config_set_gauge_flags(HC_gauge_selected,1,0);
1472                 break;
1473         case HCB_OFF:
1474                 if ( HC_gauge_selected < 0 ) {
1475                         break;
1476                 }
1477                 gamesnd_play_iface(SND_USER_SELECT);
1478                 hud_config_set_gauge_flags(HC_gauge_selected,0,0);
1479                 break;
1480         case HCB_POPUP:
1481                 if ( HC_gauge_selected < 0 ) {
1482                         break;
1483                 }
1484                 gamesnd_play_iface(SND_USER_SELECT);
1485                 hud_config_set_gauge_flags(HC_gauge_selected,1,1);
1486                 break;
1487         case HCB_RESET:
1488                 gamesnd_play_iface(SND_RESET_PRESSED);
1489                 hud_config_select_all_toggle(0);
1490                 hud_set_default_hud_config(Player);
1491                 hud_config_synch_ui();
1492                 break;
1493         case HCB_ACCEPT:
1494                 hud_config_commit();
1495                 break;
1496
1497         // new stuff
1498 #ifndef MAKE_FS1
1499         case HCB_RED_UP:
1500                 if( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) >= 255){
1501                         gamesnd_play_iface(SND_GENERAL_FAIL);
1502                 } else {
1503                         gamesnd_play_iface(SND_USER_SELECT);
1504                         HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) + 1)  );
1505                         hud_config_red_slider();                        
1506                 }               
1507                 break;
1508
1509         case HCB_GREEN_UP:
1510                 if( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) >= 255){
1511                         gamesnd_play_iface(SND_GENERAL_FAIL);
1512                 } else {
1513                         gamesnd_play_iface(SND_USER_SELECT);
1514                         HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) + 1) );
1515                         hud_config_green_slider();
1516                 }               
1517                 break;
1518
1519         case HCB_BLUE_UP:
1520                 if( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) >= 255){
1521                         gamesnd_play_iface(SND_GENERAL_FAIL);
1522                 } else {
1523                         gamesnd_play_iface(SND_USER_SELECT);
1524                         HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) + 1) );
1525                         hud_config_blue_slider();
1526                 }               
1527                 break;
1528
1529         case HCB_I_UP:
1530                 if( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) >= 255){
1531                         gamesnd_play_iface(SND_GENERAL_FAIL);
1532                 } else {
1533                         gamesnd_play_iface(SND_USER_SELECT);
1534                         HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) + 1) );
1535                         hud_config_alpha_slider_up();
1536                 }               
1537                 break;
1538
1539         case HCB_RED_DOWN:
1540                 if( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) <= 0){
1541                         gamesnd_play_iface(SND_GENERAL_FAIL);
1542                 } else {
1543                         gamesnd_play_iface(SND_USER_SELECT);
1544                         HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) - 1) );
1545                         hud_config_red_slider();
1546                 }               
1547                 break;
1548
1549         case HCB_GREEN_DOWN:
1550                 if( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) <= 0){
1551                         gamesnd_play_iface(SND_GENERAL_FAIL);
1552                 } else {
1553                         gamesnd_play_iface(SND_USER_SELECT);
1554                         HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) - 1) );
1555                         hud_config_green_slider();
1556                 }               
1557                 break;
1558
1559         case HCB_BLUE_DOWN:
1560                 if( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) <= 0){
1561                         gamesnd_play_iface(SND_GENERAL_FAIL);
1562                 } else {
1563                         gamesnd_play_iface(SND_USER_SELECT);
1564                         HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) - 1) );
1565                         hud_config_blue_slider();
1566                 }               
1567                 break;
1568
1569         case HCB_I_DOWN:
1570                 if( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) <= 0){
1571                         gamesnd_play_iface(SND_GENERAL_FAIL);
1572                 } else {
1573                         gamesnd_play_iface(SND_USER_SELECT);
1574                         HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV( HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem()) - 1) );
1575                         hud_config_alpha_slider_down();
1576                 }               
1577                 break;
1578
1579         case HCB_SAVE_HCF:              
1580                 int exists;
1581                 char *out;
1582
1583                 // get the text in the input control
1584                 exists = 0;
1585                 HC_fname_input.get_text(name);
1586                 if(strlen(name) > 0){
1587                         // if the filename in there already exists
1588                         for(idx=0; idx<HC_num_files; idx++){
1589                                 if(!stricmp(HC_filenames[idx], name)){
1590                                         exists = 1;
1591                                 }
1592                         }
1593                 }
1594
1595                 // already exists?
1596                 if(exists){
1597                         // save the file                        
1598                         out = cf_add_ext(name, ".hcf");
1599                         hud_config_color_save(out);
1600                         break;
1601                 }
1602
1603                 // otherwise we have to create a new file
1604                 if(HC_num_files >= MAX_HCF_FILES){
1605                         popup(PF_USE_AFFIRMATIVE_ICON, 1, "OK", "Max number of hud config files reached!");
1606                         break;
1607                 }
1608
1609                 // save the file, maybe generating a new filename
1610                 if(strlen(name) <= 0){
1611                         sprintf(name, "hud_%d.hcf", HC_num_files + 1);
1612                         out = name;
1613                 } else {
1614                         out = cf_add_ext(name, ".hcf");
1615                 }
1616                 HC_filenames[HC_num_files++] = strdup(out);
1617                 hud_config_color_save(out);             
1618
1619                 HC_fname_input.set_text(out);
1620                 break;
1621
1622         case HCB_PREV_HCF:
1623                 if(HC_num_files <= 0){
1624                         break;
1625                 }
1626
1627                 if(HC_current_file <= 0){
1628                         HC_current_file = HC_num_files - 1;
1629                 } else {
1630                         HC_current_file--;
1631                 }
1632                 // load em up
1633                 hud_config_color_load(HC_filenames[HC_current_file]);
1634                 hud_config_synch_ui();
1635
1636                 HC_fname_input.set_text(HC_filenames[HC_current_file]);
1637                 break;
1638
1639         case HCB_NEXT_HCF:
1640                 if(HC_num_files <= 0){
1641                         break;
1642                 }
1643
1644                 if(HC_current_file >= HC_num_files - 1){
1645                         HC_current_file = 0;
1646                 } else {
1647                         HC_current_file++;
1648                 }
1649
1650                 // load em up           
1651                 hud_config_color_load(HC_filenames[HC_current_file]);
1652                 hud_config_synch_ui();
1653
1654                 HC_fname_input.set_text(HC_filenames[HC_current_file]);
1655                 break;
1656
1657         case HCB_SELECT_ALL:                            
1658                 hud_config_select_all_toggle(!HC_select_all);
1659                 break;  
1660 #endif  // MAKE_FS1
1661
1662         default:
1663                 Int3();
1664                 break;
1665         }
1666 }
1667
1668 // Check if any buttons have been pressed
1669 void hud_config_check_buttons()
1670 {
1671         int                     i;
1672         UI_BUTTON       *b;
1673
1674         for ( i=0; i<NUM_HUD_BUTTONS; i++ ) {
1675                 b = &HC_buttons[gr_screen.res][i].button;
1676                 if ( b->pressed() ) {
1677                         hud_config_button_do(i);
1678                 }
1679         }
1680 }
1681
1682 // set the hud color button
1683 void hud_config_draw_color_status()
1684 {
1685         if ( HC_buttons[gr_screen.res][HCB_AMBER].button.button_down() || HC_buttons[gr_screen.res][HCB_GREEN].button.button_down() || HC_buttons[gr_screen.res][HCB_BLUE].button.button_down() ) {
1686                 return;
1687         }
1688
1689         switch(HUD_config.main_color) {
1690         case HUD_COLOR_AMBER:
1691                 HC_buttons[gr_screen.res][HCB_AMBER].button.draw_forced(2);
1692                 break;
1693         case HUD_COLOR_GREEN:
1694                 HC_buttons[gr_screen.res][HCB_GREEN].button.draw_forced(2);
1695                 break;
1696         case HUD_COLOR_BLUE:
1697                 HC_buttons[gr_screen.res][HCB_BLUE].button.draw_forced(2);
1698                 break;
1699         }
1700 }
1701
1702 // set the status (on/off/popup) for the selected gauge
1703 void hud_config_draw_gauge_status()
1704 {
1705         if ( HC_gauge_selected < 0 ) {
1706                 return;
1707         }
1708
1709         if ( HC_buttons[gr_screen.res][HCB_OFF].button.button_down() || HC_buttons[gr_screen.res][HCB_POPUP].button.button_down() || HC_buttons[gr_screen.res][HCB_ON].button.button_down() ) {
1710                 return;
1711         }
1712
1713         // check if off
1714         if ( !(hud_config_show_flag_is_set(HC_gauge_selected)) ) {
1715                 HC_buttons[gr_screen.res][HCB_OFF].button.draw_forced(2);
1716                 return;
1717         }
1718
1719         // check if popup
1720         if ( hud_config_popup_flag_is_set(HC_gauge_selected) ) {
1721                 HC_buttons[gr_screen.res][HCB_POPUP].button.draw_forced(2);
1722                 return;
1723         }
1724
1725         // check if on
1726         if ( hud_config_show_flag_is_set(HC_gauge_selected) ) {
1727                 HC_buttons[gr_screen.res][HCB_ON].button.draw_forced(2);
1728                 return;
1729         }
1730
1731         Int3(); // should never get here
1732 }
1733
1734 // disable a HUD config button
1735 void hud_config_button_disable(int index)
1736 {
1737         // HC_buttons[gr_screen.res][index].button.hide();
1738         HC_buttons[gr_screen.res][index].button.disable();
1739 }
1740
1741 // enable a HUD config button
1742 void hud_config_button_enable(int index)
1743 {
1744         // HC_buttons[gr_screen.res][index].button.unhide();
1745         HC_buttons[gr_screen.res][index].button.enable();
1746 }
1747
1748 // determine if on/off/popup buttons should be shown
1749 void hud_config_set_button_state()
1750 {
1751         if ( HC_gauge_selected < 0 ) {
1752                 hud_config_button_disable(HCB_ON);
1753                 hud_config_button_disable(HCB_OFF);
1754                 hud_config_button_disable(HCB_POPUP);
1755                 return;
1756         }
1757
1758         // on/off are always on
1759         hud_config_button_enable(HCB_ON);
1760         hud_config_button_enable(HCB_OFF);
1761
1762         // popup is maybe available
1763         if ( HC_gauge_regions[gr_screen.res][HC_gauge_selected].can_popup ) {
1764                 hud_config_button_enable(HCB_POPUP);
1765         } else {
1766                 hud_config_button_disable(HCB_POPUP);
1767         }
1768 }
1769
1770 void hud_config_render_description()
1771 {
1772         int w,h,sx,sy;
1773
1774         if ( HC_gauge_selected >= 0 ) {
1775                 gr_set_color_fast(&Color_normal);
1776
1777                 gr_get_string_size(&w, &h, HC_gauge_descriptions(HC_gauge_selected));
1778                 sx = fl2i(HC_gauge_description_coords[gr_screen.res][0] + (HC_gauge_description_coords[gr_screen.res][2] - w)/2.0f);
1779                 sy = HC_gauge_description_coords[gr_screen.res][1];
1780                 gr_string(sx, sy, HC_gauge_descriptions(HC_gauge_selected));
1781         }
1782 }
1783
1784 void hud_config_render_special_bitmaps()
1785 {
1786 #ifdef MAKE_FS1
1787         int i;
1788         for (i=1; i<NUM_HC_SPECIAL_BITMAPS; i++) {
1789                 if (HC_special_bitmaps[i].bitmap >= 0) {
1790                         gr_set_bitmap(HC_special_bitmaps[i].bitmap, GR_ALPHABLEND_NONE, GR_BITBLT_MODE_NORMAL, 1.0f, -1, -1);
1791                         gr_bitmap(HC_special_bitmaps[i].x, HC_special_bitmaps[i].y);
1792                 }
1793         }
1794 #endif
1795 }
1796
1797 // update HUD_color_alpha based on brightness slider
1798 void hud_config_update_brightness()
1799 {
1800 #ifdef MAKE_FS1
1801         HUD_color_alpha = HC_sliders[gr_screen.res][HC_BRIGHTNESS_SLIDER].slider.pos+3;
1802         Assert(HUD_color_alpha >= HUD_COLOR_ALPHA_USER_MIN);
1803         Assert(HUD_color_alpha <= HUD_COLOR_ALPHA_USER_MAX);
1804 #endif
1805 }
1806
1807 // redraw any pressed buttons, needed since the glow on pressed buttons might get clipped off by
1808 // adjacent buttons otherwise
1809 void hud_config_redraw_pressed_buttons()
1810 {
1811         int                     i;
1812         UI_BUTTON       *b;
1813
1814         for ( i = 0; i < NUM_HUD_BUTTONS; i++ ) {
1815                 b = &HC_buttons[gr_screen.res][i].button;
1816                 if ( b->button_down() ) {
1817                         b->draw_forced(2);
1818                 }
1819         }
1820 }
1821
1822 // hud_config_do_frame() is called from the main freespace loop while the game is in the state
1823 // GS_STATE_HUD_CONFIG.
1824 //
1825 void hud_config_do_frame(float frametime) 
1826 {
1827         int k;
1828
1829         if (!HUD_config_inited) {
1830                 hud_config_init();
1831         }
1832
1833         HC_gauge_hot = -1;
1834
1835         hud_config_set_button_state();
1836
1837         k = HC_ui_window.process();
1838
1839         hud_config_handle_keypresses(k);
1840         hud_config_check_regions();
1841         hud_config_check_buttons();
1842         hud_config_update_brightness();
1843
1844         // set the background
1845         GR_MAYBE_CLEAR_RES(HC_background_bitmap);
1846         if ( HC_background_bitmap > 0 ) {
1847                 gr_set_bitmap(HC_background_bitmap, GR_ALPHABLEND_NONE, GR_BITBLT_MODE_NORMAL, 1.0f, -1, -1);
1848                 gr_bitmap(0,0);
1849         }
1850
1851         // rgb slider/button stuff
1852         hud_config_process_colors();
1853
1854         HC_ui_window.draw();
1855         hud_config_redraw_pressed_buttons();
1856
1857         hud_config_draw_gauge_status();
1858         hud_config_draw_color_status();
1859
1860 #ifdef MAKE_FS1
1861         if (HC_special_bitmaps[HC_SPECIAL_RETICLE].bitmap >= 0) {
1862                 hud_set_default_color();
1863                 gr_set_bitmap(HC_special_bitmaps[HC_SPECIAL_RETICLE].bitmap, GR_ALPHABLEND_NONE, GR_BITBLT_MODE_NORMAL, 1.0f, -1, -1);
1864                 gr_aabitmap(HC_special_bitmaps[HC_SPECIAL_RETICLE].x, HC_special_bitmaps[HC_SPECIAL_RETICLE].y);
1865         }
1866 #endif
1867
1868         // maybe force draw the select all button
1869 #ifndef MAKE_FS1
1870         if(HC_select_all){
1871                 HC_buttons[gr_screen.res][HCB_SELECT_ALL].button.draw_forced(2);
1872         }
1873 #endif
1874
1875         hud_config_render_gauges();
1876         hud_config_render_special_bitmaps();
1877         hud_config_render_description();        
1878
1879         gr_flip();
1880 }
1881
1882 void hud_config_unload_gauges()
1883 {
1884         int                                     i, j;
1885         HC_gauge_region *hg;
1886
1887         for (i=0; i<NUM_HUD_GAUGES; i++) {
1888                 hg = &HC_gauge_regions[gr_screen.res][i];
1889
1890                 if ( hg->bitmap >= 0 ) {
1891                         for ( j=0; j<hg->nframes; j++ ) {
1892                                 bm_unload(hg->bitmap+j);
1893                         }
1894                 }
1895
1896                 hg->bitmap=-1;
1897                 hg->nframes=0;
1898         }
1899 }
1900
1901 // hud_config_close() is called when the player leaves the hud configuration screen
1902 //
1903 void hud_config_close()
1904 {
1905 #ifdef MAKE_FS1
1906         common_free_interface_palette();                // restore game palette
1907 #endif
1908         hud_config_unload_gauges();
1909         hud_init_popup_timers();                                // ensure no popup gauges are active
1910
1911         hud_config_color_close();
1912
1913         HC_ui_window.destroy();
1914 }
1915
1916 // hud_set_default_hud_config() will set the hud configuration to default values
1917 void hud_set_default_hud_config(player *p)
1918 {
1919         int idx;
1920
1921         HUD_color_alpha = HUD_COLOR_ALPHA_DEFAULT;
1922         HUD_config.main_color = HUD_COLOR_GREEN;
1923         HUD_color_red = HC_colors[HUD_config.main_color].r;
1924         HUD_color_green = HC_colors[HUD_config.main_color].g;
1925         HUD_color_blue = HC_colors[HUD_config.main_color].b;
1926
1927         for(idx=0; idx<NUM_HUD_GAUGES; idx++){
1928                 gr_init_alphacolor(&HUD_config.clr[idx], HUD_color_red, HUD_color_green, HUD_color_blue, (HUD_color_alpha+1)*16, AC_TYPE_HUD);
1929         }
1930
1931         HUD_config.show_flags = HUD_config_default_flags;
1932         HUD_config.show_flags2 = HUD_config_default_flags2;
1933         HUD_config.popup_flags = HUD_default_popup_mask;
1934         HUD_config.popup_flags2 = HUD_default_popup_mask2;
1935         HUD_config.num_msg_window_lines                 = 4;    // one more than is actually visible
1936         HUD_config.rp_flags = RP_DEFAULT;
1937         HUD_config.rp_dist = RR_INFINITY;
1938         HUD_config.is_observer = 0;
1939 }
1940
1941 // hud_config_restore() will restore the hud configuration the player started with when the 
1942 // hud configuration screen was started
1943 //
1944 void hud_config_restore()
1945 {
1946         HUD_config = HUD_config_backup;
1947 }
1948
1949 // hud_config_backup() will save the players hud configuration when they enter the hud configuration
1950 // screen.  This is done in case the player decides to cancel the changes that were made.
1951 //
1952 void hud_config_backup()
1953 {
1954         HUD_config_backup = HUD_config;
1955 }
1956
1957 void hud_config_as_observer(ship *shipp,ai_info *aif)
1958 {
1959         // store the current hus
1960         hud_config_backup();
1961
1962         // bash these values so the HUD is not offset incorrectly
1963         HUD_offset_x = 0.0f;
1964         HUD_offset_y = 0.0f;
1965
1966         // initialize the observer HUD
1967         hud_observer_init(shipp,aif);   
1968 }
1969
1970 void hud_config_as_player()
1971 {
1972
1973
1974 // ---------------------------------------------------------------------------------------------------------------
1975 // RGB color stuff
1976 //
1977
1978 void hud_config_color_save(const char *name)
1979 {
1980         int idx;
1981         CFILE *out = cfopen(name, "wt", CFILE_NORMAL, CF_TYPE_PLAYERS);
1982         char vals[255] = "";
1983
1984         // bad
1985         if(out == NULL){
1986                 Int3();
1987                 return;
1988         }       
1989
1990         // write out all gauges
1991         for(idx=0; idx<NUM_HUD_GAUGES; idx++){
1992                 cfputs("+Gauge: ", out);
1993                 cfputs(HC_gauge_descriptions(idx), out);                
1994                 cfputs("\n", out);
1995                 cfputs("+RGBA: ", out);
1996                 sprintf(vals, "%d %d %d %d\n\n", HUD_config.clr[idx].red, HUD_config.clr[idx].green, HUD_config.clr[idx].blue, HUD_config.clr[idx].alpha);
1997                 cfputs(vals, out);
1998         }
1999         
2000         // close the file
2001         cfclose(out);   
2002 }
2003
2004 void hud_config_color_load(const char *name)
2005 {
2006         int idx, rval;
2007         char str[1024] = "";
2008         char *fname;
2009
2010         fname = cf_add_ext(name, ".hcf");
2011
2012         if ((rval = setjmp(parse_abort)) != 0) {
2013                 mprintf(("Error opening hud config file!\n"));
2014                 return;
2015         } else {
2016                 read_file_text(fname);
2017                 reset_parse();
2018         }
2019
2020         // write out all gauges
2021         for(idx=0; idx<NUM_HUD_GAUGES; idx++){          
2022                 required_string("+Gauge:");
2023                 stuff_string(str, F_NAME, NULL, 1023);
2024
2025                 required_string("+RGBA:");
2026                 stuff_byte(&HUD_config.clr[idx].red);
2027                 stuff_byte(&HUD_config.clr[idx].green);
2028                 stuff_byte(&HUD_config.clr[idx].blue);
2029                 stuff_byte(&HUD_config.clr[idx].alpha);
2030         }       
2031 }
2032
2033 void hud_config_alpha_slider_up()
2034 {       
2035 #ifndef MAKE_FS1
2036         int pos = HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem());
2037         int max = max(max( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) ), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) );
2038
2039         // if this would put the brightest element past its limit, skip
2040         if(max >= 255){
2041                 HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(pos - 1) );
2042                 return;
2043         }
2044         
2045         // otherwise bump everybody up by one
2046         HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) + 1) );     
2047         HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) + 1) );
2048         HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) + 1) );
2049         
2050         // apply
2051         if(HC_select_all){
2052                 hud_config_stuff_colors( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) );
2053         } else {
2054                 gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()), 255, AC_TYPE_HUD);
2055         }
2056 #endif
2057 }
2058
2059 void hud_config_alpha_slider_down()
2060 {       
2061 #ifndef MAKE_FS1
2062         int pos = HCS_CONV(HC_color_sliders[HCS_ALPHA].get_currentItem());
2063         int min = min(min( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) ), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) );
2064
2065         // if this would put the brightest element past its limit, skip
2066         if(min <= 0){
2067                 HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(pos + 1) );
2068                 return;
2069         }
2070         
2071         // otherwise bump everybody up by one
2072         HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) - 1) );     
2073         HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) - 1) );
2074         HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) - 1) );   
2075
2076         // apply
2077         if(HC_select_all){
2078                 hud_config_stuff_colors( HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()) );
2079         } else {
2080                 gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()), HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem()), 255, AC_TYPE_HUD);
2081         }
2082 #endif
2083 }
2084
2085 void hud_config_recalc_alpha_slider()
2086 {
2087 #ifndef MAKE_FS1
2088         int avg =HC_color_sliders[HCS_RED].get_currentItem() + HC_color_sliders[HCS_GREEN].get_currentItem() + HC_color_sliders[HCS_BLUE].get_currentItem();
2089         avg /= 3;
2090         HC_color_sliders[HCS_ALPHA].force_currentItem( avg );
2091 #endif
2092 }
2093
2094 void hud_config_red_slider()
2095 {
2096 #ifndef MAKE_FS1
2097         int idx;
2098         int pos = HCS_CONV(HC_color_sliders[HCS_RED].get_currentItem()) ;
2099
2100         // select all ?
2101         if(HC_select_all){
2102                 for(idx=0; idx<NUM_HUD_GAUGES; idx++){
2103                         gr_init_alphacolor(&HUD_config.clr[idx], pos, HUD_config.clr[idx].green, HUD_config.clr[idx].blue, HUD_config.clr[idx].alpha, AC_TYPE_HUD);
2104                 }
2105         }
2106         // individual gauge
2107         else {
2108                 if(HC_gauge_selected < 0){
2109                         return;
2110                 }
2111
2112                 // get slider position  
2113                 gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], pos, HUD_config.clr[HC_gauge_selected].green, HUD_config.clr[HC_gauge_selected].blue, HUD_config.clr[HC_gauge_selected].alpha, AC_TYPE_HUD);
2114         }       
2115
2116         hud_config_recalc_alpha_slider();
2117 #endif
2118 }
2119
2120 void hud_config_green_slider()
2121 {
2122 #ifndef MAKE_FS1
2123         int idx;
2124         int pos = HCS_CONV(HC_color_sliders[HCS_GREEN].get_currentItem()) ;
2125
2126         // select all ?
2127         if(HC_select_all){
2128                 for(idx=0; idx<NUM_HUD_GAUGES; idx++){
2129                         gr_init_alphacolor(&HUD_config.clr[idx], HUD_config.clr[idx].red, pos, HUD_config.clr[idx].blue, HUD_config.clr[idx].alpha, AC_TYPE_HUD);
2130                 }
2131         }
2132         // individual gauge
2133         else {
2134                 if(HC_gauge_selected < 0){
2135                         return;
2136                 }
2137
2138                 // get slider position  
2139                 gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], HUD_config.clr[HC_gauge_selected].red, pos, HUD_config.clr[HC_gauge_selected].blue, HUD_config.clr[HC_gauge_selected].alpha, AC_TYPE_HUD);
2140         }       
2141
2142         hud_config_recalc_alpha_slider();
2143 #endif
2144 }
2145
2146 void hud_config_blue_slider()
2147 {
2148 #ifndef MAKE_FS1
2149         int idx;
2150         int pos = HCS_CONV(HC_color_sliders[HCS_BLUE].get_currentItem());
2151
2152         // select all ?
2153         if(HC_select_all){
2154                 for(idx=0; idx<NUM_HUD_GAUGES; idx++){
2155                         gr_init_alphacolor(&HUD_config.clr[idx], HUD_config.clr[idx].red, HUD_config.clr[idx].green, pos, HUD_config.clr[idx].alpha, AC_TYPE_HUD);
2156                 }
2157         }
2158         // individual gauge
2159         else {
2160                 if(HC_gauge_selected < 0){
2161                         return;
2162                 }
2163
2164                 // get slider position  
2165                 gr_init_alphacolor(&HUD_config.clr[HC_gauge_selected], HUD_config.clr[HC_gauge_selected].red, HUD_config.clr[HC_gauge_selected].green, pos, HUD_config.clr[HC_gauge_selected].alpha, AC_TYPE_HUD);
2166         }       
2167
2168         hud_config_recalc_alpha_slider();
2169 #endif
2170 }
2171
2172 void hud_config_process_colors()
2173 {       
2174 }
2175
2176 void hud_config_color_init()
2177 {
2178         HC_current_file = -1;
2179
2180         // get a list of all hcf files
2181         memset(HC_filenames, 0, sizeof(char*) * MAX_HCF_FILES);
2182         HC_num_files = cf_get_file_list(MAX_HCF_FILES, HC_filenames, CF_TYPE_PLAYERS, "*.hcf", CF_SORT_NAME);
2183 }
2184
2185 void hud_config_color_close()
2186 {
2187         int idx;
2188
2189         // free all 
2190         for(idx=0; idx<HC_num_files; idx++){
2191                 if(HC_filenames[idx] != NULL){
2192                         free(HC_filenames[idx]);
2193                         HC_filenames[idx] = NULL;
2194                 }
2195         }
2196 }
2197
2198 void hud_config_select_all_toggle(int toggle)
2199 {       
2200 #ifndef MAKE_FS1
2201         int r, g, b, a;
2202
2203         // if we're turning off
2204         if(!toggle){                            
2205                 // determine if on/off/popup buttons should be shown
2206                 hud_config_set_button_state();
2207
2208                 HC_select_all = 0;
2209         } else {
2210                 // synch stuff up
2211                 hud_config_synch_ui();
2212                 
2213                 // if we had a gauge previously selected, use its color everywhere
2214                 if(HC_gauge_selected < 0){
2215                         r = HUD_config.clr[HUD_RADAR].red;
2216                         g = HUD_config.clr[HUD_RADAR].green;
2217                         b = HUD_config.clr[HUD_RADAR].blue;                     
2218                         a = HUD_config.clr[HUD_RADAR].alpha;
2219                 } else {
2220                         r = HUD_config.clr[HC_gauge_selected].red;
2221                         g = HUD_config.clr[HC_gauge_selected].green;
2222                         b = HUD_config.clr[HC_gauge_selected].blue;                     
2223                         a = HUD_config.clr[HC_gauge_selected].alpha;
2224                 }
2225                 hud_config_stuff_colors(r, g, b);
2226
2227                 // no gauge selected
2228                 HC_gauge_selected = -1;         
2229
2230                 // enable all sliders
2231                 HC_color_sliders[HCS_RED].enable();
2232                 HC_color_sliders[HCS_GREEN].enable();
2233                 HC_color_sliders[HCS_BLUE].enable();
2234                 HC_color_sliders[HCS_ALPHA].enable();
2235                 HC_color_sliders[HCS_RED].unhide();
2236                 HC_color_sliders[HCS_GREEN].unhide();
2237                 HC_color_sliders[HCS_BLUE].unhide();
2238                 HC_color_sliders[HCS_ALPHA].unhide();
2239                 HC_color_sliders[HCS_RED].force_currentItem( HCS_CONV(r) );
2240                 HC_color_sliders[HCS_GREEN].force_currentItem( HCS_CONV(g) );
2241                 HC_color_sliders[HCS_BLUE].force_currentItem( HCS_CONV(b) );
2242                 HC_color_sliders[HCS_ALPHA].force_currentItem( HCS_CONV(a) );
2243
2244                 // recalc alpha
2245                 hud_config_recalc_alpha_slider();
2246
2247                 // disable all three buttons
2248                 hud_config_button_disable(HCB_ON);
2249                 hud_config_button_disable(HCB_OFF);
2250                 hud_config_button_disable(HCB_POPUP);
2251
2252                 HC_select_all = 1;
2253         }
2254 #endif
2255 }