]> icculus.org git repositories - btb/d2x.git/blob - main/kconfig.c
added option to disable kalinix under unix
[btb/d2x.git] / main / kconfig.c
1 /* $Id: kconfig.c,v 1.24 2003-10-08 19:18:46 btb Exp $ */
2 /*
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
13 */
14
15 /*
16  *
17  * Routines to configure keyboard, joystick, etc..
18  *
19  * Old Log:
20  * Revision 1.18  1995/10/29  20:14:10  allender
21  * don't read mouse 30x/sec.  Still causes problems -- left with
22  * exposure at > 60 frame/s
23  *
24  * Revision 1.17  1995/10/27  14:16:35  allender
25  * don't set lastreadtime when doing mouse stuff if we didn't
26  * read mouse this frame
27  *
28  * Revision 1.16  1995/10/24  18:10:22  allender
29  * get mouse stuff working right this time?
30  *
31  * Revision 1.15  1995/10/23  14:50:50  allender
32  * corrected values for control type in kc_set_controls
33  *
34  * Revision 1.14  1995/10/21  16:36:54  allender
35  * fix up mouse read time
36  *
37  * Revision 1.13  1995/10/20  00:46:53  allender
38  * fix up mouse reading problem
39  *
40  * Revision 1.12  1995/10/19  13:36:38  allender
41  * mouse support in kconfig screens
42  *
43  * Revision 1.11  1995/10/18  21:06:06  allender
44  * removed Int3 in cruise stuff -- was in there for debugging and
45  * now not needed
46  *
47  * Revision 1.10  1995/10/17  13:12:47  allender
48  * fixed config menus so buttons don't get configured
49  *
50  * Revision 1.9  1995/10/15  23:07:55  allender
51  * added return key as second button for primary fire
52  *
53  * Revision 1.8  1995/09/05  08:49:47  allender
54  * change 'PADRTN' label to 'ENTER'
55  *
56  * Revision 1.7  1995/09/01  15:38:22  allender
57  * took out cap of reading controls max 25 times/sec
58  *
59  * Revision 1.6  1995/09/01  13:33:59  allender
60  * erase all old text
61  *
62  * Revision 1.5  1995/08/18  10:20:55  allender
63  * keep controls reading to 25 times/s max so fast
64  * frame rates don't mess up control reading
65  *
66  * Revision 1.4  1995/07/28  15:43:13  allender
67  * make mousebutton control primary fire
68  *
69  * Revision 1.3  1995/07/26  17:04:32  allender
70  * new defaults and make joystick main button work correctly
71  *
72  * Revision 1.2  1995/07/17  08:51:03  allender
73  * fixed up configuration menus to look right
74  *
75  * Revision 1.1  1995/05/16  15:26:56  allender
76  * Initial revision
77  *
78  * Revision 2.11  1995/08/23  16:08:04  john
79  * Added version 2 of external controls that passes the ship
80  * position and orientation the drivers.
81  *
82  * Revision 2.10  1995/07/07  16:48:01  john
83  * Fixed bug with new interface.
84  *
85  * Revision 2.9  1995/07/03  15:02:32  john
86  * Added new version of external controls for Cybermouse absolute position.
87  *
88  * Revision 2.8  1995/06/30  12:30:28  john
89  * Added -Xname command line.
90  *
91  * Revision 2.7  1995/03/30  16:36:56  mike
92  * text localization.
93  *
94  * Revision 2.6  1995/03/21  14:39:31  john
95  * Ifdef'd out the NETWORK code.
96  *
97  * Revision 2.5  1995/03/16  10:53:07  john
98  * Move VFX center to Shift+Z instead of Enter because
99  * it conflicted with toggling HUD on/off.
100  *
101  * Revision 2.4  1995/03/10  13:47:24  john
102  * Added head tracking sensitivity.
103  *
104  * Revision 2.3  1995/03/09  18:07:06  john
105  * Fixed bug with iglasses tracking not "centering" right.
106  * Made VFX have bright headlight lighting.
107  *
108  * Revision 2.2  1995/03/08  15:32:39  john
109  * Made VictorMaxx head tracking use Greenleaf code.
110  *
111  * Revision 2.1  1995/03/06  15:23:31  john
112  * New screen techniques.
113  *
114  * Revision 2.0  1995/02/27  11:29:26  john
115  * New version 2.0, which has no anonymous unions, builds with
116  * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
117  *
118  * Revision 1.105  1995/02/22  14:11:58  allender
119  * remove anonymous unions from object structure
120  *
121  * Revision 1.104  1995/02/13  12:01:56  john
122  * Fixed bug with buggin not mmaking player faster.
123  *
124  * Revision 1.103  1995/02/09  22:00:46  john
125  * Added i-glasses tracking.
126  *
127  * Revision 1.102  1995/01/24  21:25:47  john
128  * Fixed bug with slide/bank on not working with
129  * Cyberman heading.,
130  *
131  * Revision 1.101  1995/01/24  16:09:56  john
132  * Fixed bug with Wingman extreme customize text overwriting title.
133  *
134  * Revision 1.100  1995/01/24  12:37:46  john
135  * Made Esc exit key define menu.
136  *
137  * Revision 1.99  1995/01/23  23:54:43  matt
138  * Made keypad enter work
139  *
140  * Revision 1.98  1995/01/23  16:42:00  john
141  * Made the external controls always turn banking off, leveling off
142  * and passed automap state thru to the tsr.
143  *
144  * Revision 1.97  1995/01/12  11:41:33  john
145  * Added external control reading.
146  *
147  * Revision 1.96  1995/01/05  10:43:58  mike
148  * Handle case when timer_get_fixed_seconds() goes negative.  Happens at 9.1
149  * hours.  Previously, joystick would stop functioning.  Now will work.
150  *
151  * Revision 1.95  1994/12/29  11:17:38  john
152  * Took out some warnings and mprintf.
153  *
154  * Revision 1.94  1994/12/29  11:07:41  john
155  * Fixed Thrustmaster and Logitech Wingman extreme
156  * Hat by reading the y2 axis during the center stage
157  * of the calibration, and using 75, 50, 27, and 3 %
158  * as values for the 4 positions.
159  *
160  * Revision 1.93  1994/12/27  12:16:20  john
161  * Fixed bug with slide on not working with joystick or mouse buttons.
162  *
163  * Revision 1.92  1994/12/20  10:34:15  john
164  * Made sensitivity work for mouse & joystick and made
165  * it only affect, pitch, heading, and roll.
166  *
167  * Revision 1.91  1994/12/16  00:11:23  matt
168  * Made delete key act normally when debug out
169  *
170  * Revision 1.90  1994/12/14  17:41:15  john
171  * Added more buttons so that  Yoke would work.
172  *
173  * Revision 1.89  1994/12/13  17:25:35  allender
174  * Added Assert for bogus time for joystick reading.
175  *
176  * Revision 1.88  1994/12/13  14:48:01  john
177  * Took out some debugging mprintf's
178  *
179  *
180  * Revision 1.87  1994/12/13  14:43:02  john
181  * Took out the code in kconfig to build direction array.
182  * Called kc_set_controls after selecting a new control type.
183  *
184  * Revision 1.86  1994/12/13  01:11:32  john
185  * Fixed bug with message clearing overwriting
186  * right border.
187  *
188  * Revision 1.85  1994/12/12  00:35:58  john
189  * Added or thing for keys.
190  *
191  * Revision 1.84  1994/12/09  17:08:06  john
192  * Made mouse a bit less sensitive.
193  *
194  * Revision 1.83  1994/12/09  16:04:00  john
195  * Increased mouse sensitivity.
196  *
197  * Revision 1.82  1994/12/09  00:41:26  mike
198  * fix hang in automap print screen
199  *
200  * Revision 1.81  1994/12/08  11:50:37  john
201  * Made strcpy only copy corect number of chars,.
202  *
203  * Revision 1.80  1994/12/07  16:16:06  john
204  * Added command to check to see if a joystick axes has been used.
205  *
206  * Revision 1.79  1994/12/07  14:52:28  yuan
207  * Localization 492
208  *
209  * Revision 1.78  1994/12/07  13:37:40  john
210  * Made the joystick thrust work in reverse.
211  *
212  * Revision 1.77  1994/12/07  11:28:24  matt
213  * Did a little localization support
214  *
215  * Revision 1.76  1994/12/04  12:30:03  john
216  * Made the Thrustmaster stick read every frame, not every 10 frames,
217  * because it uses analog axis as buttons.
218  *
219  * Revision 1.75  1994/12/03  22:35:25  yuan
220  * Localization 412
221  *
222  * Revision 1.74  1994/12/03  15:39:24  john
223  * Made numeric keypad move in conifg.
224  *
225  * Revision 1.73  1994/12/01  16:23:39  john
226  * Fixed include mistake.
227  *
228  * Revision 1.72  1994/12/01  16:07:57  john
229  * Fixed bug that disabled joystick in automap because it used gametime, which is
230  * paused during automap. Fixed be used timer_Get_fixed_seconds instead of GameTime.
231  *
232  * Revision 1.71  1994/12/01  12:30:49  john
233  * Made Ctrl+D delete, not Ctrl+E
234  *
235  * Revision 1.70  1994/12/01  11:52:52  john
236  * Added default values for GamePad.
237  *
238  * Revision 1.69  1994/11/30  00:59:12  mike
239  * optimizations.
240  *
241  * Revision 1.68  1994/11/29  03:45:50  john
242  * Added joystick sensitivity; Added sound channels to detail menu.  Removed -maxchannels
243  * command line arg.
244  *
245  * Revision 1.67  1994/11/27  23:13:44  matt
246  * Made changes for new mprintf calling convention
247  *
248  * Revision 1.66  1994/11/27  19:52:12  matt
249  * Made screen shots work in a few more places
250  *
251  * Revision 1.65  1994/11/22  16:54:50  mike
252  * autorepeat on missiles.
253  *
254  * Revision 1.64  1994/11/21  11:16:17  rob
255  * Changed calls to GameLoop to calls to multi_menu_poll and changed
256  * conditions under which they are called.
257  *
258  * Revision 1.63  1994/11/19  15:14:48  mike
259  * remove unused code and data
260  *
261  * Revision 1.62  1994/11/18  23:37:56  john
262  * Changed some shorts to ints.
263  *
264  * Revision 1.61  1994/11/17  13:36:35  rob
265  * Added better network hook in kconfig menu.
266  *
267  * Revision 1.60  1994/11/14  20:09:13  john
268  * Made Tab be default for automap.
269  *
270  * Revision 1.59  1994/11/13  16:34:07  matt
271  * Fixed victormaxx angle conversions
272  *
273  * Revision 1.58  1994/11/12  14:47:05  john
274  * Added support for victor head tracking.
275  *
276  * Revision 1.57  1994/11/08  15:14:55  john
277  * Added more calls so net doesn't die in net game.
278  *
279  * Revision 1.56  1994/11/07  14:01:07  john
280  * Changed the gamma correction sequencing.
281  *
282  * Revision 1.55  1994/11/01  16:40:08  john
283  * Added Gamma correction.
284  *
285  * Revision 1.54  1994/10/25  23:09:26  john
286  * Made the automap key configurable.
287  *
288  * Revision 1.53  1994/10/25  13:11:59  john
289  * Made keys the way Adam speced 'em for final game.
290  *
291  * Revision 1.52  1994/10/24  17:44:22  john
292  * Added stereo channel reversing.
293  *
294  * Revision 1.51  1994/10/22  13:23:18  john
295  * Made default rear view key be R.
296  *
297  * Revision 1.50  1994/10/22  13:20:09  john
298  * Took out toggle primary/secondary weapons.  Fixed black
299  * background for 'axes' and 'buttons' text.
300  *
301  * Revision 1.49  1994/10/21  15:20:15  john
302  * Made PrtScr do screen dump, not F2.
303  *
304  * Revision 1.48  1994/10/21  13:41:36  john
305  * Allowed F2 to screen dump.
306  *
307  * Revision 1.47  1994/10/17  13:07:05  john
308  * Moved the descent.cfg info into the player config file.
309  *
310  * Revision 1.46  1994/10/14  15:30:22  john
311  * Added Cyberman default positions.
312  *
313  * Revision 1.45  1994/10/14  15:24:54  john
314  * Made Cyberman work with config.
315  *
316  * Revision 1.44  1994/10/14  12:46:04  john
317  * Added the ability to reset all to default.
318  *
319  * Revision 1.43  1994/10/14  12:18:31  john
320  * Made mouse invert axis always be 0 or 1.
321  *
322  * Revision 1.42  1994/10/14  12:16:03  john
323  * Changed code so that by doing DEL+F12 saves the current kconfig
324  * values as default. Added support for drop_bomb key.  Took out
325  * unused slots for keyboard.  Made keyboard use control_type of 0
326  * save slots.
327  *
328  * Revision 1.41  1994/10/13  21:27:02  john
329  * Made axis invert value always be 0 or 1.
330  *
331  * Revision 1.40  1994/10/13  20:18:15  john
332  * Added some more system keys, such as F? and CAPSLOCK.
333  *
334  * Revision 1.39  1994/10/13  19:22:29  john
335  * Added separate config saves for different devices.
336  * Made all the devices work together better, such as mice won't
337  * get read when you're playing with the joystick.
338  *
339  * Revision 1.38  1994/10/13  15:41:57  mike
340  * Remove afterburner.
341  *
342  */
343
344 #ifdef HAVE_CONFIG_H
345 #include <conf.h>
346 #endif
347
348 #ifdef RCS
349 static char rcsid[] = "$Id: kconfig.c,v 1.24 2003-10-08 19:18:46 btb Exp $";
350 #endif
351
352 #ifdef WINDOWS
353 #include "desw.h"
354 #endif
355
356 #include <stdio.h>
357 #include <stdlib.h>
358 #include <string.h>
359 #include <stdarg.h>
360 #include <ctype.h>
361
362 #include "pa_enabl.h"                   //$$POLY_ACC
363 #include "error.h"
364 #include "pstypes.h"
365 #include "gr.h"
366 #include "mono.h"
367 #include "key.h"
368 #include "palette.h"
369 #include "game.h"
370 #include "gamefont.h"
371 #include "iff.h"
372 #include "u_mem.h"
373 #include "joy.h"
374 #include "mouse.h"
375 #include "kconfig.h"
376 #include "gauges.h"
377 #include "joydefs.h"
378 #include "songs.h"
379 #include "render.h"
380 #include "digi.h"
381 #include "newmenu.h"
382 #include "endlevel.h"
383 #include "multi.h"
384 #include "timer.h"
385 #include "text.h"
386 #include "player.h"
387 #include "menu.h"
388 #include "automap.h"
389 #include "args.h"
390 #include "lighting.h"
391 #include "ai.h"
392 #include "cntrlcen.h"
393 #if defined (TACTILE)
394  #include "tactile.h"
395 #endif
396
397 #if defined(POLY_ACC)
398 #include "poly_acc.h"
399 #endif
400
401 #include "collide.h"
402
403 #ifdef __unix__
404 #include "joystick.h"
405 #endif
406
407 ubyte ExtGameStatus=1;
408
409 vms_vector ExtForceVec;
410 vms_matrix ExtApplyForceMatrix;
411
412 int ExtJoltInfo[3]={0,0,0};
413 int ExtXVibrateInfo[2]={0,0};
414 int ExtYVibrateInfo[2]={0,0};
415 ubyte ExtXVibrateClear=0;
416 ubyte ExtYVibrateClear=0;
417
418 #define TABLE_CREATION 1
419
420 // Array used to 'blink' the cursor while waiting for a keypress.
421 sbyte fades[64] = { 1,1,1,2,2,3,4,4,5,6,8,9,10,12,13,15,16,17,19,20,22,23,24,26,27,28,28,29,30,30,31,31,31,31,31,30,30,29,28,28,27,26,24,23,22,20,19,17,16,15,13,12,10,9,8,6,5,4,4,3,2,2,1,1 };
422
423 //char * invert_text[2] = { "N", "Y" };
424 //char * joybutton_text[28] = { "BTN 1", "BTN 2", "BTN 3", "BTN 4", "", "TRIG", "LEFT", "HAT \81", "RIGHT", "", "", "HAT \80", "MID", "", "", "HAT \7f", "", "", "", "HAT \82", "TRIG", "LEFT", "RIGHT", "", "UP","DOWN","LEFT", "RIGHT" };
425 //char * joyaxis_text[4] = { "X1", "Y1", "X2", "Y2" };
426 //char * mouseaxis_text[2] = { "L/R", "F/B" };
427 //char * mousebutton_text[3] = { "Left", "Right", "Mid" };
428
429 int invert_text[2] = { TNUM_N, TNUM_Y };
430
431 #ifdef WINDOWS
432         int joybutton_text[28] = 
433         { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
434           -1, -1, -1, -1,
435           -1, -1, -1, -1,
436           -1, -1, -1, -1,
437           TNUM_HAT_L, TNUM_HAT_R, TNUM_HAT_U, TNUM_HAT_D,
438           -1, -1, -1, -1,
439           -1, -1, -1, -1
440         };
441         int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
442 #else
443         int joybutton_text[28] = 
444         { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
445           -1, TNUM_TRIG, TNUM_LEFT, TNUM_HAT_L,
446          TNUM_RIGHT, -1, TNUM_HAT2_D, TNUM_HAT_R,
447          TNUM_MID, -1, TNUM_HAT2_R, TNUM_HAT_U,
448          TNUM_HAT2_L, -1, TNUM_HAT2_U, TNUM_HAT_D,
449          TNUM_TRIG, TNUM_LEFT, TNUM_RIGHT, -1, 
450          TNUM_UP, TNUM_DOWN, TNUM_LEFT, TNUM_RIGHT };
451
452         int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
453 //      int joyaxis_text[4] = { TNUM_X1, TNUM_Y1, TNUM_X2, TNUM_Y2 };
454 #endif
455         
456 int mouseaxis_text[3] = { TNUM_L_R, TNUM_F_B, TNUM_Z1 };
457 #ifndef MACINTOSH
458 int mousebutton_text[3] = { TNUM_LEFT, TNUM_RIGHT, TNUM_MID };
459 char * mousebutton_textra[13] = { "M4", "M5", "M6", "M7", "M8", "M9", "M10","M11","M12","M13","M14","M15","M16" };//text for buttons above 3. -MPM
460 #else
461 char *mousebutton_text[3] = { "Btn", "", "" };          // only one silly mouse button on the mac
462 #endif
463
464 #ifdef MACINTOSH
465 char * key_text[256] = {         
466 "","S","D","F","H","G","Z","X","C","V","","B","Q", "W", "E", "R",
467 "Y","T","1","2","3","4","6","5","=","9","7","-", "8", "0", "]", "O",
468 "U","[","I","P","RET","L","J","'","K", ";", "\\", ",", "/", "N", "M", ".",
469 "TAB","SPC","`","DEL","","ESC","","APL","SHIFT","CAPSL","OPTN","CTRL","","","","A",
470 "","PAD.","","PAD*","","PAD+","","NMLCK","","","","PAD/","ENTER","","PAD-","",
471 "","PAD=","PAD0","PAD1","PAD2","PAD3","PAD4","PAD5","PAD6","PAD7","","PAD8","PAD9","","","",
472 "F5","F6","F7","","F8","F9","","F11","","F13","","F14","","F10","","F12",
473 "","PAUSE","HELP","HOME","PGUP","DEL","","END","F2","","F1","LARW","RARW","DARW","UARW","",
474 "","","","","","","","","","","","","","","","",
475 "","","","","","","","","","","","","","","","",
476 "","","","","","","","","","","","","","","","",
477 "","","","","","","","","","","","","","","","",
478 "","","","","","","","","","","","","","","","",
479 "","","","","","","","","","","","","","","","",
480 "","","","","","","","","","","","","","","","",
481 "","","","","","","","","","","","","","","",""};
482 #else
483 #if !defined OGL && !defined SDL_INPUT
484 char * key_text[256] = {         \
485 "","ESC","1","2","3","4","5","6","7","8","9","0","-",                   \
486 "=","BSPC","TAB","Q","W","E","R","T","Y","U","I","O",                           \
487 "P","[","]","\83","LCTRL","A","S","D","F",        \
488 "G","H","J","K","L",";","'","`",        \
489 "LSHFT","\\","Z","X","C","V","B","N","M",",",      \
490 ".","/","RSHFT","PAD*","LALT","SPC",      \
491 "CPSLK","F1","F2","F3","F4","F5","F6","F7","F8","F9",        \
492 "F10","NMLCK","SCLK","PAD7","PAD8","PAD9","PAD-",   \
493 "PAD4","PAD5","PAD6","PAD+","PAD1","PAD2","PAD3","PAD0", \
494 "PAD.","","","","F11","F12","","","","","","","","","",         \
495 "","","","","","","","","","","","","","","","","","","","",     \
496 "","","","","","","","","","","","","","","","","","","","",     \
497 "","","","","","","","","","","","","","","","","","",           \
498 "PAD\83","RCTRL","","","","","","","","","","","","","", \
499 "","","","","","","","","","","PAD/","","","RALT","",      \
500 "","","","","","","","","","","","","","HOME","\82","PGUP",     \
501 "","\81","","\7f","","END","\80","PGDN","INS",       \
502 "DEL","","","","","","","","","","","","","","","","","",     \
503 "","","","","","","","","","","","","","","","","","","","",     \
504 "","","","","","","" };
505 #endif /* OGL */
506 #endif
507
508 #ifdef D2X_KEYS
509 //added/removed by Victor Rachels for adding rebindable keys for these
510 // KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0
511 ubyte system_keys[] = { KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_MINUS, KEY_EQUAL, KEY_PRINT_SCREEN };
512 #else
513 ubyte system_keys[] = { KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_PRINT_SCREEN };
514 #endif
515
516 //extern void GameLoop(int, int );
517
518 extern void transfer_energy_to_shield(fix);
519 extern void CyclePrimary(),CycleSecondary(),InitMarkerInput();
520 extern ubyte DefiningMarkerMessage;
521 extern char CybermouseActive;
522
523 #ifdef WINDOWS
524 extern int joydefsw_do_button();
525 extern int joydefsw_do_winjoybutton(int *axis);
526 extern joydefsw_win_joyselect(char *title);
527 #endif
528
529 control_info Controls;
530
531 fix Cruise_speed=0;
532
533 // macros for drawing lo/hi res kconfig screens (see scores.c as well)
534
535 #define LHX(x)          ((x)*(MenuHires?2:1))
536 #define LHY(y)          ((y)*(MenuHires?2.4:1))
537
538
539 #define BT_KEY                          0
540 #define BT_MOUSE_BUTTON         1
541 #define BT_MOUSE_AXIS           2
542 #define BT_JOY_BUTTON           3
543 #define BT_JOY_AXIS                     4
544 #define BT_INVERT                               5
545
546 char *btype_text[] = { "BT_KEY", "BT_MOUSE_BUTTON", "BT_MOUSE_AXIS", "BT_JOY_BUTTON", "BT_JOY_AXIS", "BT_INVERT" };
547
548 #define INFO_Y 28
549
550 typedef struct kc_item {
551         short id;                               // The id of this item
552         short x, y;                             
553         short w1;
554         short w2;
555         short u,d,l,r;
556         //short text_num1;
557         char *text;
558         ubyte type;
559         ubyte value;            // what key,button,etc
560 } kc_item;
561
562 int Num_items=28;
563 kc_item *All_items;
564
565 ubyte kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS];
566
567 //added on 2/4/99 by Victor Rachels to add d1x new keys
568 ubyte kconfig_d2x_settings[MAX_D2X_CONTROLS];
569 //end this section addition - VR
570
571 //----------- WARNING!!!!!!! -------------------------------------------
572 // THESE NEXT FOUR BLOCKS OF DATA ARE GENERATED BY PRESSING DEL+F12 WHEN
573 // IN THE KEYBOARD CONFIG SCREEN.  BASICALLY, THAT PROCEDURE MODIFIES THE
574 // U,D,L,R FIELDS OF THE ARRAYS AND DUMPS THE NEW ARRAYS INTO KCONFIG.COD
575 //-------------------------------------------------------------------------
576 /*ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
577 {0xc8,0x48,0xd0,0x50,0xcb,0x4b,0xcd,0x4d,0x38,0xff,0xff,0x4f,0xff,0x51,0xff,0x4a,0xff,0x4e,0xff,0xff,0x10,0x47,0x12,0x49,0x1d,0x9d,0x39,0xff,0x21,0xff,0x1e,0xff,0x2c,0xff,0x30,0xff,0x13,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xff,0x1f,0xff,0x33,0xff,0x34,0xff,0x23,0xff,0x14,0xff,0xff,0xff,0x0,0x0},
578 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
579 {0x5,0xc,0xff,0xff,0xff,0xff,0x7,0xf,0x13,0xb,0xff,0x6,0x8,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
580 {0x0,0x1,0xff,0xff,0x2,0xff,0x7,0xf,0x13,0xb,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0x3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
581 {0x3,0x0,0x1,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
582 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
583 {0x0,0x1,0xff,0xff,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
584 };*/                                                                              
585
586 #ifndef MACINTOSH
587 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
588 {0xc8,0x48,0xd0,0x50,0xcb,0x4b,0xcd,0x4d,0x38,0xff,0xff,0x4f,0xff,0x51,0xff,0x4a,0xff,0x4e,0xff,0xff,0x10,0x47,0x12,0x49,0x1d,0x9d,0x39,0xff,0x21,0xff,0x1e,0xff,0x2c,0xff,0x30,0xff,0x13,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xff,0x1f,0xff,0x33,0xff,0x34,0xff,0x23,0xff,0x14,0xff,0xff,0xff,0x0,0x0},
589 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
590 {0x5,0xc,0xff,0xff,0xff,0xff,0x7,0xf,0x13,0xb,0xff,0x6,0x8,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0},
591 {0x0,0x1,0xff,0xff,0x2,0xff,0x7,0xf,0x13,0xb,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
592 {0x3,0x0,0x1,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
593 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
594 {0x0,0x1,0xff,0xff,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
595 #ifdef WINDOWS
596 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
597 #endif
598 };
599
600
601
602 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
603         {  0, 15, 49, 71, 26, 55,  2, 55,  1,"Pitch forward", BT_KEY, 255 },
604         {  1, 15, 49,100, 26, 50,  3,  0, 24,"Pitch forward", BT_KEY, 255 },
605         {  2, 15, 57, 71, 26,  0,  4, 25,  3,"Pitch backward", BT_KEY, 255 },
606         {  3, 15, 57,100, 26,  1,  5,  2, 26,"Pitch backward", BT_KEY, 255 },
607         {  4, 15, 65, 71, 26,  2,  6, 27,  5,"Turn left", BT_KEY, 255 },
608         {  5, 15, 65,100, 26,  3,  7,  4, 28,"Turn left", BT_KEY, 255 },
609         {  6, 15, 73, 71, 26,  4,  8, 29,  7,"Turn right", BT_KEY, 255 },
610         {  7, 15, 73,100, 26,  5,  9,  6, 34,"Turn right", BT_KEY, 255 },
611         {  8, 15, 85, 71, 26,  6, 10, 35,  9,"Slide on", BT_KEY, 255 },
612         {  9, 15, 85,100, 26,  7, 11,  8, 36,"Slide on", BT_KEY, 255 },
613         { 10, 15, 93, 71, 26,  8, 12, 37, 11,"Slide left", BT_KEY, 255 },
614         { 11, 15, 93,100, 26,  9, 13, 10, 44,"Slide left", BT_KEY, 255 },
615         { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
616         { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
617         { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
618         { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
619         { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
620         { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
621         { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
622         { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
623         { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
624         { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
625         { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
626         { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
627         { 24,158, 49, 83, 26, 51, 26,  1, 25,"Fire primary", BT_KEY, 255 },
628         { 25,158, 49,112, 26, 54, 27, 24,  2,"Fire primary", BT_KEY, 255 },
629         { 26,158, 57, 83, 26, 24, 28,  3, 27,"Fire secondary", BT_KEY, 255 },
630         { 27,158, 57,112, 26, 25, 29, 26,  4,"Fire secondary", BT_KEY, 255 },
631         { 28,158, 65, 83, 26, 26, 34,  5, 29,"Fire flare", BT_KEY, 255 },
632         { 29,158, 65,112, 26, 27, 35, 28,  6,"Fire flare", BT_KEY, 255 },
633         { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
634         { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
635         { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
636         { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
637         { 34,158, 73, 83, 26, 28, 36,  7, 35,"Drop Bomb", BT_KEY, 255 },
638         { 35,158, 73,112, 26, 29, 37, 34,  8,"Drop Bomb", BT_KEY, 255 },
639         { 36,158, 85, 83, 26, 34, 44,  9, 37,"REAR VIEW", BT_KEY, 255 },
640         { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
641         { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
642         { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
643         { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
644         { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
645         { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
646         { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
647         { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
648         { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
649         { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
650         { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
651         { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
652         { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
653         { 50, 15,169, 71, 26, 48,  1, 53, 51,"Cycle Second", BT_KEY, 255 },
654         { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
655         { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
656         { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
657         { 54,158,171, 83, 26, 52, 56, 51, 55,"Energy->Shield", BT_KEY, 255 },
658         { 55,158,171,112, 26, 53,  0, 54,  0,"Energy->Shield", BT_KEY, 255 },
659    { 56,158,179,83,  26, 54,  0, 0,  0, "Toggle Bomb",  BT_KEY,255},
660 };
661 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
662         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
663         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
664         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
665         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
666         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
667         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
668         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
669         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
670         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
671         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
672         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
673         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
674         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
675         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
676         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
677         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
678         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
679         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
680         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
681         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
682         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
683         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
684         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
685         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
686         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
687         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
688         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
689         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
690         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
691         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
692         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
693 };
694 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
695         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
696         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
697         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
698         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
699         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
700         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
701         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
702         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
703         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
704         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
705         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
706         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
707         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
708         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
709         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
710         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
711         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
712         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
713         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
714         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
715         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
716         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
717         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
718         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
719         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
720         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
721         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
722         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
723         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
724         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
725         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
726 };
727
728 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
729         {  0, 25, 46, 85, 26, 12,  1, 24,  5,"Fire primary", BT_MOUSE_BUTTON, 255 },
730         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
731         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
732         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
733         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_MOUSE_BUTTON, 255 },
734         {  5,180, 46, 59, 26, 24,  6,  0,  1,"Slide on", BT_MOUSE_BUTTON, 255 },
735         {  6,180, 54, 59, 26,  5,  7,  1,  4,"Slide left", BT_MOUSE_BUTTON, 255 },
736         {  7,180, 62, 59, 26,  6,  8,  4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
737         {  8,180, 70, 59, 26,  7,  9, 26,  9,"Slide up", BT_MOUSE_BUTTON, 255 },
738         {  9,180, 78, 59, 26,  8, 10,  8,  2,"Slide down", BT_MOUSE_BUTTON, 255 },
739         { 10,180, 90, 59, 26,  9, 11,  2,  3,"Bank on", BT_MOUSE_BUTTON, 255 },
740         { 11,180, 98, 59, 26, 10, 12,  3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
741         { 12,180,106, 59, 26, 11,  0, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
742         { 13,103,138, 58, 26, 27, 15, 25, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
743         { 14,103,138,106,  8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
744         { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
745         { 16,103,146,106,  8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
746         { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
747         { 18,103,154,106,  8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
748         { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
749         { 20,103,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
750         { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
751         { 22,103,170,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
752         { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
753         { 24,103,182,106,  8, 22,  5, 23,  0,"throttle", BT_INVERT, 255 },
754         { 25, 25,109, 85, 26,  3, 27, 12, 13,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
755         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
756         { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
757 };
758
759 #ifdef D2X_KEYS
760 //added on 2/4/99 by Victor Rachels to add d1x new keys
761 kc_item kc_d2x[NUM_D2X_CONTROLS] = {
762 //        id,x,y,w1,w2,u,d,l,r,text_num1,type,value
763         {  0, 15, 49, 71, 26, 27,  2, 27,  1, "WEAPON 1", BT_KEY, 255},
764         {  1, 15, 49,100, 26, 26,  3,  0,  2, "WEAPON 1", BT_JOY_BUTTON, 255},
765         {  2, 15, 57, 71, 26,  0,  4,  1,  3, "WEAPON 2", BT_KEY, 255},
766         {  3, 15, 57,100, 26,  1,  5,  2,  4, "WEAPON 2", BT_JOY_BUTTON, 255},
767         {  4, 15, 65, 71, 26,  2,  6,  3,  5, "WEAPON 3", BT_KEY, 255},
768         {  5, 15, 65,100, 26,  3,  7,  4,  6, "WEAPON 3", BT_JOY_BUTTON, 255},
769         {  6, 15, 73, 71, 26,  4,  8,  5,  7, "WEAPON 4", BT_KEY, 255},
770         {  7, 15, 73,100, 26,  5,  9,  6,  8, "WEAPON 4", BT_JOY_BUTTON, 255},
771         {  8, 15, 81, 71, 26,  6, 10,  7,  9, "WEAPON 5", BT_KEY, 255},
772         {  9, 15, 81,100, 26,  7, 11,  8, 10, "WEAPON 5", BT_JOY_BUTTON, 255},
773
774         { 10, 15, 89, 71, 26,  8, 12,  9, 11, "WEAPON 6", BT_KEY, 255},
775         { 11, 15, 89,100, 26,  9, 13, 10, 12, "WEAPON 6", BT_JOY_BUTTON, 255},
776         { 12, 15, 97, 71, 26, 10, 14, 11, 13, "WEAPON 7", BT_KEY, 255},
777         { 13, 15, 97,100, 26, 11, 15, 12, 14, "WEAPON 7", BT_JOY_BUTTON, 255},
778         { 14, 15,105, 71, 26, 12, 16, 13, 15, "WEAPON 8", BT_KEY, 255},
779         { 15, 15,105,100, 26, 13, 17, 14, 16, "WEAPON 8", BT_JOY_BUTTON, 255},
780         { 16, 15,113, 71, 26, 14, 18, 15, 17, "WEAPON 9", BT_KEY, 255},
781         { 17, 15,113,100, 26, 15, 19, 16, 18, "WEAPON 9", BT_JOY_BUTTON, 255},
782         { 18, 15,121, 71, 26, 16, 20, 17, 19, "WEAPON 0", BT_KEY, 255},
783         { 19, 15,121,100, 26, 17, 21, 18, 20, "WEAPON 0", BT_JOY_BUTTON, 255},
784
785         //{ 20, 15,131, 71, 26, 18, 22, 19, 21, "CYC PRIMARY", BT_KEY, 255},
786         //{ 21, 15,131,100, 26, 19, 23, 20, 22, "CYC PRIMARY", BT_JOY_BUTTON, 255},
787         //{ 22, 15,139, 71, 26, 20, 24, 21, 23, "CYC SECONDARY", BT_KEY, 255},
788         //{ 23, 15,139,100, 26, 21, 25, 22, 24, "CYC SECONDARY", BT_JOY_BUTTON, 255},
789         //{ 24,  8,147, 78, 26, 22, 26, 23, 25, "TOGGLE_PRIM AUTO", BT_KEY, 255},
790         //{ 25,  8,147,107, 26, 23, 27, 24, 26, "TOGGLE_PRIM_AUTO", BT_JOY_BUTTON, 255},
791         //{ 26,  8,155, 78, 26, 24,  1, 25, 27, "TOGGLE SEC AUTO", BT_KEY, 255},
792         //{ 27,  8,155,107, 26, 25,  0, 26,  0, "TOGGLE SEC AUTO", BT_JOY_BUTTON, 255},
793 };
794 //end this section addition - VR
795 #endif
796
797 #else           // ifndef MACINTOSH (following are macintosh controls)
798
799 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
800 {0x5b,0x7e,0x54,0x7d,0x56,0x7b,0x58,0x7c,0x3a,0xff,0xff,0x53,0xff,0x55,0xff,0x4e,0xff,0x45,0xff,0xff,0xc,0x59,0xe,0x5c,0x3b,0x24,0x31,0xff,0x3,0xff,0x3f,0xff,0x6,0xff,0xb,0xff,0xf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0xff,0x1,0xff,0x2b,0xff,0x2f,0xff,0x4,0xff,0x11,0xff,0xff,0xff,0x0,0x0},
801 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
802 {0x0,0x3,0xff,0xff,0xff,0xff,0xb,0xc,0x9,0xa,0xff,0x1,0x2,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0},
803 {0x5,0x4,0xff,0xff,0x6,0xff,0x3,0x2,0x0,0x1,0xff,0x8,0xa,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0x3,0x1,0xb,0x7,0xd,0xe,0xf,0xc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
804 {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
805 {0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
806 {0x0,0x1,0xff,0xff,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
807 };
808
809 ubyte default_firebird_settings[MAX_CONTROLS] =
810 {0x0,0x1,0xff,0xff,0x2,0xff,0x4,0x6,0x5,0x7,0xff,0xb,0xc,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0x03,0x0,0xff,0x3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0};
811
812 ubyte default_mousestick_settings[MAX_CONTROLS] =
813 {0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3,0x4,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0};
814
815 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
816         {  0, 15, 49, 71, 26, 55,  2, 55,  1,"Pitch forward", BT_KEY, 255 },
817         {  1, 15, 49,100, 26, 50,  3,  0, 24,"Pitch forward", BT_KEY, 255 },
818         {  2, 15, 57, 71, 26,  0,  4, 25,  3,"Pitch backward", BT_KEY, 255 },
819         {  3, 15, 57,100, 26,  1,  5,  2, 26,"Pitch backward", BT_KEY, 255 },
820         {  4, 15, 65, 71, 26,  2,  6, 27,  5,"Turn left", BT_KEY, 255 },
821         {  5, 15, 65,100, 26,  3,  7,  4, 28,"Turn left", BT_KEY, 255 },
822         {  6, 15, 73, 71, 26,  4,  8, 29,  7,"Turn right", BT_KEY, 255 },
823         {  7, 15, 73,100, 26,  5,  9,  6, 34,"Turn right", BT_KEY, 255 },
824         {  8, 15, 85, 71, 26,  6, 10, 35,  9,"Slide on", BT_KEY, 255 },
825         {  9, 15, 85,100, 26,  7, 11,  8, 36,"Slide on", BT_KEY, 255 },
826         { 10, 15, 93, 71, 26,  8, 12, 37, 11,"Slide left", BT_KEY, 255 },
827         { 11, 15, 93,100, 26,  9, 13, 10, 44,"Slide left", BT_KEY, 255 },
828         { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
829         { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
830         { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
831         { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
832         { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
833         { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
834         { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
835         { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
836         { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
837         { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
838         { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
839         { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
840         { 24,158, 49, 83, 26, 51, 26,  1, 25,"Fire primary", BT_KEY, 255 },
841         { 25,158, 49,112, 26, 54, 27, 24,  2,"Fire primary", BT_KEY, 255 },
842         { 26,158, 57, 83, 26, 24, 28,  3, 27,"Fire secondary", BT_KEY, 255 },
843         { 27,158, 57,112, 26, 25, 29, 26,  4,"Fire secondary", BT_KEY, 255 },
844         { 28,158, 65, 83, 26, 26, 34,  5, 29,"Fire flare", BT_KEY, 255 },
845         { 29,158, 65,112, 26, 27, 35, 28,  6,"Fire flare", BT_KEY, 255 },
846         { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
847         { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
848         { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
849         { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
850         { 34,158, 73, 83, 26, 28, 36,  7, 35,"Drop Bomb", BT_KEY, 255 },
851         { 35,158, 73,112, 26, 29, 37, 34,  8,"Drop Bomb", BT_KEY, 255 },
852         { 36,158, 85, 83, 26, 34, 44,  9, 37,"REAR VIEW", BT_KEY, 255 },
853         { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
854         { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
855         { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
856         { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
857         { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
858         { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
859         { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
860         { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
861         { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
862         { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
863         { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
864         { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
865         { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
866         { 50, 15,169, 71, 26, 48,  1, 53, 51,"Cycle Second", BT_KEY, 255 },
867         { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
868         { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
869         { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
870         { 54,158,171, 83, 26, 52, 25, 51, 55,"Energy->Shield", BT_KEY, 255 },
871         { 55,158,171,112, 26, 53,  0, 54,  0,"Energy->Shield", BT_KEY, 255 },
872 };
873 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
874         {  0, 25, 46, 85, 28, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
875         {  1, 25, 54, 85, 28,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
876         {  2, 25, 85, 85, 28, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
877         {  3, 25, 93, 85, 28,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
878         {  4, 25, 62, 85, 28,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
879         {  5,180, 46, 79, 28, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
880         {  6,180, 54, 79, 28,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
881         {  7,180, 62, 79, 28,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
882         {  8,180, 70, 79, 28,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
883         {  9,180, 78, 79, 28,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
884         { 10,180, 90, 79, 28,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
885         { 11,180, 98, 79, 28, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
886         { 12,180,106, 79, 28, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
887         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
888         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
889         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
890         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
891         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
892         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
893         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
894         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
895         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
896         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
897         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
898         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
899         { 25, 25,109, 85, 28,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
900         { 26, 25, 70, 85, 28,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
901         { 27, 25,117, 85, 28, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
902         { 28,180,114, 79, 28, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
903         { 29,180,122, 79, 28, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
904         { 30, 25,125, 85, 28, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
905 };
906 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
907         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
908         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
909         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
910         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
911         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
912         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
913         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
914         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
915         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
916         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
917         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
918         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
919         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
920         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
921         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
922         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
923         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
924         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
925         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
926         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
927         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
928         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
929         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
930         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
931         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
932         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
933         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
934         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
935         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
936         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
937         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
938 };
939
940 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
941         {  0, 25, 46, 85, 26, 28,  1, 28,  5,"Fire primary", BT_MOUSE_BUTTON, 255 },
942         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
943         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
944         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
945         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_MOUSE_BUTTON, 255 },
946         {  5,180, 46, 59, 26, 24,  6,  0,  1,"Slide on", BT_MOUSE_BUTTON, 255 },
947         {  6,180, 54, 59, 26,  5,  7,  1,  4,"Slide left", BT_MOUSE_BUTTON, 255 },
948         {  7,180, 62, 59, 26,  6,  8,  4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
949         {  8,180, 70, 59, 26,  7,  9, 26,  9,"Slide up", BT_MOUSE_BUTTON, 255 },
950         {  9,180, 78, 59, 26,  8, 10,  8,  2,"Slide down", BT_MOUSE_BUTTON, 255 },
951         { 10,180, 90, 59, 26,  9, 11,  2,  3,"Bank on", BT_MOUSE_BUTTON, 255 },
952         { 11,180, 98, 59, 26, 10, 12,  3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
953         { 12,180,106, 59, 26, 11, 28, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
954         { 13,103,138, 58, 26, 27, 15, 27, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
955         { 14,103,138,106,  8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
956         { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
957         { 16,103,146,106,  8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
958         { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
959         { 18,103,154,106,  8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
960         { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
961         { 20,103,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
962         { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
963         { 22,103,170,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
964         { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
965         { 24,103,182,106,  8, 22,  5, 23, 28,"throttle", BT_INVERT, 255 },
966         { 25, 25,109, 85, 26,  3, 27, 12, 27,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
967         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
968         { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
969 };
970
971 #endif
972
973 //added on 2/4/99 by Victor Rachels to add new keys system
974 ubyte default_kconfig_d2x_settings[MAX_D2X_CONTROLS] = {
975  0x2 ,0xff,0x3 ,0xff,0x4 ,0xff,0x5 ,0xff,0x6 ,0xff,0x7 ,0xff,0x8 ,0xff,0x9 ,
976  0xff,0xa ,0xff,0xb ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
977  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
978 //end this section addition - VR
979
980 void kc_drawitem( kc_item *item, int is_current );
981 void kc_change_key( kc_item * item );
982 void kc_change_joybutton( kc_item * item );
983 void kc_change_mousebutton( kc_item * item );
984 void kc_change_joyaxis( kc_item * item );
985 void kc_change_mouseaxis( kc_item * item );
986 void kc_change_invert( kc_item * item );
987 void kconfig_read_fcs( int raw_axis );
988 void kconfig_set_fcs_button( int btn, int button );
989 void kconfig_read_external_controls( void );
990
991 int kconfig_is_axes_used(int axis)
992 {
993         int i;
994         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
995                 if (( kc_joystick[i].type == BT_JOY_AXIS ) && (kc_joystick[i].value == axis ))
996                         return 1;
997         }
998         return 0;
999 }
1000
1001 #ifdef TABLE_CREATION
1002 int find_item_at( kc_item * items, int nitems, int x, int y )
1003 {
1004         int i;
1005         
1006         for (i=0; i<nitems; i++ )       {
1007                 if ( ((items[i].x+items[i].w1)==x) && (items[i].y==y))
1008                         return i;
1009         }
1010         return -1;
1011 }
1012
1013 int find_next_item_up( kc_item * items, int nitems, int citem )
1014 {
1015         int x, y, i;
1016
1017         y = items[citem].y;
1018         x = items[citem].x+items[citem].w1;
1019         
1020         do {    
1021                 y--;
1022                 if ( y < 0 ) {
1023                         y = grd_curcanv->cv_bitmap.bm_h-1;
1024                         x--;
1025                         if ( x < 0 ) {
1026                                 x = grd_curcanv->cv_bitmap.bm_w-1;
1027                         }
1028                 }
1029                 i = find_item_at( items, nitems, x, y );
1030         } while ( i < 0 );
1031         
1032         return i;
1033 }
1034
1035 int find_next_item_down( kc_item * items, int nitems, int citem )
1036 {
1037         int x, y, i;
1038
1039         y = items[citem].y;
1040         x = items[citem].x+items[citem].w1;
1041         
1042         do {    
1043                 y++;
1044                 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1045                         y = 0;
1046                         x++;
1047                         if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1048                                 x = 0;
1049                         }
1050                 }
1051                 i = find_item_at( items, nitems, x, y );
1052         } while ( i < 0 );
1053         
1054         return i;
1055 }
1056
1057 int find_next_item_right( kc_item * items, int nitems, int citem )
1058 {
1059         int x, y, i;
1060
1061         y = items[citem].y;
1062         x = items[citem].x+items[citem].w1;
1063         
1064         do {    
1065                 x++;
1066                 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1067                         x = 0;
1068                         y++;
1069                         if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1070                                 y = 0;
1071                         }
1072                 }
1073                 i = find_item_at( items, nitems, x, y );
1074         } while ( i < 0 );
1075         
1076         return i;
1077 }
1078
1079 int find_next_item_left( kc_item * items, int nitems, int citem )
1080 {
1081         int x, y, i;
1082
1083         y = items[citem].y;
1084         x = items[citem].x+items[citem].w1;
1085         
1086         do {    
1087                 x--;
1088                 if ( x < 0 ) {
1089                         x = grd_curcanv->cv_bitmap.bm_w-1;
1090                         y--;
1091                         if ( y < 0 ) {
1092                                 y = grd_curcanv->cv_bitmap.bm_h-1;
1093                         }
1094                 }
1095                 i = find_item_at( items, nitems, x, y );
1096         } while ( i < 0 );
1097         
1098         return i;
1099 }
1100 #endif
1101
1102 #if defined(MACINTOSH) || defined(WINDOWS)
1103 int get_item_height(kc_item *item)
1104 {
1105         int w, h, aw;
1106         char btext[10];
1107
1108         if (item->value==255) {
1109                 sprintf( btext, "" );
1110         } else {
1111                 switch( item->type )    {
1112                         case BT_KEY:
1113                                 strncpy( btext, key_text[item->value], 10 ); break;
1114                         case BT_MOUSE_BUTTON:
1115                         #ifdef WINDOWS
1116                                 strncpy( btext, Text_string[mousebutton_text[item->value]], 10); break;
1117                         #else
1118                                 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1119                         #endif
1120                         case BT_MOUSE_AXIS:
1121                                 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1122                         case BT_JOY_BUTTON:
1123                                 if ( joybutton_text[item->value] !=-1 )
1124                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1125                                 else
1126                                         sprintf( btext, "BTN%d", item->value );
1127                                 break;
1128                         case BT_JOY_AXIS:
1129                                 strncpy( btext, Text_string[joyaxis_text[item->value]], 10 ); break;
1130                         case BT_INVERT:
1131                                 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1132                 }
1133         }
1134         gr_get_string_size(btext, &w, &h, &aw  );
1135
1136         return h;
1137 }
1138 #endif
1139
1140 void kconfig_sub(kc_item * items,int nitems, char * title)
1141 {
1142 WINDOS(
1143         dd_grs_canvas * save_canvas,
1144         grs_canvas * save_canvas
1145 );
1146         grs_font * save_font;
1147         int old_keyd_repeat;
1148         #if defined(MACINTOSH) || defined(WINDOWS) 
1149         int mouse_state, omouse_state, mx, my, x1, x2, y1, y2;
1150         int close_x, close_y, close_size;
1151         #endif
1152
1153         int i,k,ocitem,citem;
1154         int time_stopped = 0;
1155 WIN(char *old_bg_pcx);
1156
1157 WIN(old_bg_pcx = _SCRContext.bkg_filename);
1158 WIN(DEFINE_SCREEN(NULL));
1159
1160         All_items = items;
1161         Num_items = nitems;
1162
1163         if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) )
1164         {
1165                 time_stopped = 1;
1166                 stop_time();
1167         }
1168
1169 //      if (Config_control_type == CONTROL_WINJOYSTICK) {
1170 //              WINDOS(
1171 //                      joydefsw_win_joyselect(title2); title = title2,
1172 //                      Int3()
1173 //              );                                                                                              // Get Samir...
1174 //      }
1175
1176 WINDOS(
1177         save_canvas = dd_grd_curcanv,
1178         save_canvas = grd_curcanv
1179 );
1180
1181
1182 WINDOS(
1183         dd_gr_set_current_canvas(NULL),
1184         gr_set_current_canvas(NULL)
1185 );              
1186         save_font = grd_curcanv->cv_font;
1187
1188 #ifdef WINDOWS
1189 KConfigPaint:
1190 #endif
1191         game_flush_inputs();
1192         old_keyd_repeat = keyd_repeat;
1193         keyd_repeat = 1;
1194
1195         //gr_clear_canvas( BM_XRGB(0,0,0) );
1196
1197         nm_draw_background(0, 0, grd_curcanv->cv_bitmap.bm_w - 1, grd_curcanv->cv_bitmap.bm_h - 1);
1198    gr_palette_load (gr_palette);
1199
1200         grd_curcanv->cv_font = MEDIUM3_FONT;
1201
1202 WIN(DDGRLOCK(dd_grd_curcanv));  
1203         {
1204                 char * p;
1205                 p = strchr( title, '\n' );
1206                 if ( p ) *p = 32;
1207                 gr_string( 0x8000, LHY(8), title );
1208                 if ( p ) *p = '\n';
1209         }
1210
1211
1212 //      if ( items == kc_keyboard )     {
1213 //              gr_string( 0x8000, 8, "Keyboard" );
1214 //      } else if ( items == kc_joystick )      {
1215 //              gr_string( 0x8000, 8, "Joysticks" );
1216 //      } else if ( items == kc_mouse ) {
1217 //              gr_string( 0x8000, 8, "Mouse" );
1218 //      }
1219
1220 #if defined(MACINTOSH) || defined(WINDOWS)
1221         close_x = close_y = 15;
1222         close_size = 10;
1223         gr_setcolor( BM_XRGB(0, 0, 0) );
1224         gr_rect(close_x, close_y, close_x + close_size, close_y + close_size);
1225         gr_setcolor( BM_XRGB(21, 21, 21) );
1226         gr_rect( close_x + 2, close_y + 2, close_x + close_size - 2, close_y + close_size -2 );
1227 #endif
1228
1229         grd_curcanv->cv_font = GAME_FONT;
1230         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1231
1232         #ifndef MACINTOSH
1233         gr_string( 0x8000, LHY(20), TXT_KCONFIG_STRING_1 );
1234         #else
1235         gr_string( 0x8000, LHY(20), "Enter changes, ctrl-d deletes, ctrl-r resets defaults, ESC exits");
1236         #endif
1237         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1238         if ( items == kc_keyboard )     {
1239                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1240                 gr_setcolor( BM_XRGB(31,27,6) );
1241                 
1242                 gr_scanline( LHX(98), LHX(106), LHY(42) );
1243                 gr_scanline( LHX(120), LHX(128), LHY(42) );
1244                 gr_pixel( LHX(98), LHY(43) );                                           
1245                 gr_pixel( LHX(98), LHY(44) );                                           
1246                 gr_pixel( LHX(128), LHY(43) );                                          
1247                 gr_pixel( LHX(128), LHY(44) );                                          
1248                 
1249                 gr_string( LHX(109), LHY(40), "OR" );
1250
1251                 gr_scanline( LHX(253), LHX(261), LHY(42) );
1252                 gr_scanline( LHX(274), LHX(283), LHY(42) );
1253                 gr_pixel( LHX(253), LHY(43) );                                          
1254                 gr_pixel( LHX(253), LHY(44) );                                          
1255                 gr_pixel( LHX(283), LHY(43) );                                          
1256                 gr_pixel( LHX(283), LHY(44) );                                          
1257
1258                 gr_string( LHX(264), LHY(40), "OR" );
1259
1260         } if ( items == kc_joystick )   {
1261                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1262                 gr_setcolor( BM_XRGB(31,27,6) );
1263                 gr_scanline( LHX(18), LHX(135), LHY(37) );
1264                 gr_scanline( LHX(181), LHX(294), LHY(37) );
1265                 gr_scanline( LHX(18), LHX(144), LHY(119+18) );
1266                 gr_scanline( LHX(174), LHX(294), LHY(119+18) );
1267                 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1268                 gr_string( 0x8000,LHY(117+18), TXT_AXES );
1269                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1270                 gr_string( LHX(81), LHY(137+8), TXT_AXIS );
1271                 gr_string( LHX(111), LHY(137+8), TXT_INVERT );
1272                 gr_string( LHX(222), LHY(137+8), TXT_AXIS );
1273                 gr_string( LHX(252), LHY(137+8), TXT_INVERT );
1274         } else if ( items == kc_mouse ) {
1275                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1276                 gr_setcolor( BM_XRGB(31,27,6) );
1277                 gr_scanline( LHX(18), LHX(135), LHY(37) );
1278                 gr_scanline( LHX(181), LHX(294), LHY(37) );
1279                 gr_scanline( LHX(18), LHX(144), LHY(119+5) );
1280                 gr_scanline( LHX(174), LHX(294), LHY(119+5) );
1281                 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1282                 gr_string( 0x8000,LHY(117+5), TXT_AXES );
1283                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1284                 gr_string( LHX(169), LHY(129), TXT_AXIS );
1285                 gr_string( LHX(199), LHY(129), TXT_INVERT );
1286         }
1287 #ifdef D2X_KEYS
1288         else if ( items == kc_d2x )
1289         {
1290                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1291                 gr_setcolor( BM_XRGB(31,27,6) );
1292
1293                 gr_string(LHX( 94), LHY(40), "KB");
1294                 gr_string(LHX(121), LHY(40), "JOY");
1295         }
1296 #endif
1297
1298 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1299
1300         for (i=0; i<nitems; i++ )       {
1301                 kc_drawitem( &items[i], 0 );
1302         }
1303
1304         citem = 0;
1305         kc_drawitem( &items[citem], 1 );
1306         
1307         WIN(ShowCursorW());
1308         MAC(show_cursor();)
1309
1310 #if defined(MACINTOSH) || defined(WINDOWS) 
1311         mouse_state = omouse_state = 0;
1312 #endif
1313
1314         while(1)                {
1315         //      Windows addendum to allow for kconfig input.
1316         #ifdef WINDOWS
1317                 {
1318                         MSG msg;
1319
1320                         DoMessageStuff(&msg);
1321
1322                         if (_RedrawScreen) {
1323                                 _RedrawScreen = FALSE;
1324
1325                                 dd_gr_set_current_canvas(NULL); 
1326
1327                                 goto KConfigPaint;
1328                         }
1329
1330                         DDGRRESTORE;
1331                 }
1332         #endif
1333                 gr_update();
1334
1335                 //see if redbook song needs to be restarted
1336                 songs_check_redbook_repeat();
1337
1338                 k = key_inkey();
1339                 
1340 #if defined(MACINTOSH) || defined(WINDOWS)
1341                 omouse_state = mouse_state;
1342                 mouse_state = mouse_button_state(0);
1343 #endif
1344                 
1345                 if ( !time_stopped ) {
1346                         #ifdef NETWORK
1347                         if (multi_menu_poll() == -1)
1348                                 k = -2;
1349                         #endif
1350                 }
1351                 ocitem = citem;
1352                 switch( k )     {
1353                 case KEY_BACKSP:
1354                         Int3();
1355                         break;
1356                 MAC(case KEY_COMMAND+KEY_SHIFTED+KEY_3:)
1357                 case KEY_PRINT_SCREEN:
1358                         save_screen_shot(0);
1359                         break;                                                  
1360                 case KEY_CTRLED+KEY_D:
1361                         items[citem].value = 255;
1362                         kc_drawitem( &items[citem], 1 );
1363                         break;
1364                 case KEY_CTRLED+KEY_R:  
1365                         if ( items==kc_keyboard )       {
1366                                 for (i=0; i<NUM_KEY_CONTROLS; i++ )             {
1367                                         items[i].value=default_kconfig_settings[0][i];
1368                                         kc_drawitem( &items[i], 0 );
1369                                 }
1370 #ifdef D2X_KEYS
1371                         } else if ( items==kc_d2x ) {
1372                                 for(i=0;i<NUM_D2X_CONTROLS;i++)
1373                                 {
1374                                         items[i].value=default_kconfig_d2x_settings[i];
1375                                         kc_drawitem( &items[i], 0 );
1376                                 }
1377 #endif
1378                         } else {
1379                                 #ifdef MACINTOSH
1380                           // hack for firebire and mousestick default controls since I made
1381                           // them the same control type -- dumb dumb dumb
1382                                 if (joy_have_firebird())
1383                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1384                                                 items[i].value = default_firebird_settings[i];
1385                                                 kc_drawitem( &items[i], 0 );
1386                                         }
1387                                 else if (joy_have_mousestick())
1388                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1389                                                 items[i].value = default_mousestick_settings[i];
1390                                                 kc_drawitem( &items[i], 0 );
1391                                         }
1392                                 else
1393                                 #endif  // note link to above else
1394                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1395                                                 items[i].value = default_kconfig_settings[Config_control_type][i];
1396                                                 kc_drawitem( &items[i], 0 );
1397                                         }
1398                         }
1399                         kc_drawitem( &items[citem], 1 );
1400                         break;
1401                 case KEY_DELETE:
1402                         items[citem].value=255;
1403                         kc_drawitem( &items[citem], 1 );
1404                         break;
1405                 case KEY_UP:            
1406                 case KEY_PAD8:
1407 #ifdef TABLE_CREATION
1408                         if (items[citem].u==-1) items[citem].u=find_next_item_up( items,nitems, citem);
1409 #endif
1410                         citem = items[citem].u; 
1411                         break;
1412                 
1413                 case KEY_DOWN:  
1414                 case KEY_PAD2:
1415 #ifdef TABLE_CREATION
1416                         if (items[citem].d==-1) items[citem].d=find_next_item_down( items,nitems, citem);
1417 #endif
1418                         citem = items[citem].d; 
1419                         break;
1420                 case KEY_LEFT:  
1421                 case KEY_PAD4:
1422 #ifdef TABLE_CREATION
1423                         if (items[citem].l==-1) items[citem].l=find_next_item_left( items,nitems, citem);
1424 #endif
1425                         citem = items[citem].l; 
1426                         break;
1427                 case KEY_RIGHT:         
1428                 case KEY_PAD6:
1429 #ifdef TABLE_CREATION
1430                         if (items[citem].r==-1) items[citem].r=find_next_item_right( items,nitems, citem);
1431 #endif
1432                         citem = items[citem].r; 
1433                         break;
1434                 case KEY_ENTER: 
1435                 case KEY_PADENTER:      
1436                         switch( items[citem].type )     {
1437                         case BT_KEY:            kc_change_key( &items[citem] ); break;
1438                         case BT_MOUSE_BUTTON:   kc_change_mousebutton( &items[citem] ); break;
1439                         case BT_MOUSE_AXIS:     kc_change_mouseaxis( &items[citem] ); break;
1440                         case BT_JOY_BUTTON:     kc_change_joybutton( &items[citem] ); break;
1441                         case BT_JOY_AXIS:       kc_change_joyaxis( &items[citem] ); break;
1442                         case BT_INVERT:         kc_change_invert( &items[citem] ); break;
1443                         }
1444                         break;
1445                 case -2:        
1446                 case KEY_ESC:
1447                         grd_curcanv->cv_font    = save_font;
1448
1449                 WIN(DEFINE_SCREEN(old_bg_pcx));
1450
1451                 WINDOS(
1452                         dd_gr_set_current_canvas(save_canvas),
1453                         gr_set_current_canvas( save_canvas )
1454                 );                      
1455                         keyd_repeat = old_keyd_repeat;
1456                         game_flush_inputs();
1457                         WIN( HideCursorW());
1458                         MAC( hide_cursor(); )
1459                         if (time_stopped)
1460                                 start_time();
1461                         return;
1462 #ifdef TABLE_CREATION
1463                 case KEY_DEBUGGED+KEY_F12:      {
1464                         FILE * fp;
1465                         for (i=0; i<NUM_KEY_CONTROLS; i++ )     {
1466                                 kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i);
1467                                 kc_keyboard[i].d = find_next_item_down( kc_keyboard,NUM_KEY_CONTROLS, i);
1468                                 kc_keyboard[i].l = find_next_item_left( kc_keyboard,NUM_KEY_CONTROLS, i);
1469                                 kc_keyboard[i].r = find_next_item_right( kc_keyboard,NUM_KEY_CONTROLS, i);
1470                         }
1471                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1472                                 kc_joystick[i].u = find_next_item_up( kc_joystick,NUM_OTHER_CONTROLS, i);
1473                                 kc_joystick[i].d = find_next_item_down( kc_joystick,NUM_OTHER_CONTROLS, i);
1474                                 kc_joystick[i].l = find_next_item_left( kc_joystick,NUM_OTHER_CONTROLS, i);
1475                                 kc_joystick[i].r = find_next_item_right( kc_joystick,NUM_OTHER_CONTROLS, i);
1476                         }
1477                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1478                                 kc_mouse[i].u = find_next_item_up( kc_mouse,NUM_OTHER_CONTROLS, i);
1479                                 kc_mouse[i].d = find_next_item_down( kc_mouse,NUM_OTHER_CONTROLS, i);
1480                                 kc_mouse[i].l = find_next_item_left( kc_mouse,NUM_OTHER_CONTROLS, i);
1481                                 kc_mouse[i].r = find_next_item_right( kc_mouse,NUM_OTHER_CONTROLS, i);
1482                         }
1483                         fp = fopen( "kconfig.cod", "wt" );
1484
1485                         fprintf( fp, "ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {\n" );
1486                         for (i=0; i<CONTROL_MAX_TYPES; i++ )    {
1487                                 int j;
1488                                 fprintf( fp, "{0x%x", kconfig_settings[i][0] );
1489                                 for (j=1; j<MAX_CONTROLS; j++ )
1490                                         fprintf( fp, ",0x%x", kconfig_settings[i][j] );
1491                                 fprintf( fp, "},\n" );
1492                         }
1493                         fprintf( fp, "};\n" );
1494                 
1495                         fprintf( fp, "\nkc_item kc_keyboard[NUM_KEY_CONTROLS] = {\n" );
1496                         for (i=0; i<NUM_KEY_CONTROLS; i++ )     {
1497                                 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1498                                         kc_keyboard[i].id, kc_keyboard[i].x, kc_keyboard[i].y, kc_keyboard[i].w1, kc_keyboard[i].w2,
1499                                         kc_keyboard[i].u, kc_keyboard[i].d, kc_keyboard[i].l, kc_keyboard[i].r,
1500                                         34, kc_keyboard[i].text, 34, btype_text[kc_keyboard[i].type] );
1501                         }
1502                         fprintf( fp, "};" );
1503
1504                         fprintf( fp, "\nkc_item kc_joystick[NUM_OTHER_CONTROLS] = {\n" );
1505                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1506                                 if (kc_joystick[i].type == BT_JOY_BUTTON)
1507                                         fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1508                                                 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1509                                                 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1510                                                 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1511                 else
1512                                         fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1513                                                 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1514                                                 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1515                                                 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1516                         }
1517                         fprintf( fp, "};" );
1518
1519                         fprintf( fp, "\nkc_item kc_mouse[NUM_OTHER_CONTROLS] = {\n" );
1520                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1521                                 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1522                                         kc_mouse[i].id, kc_mouse[i].x, kc_mouse[i].y, kc_mouse[i].w1, kc_mouse[i].w2,
1523                                         kc_mouse[i].u, kc_mouse[i].d, kc_mouse[i].l, kc_mouse[i].r,
1524                                         34, kc_mouse[i].text, 34, btype_text[kc_mouse[i].type] );
1525                         }
1526                         fprintf( fp, "};" );
1527
1528                         fclose(fp);
1529
1530                         }
1531                         break;
1532 #endif
1533                 }
1534
1535         #if defined (MACINTOSH) || defined(WINDOWS)
1536                 if ( (mouse_state && !omouse_state) || (mouse_state && omouse_state) ) {
1537                         int item_height;
1538                         
1539                         mouse_get_pos(&mx, &my);
1540                         for (i=0; i<nitems; i++ )       {
1541                                 item_height = get_item_height( &items[i] );
1542                                 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[i].x) + LHX(items[i].w1);
1543                                 x2 = x1 + LHX(items[i].w2);
1544                                 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[i].y);
1545                                 y2 = y1 + LHX(item_height);
1546                                 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1547                                         citem = i;
1548                                         break;
1549                                 }
1550                         }
1551                 }
1552                 else if ( !mouse_state && omouse_state ) {
1553                         int item_height;
1554                         
1555                         mouse_get_pos(&mx, &my);
1556                         item_height = get_item_height( &items[citem] );
1557                         x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[citem].x) + LHX(items[citem].w1);
1558                         x2 = x1 + LHX(items[citem].w2);
1559                         y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[citem].y);
1560                         y2 = y1 + LHY(item_height);
1561                         if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1562                                 WIN(HideCursorW());
1563                                 MAC(hide_cursor();)
1564                                 switch( items[citem].type )     {
1565                                 case BT_KEY:                            kc_change_key( &items[citem] ); break;
1566                                 case BT_MOUSE_BUTTON:   kc_change_mousebutton( &items[citem] ); break;
1567                                 case BT_MOUSE_AXIS:             kc_change_mouseaxis( &items[citem] ); break;
1568                                 case BT_JOY_BUTTON:             kc_change_joybutton( &items[citem] ); break;
1569                                 case BT_JOY_AXIS:               kc_change_joyaxis( &items[citem] ); break;
1570                                 case BT_INVERT:                         kc_change_invert( &items[citem] ); break;
1571                                 }
1572                                 MAC(show_cursor();)
1573                                 WIN(ShowCursorW());
1574                         } else {
1575                                 x1 = grd_curcanv->cv_bitmap.bm_x + close_x + 2;
1576                                 x2 = x1 + close_size - 2;
1577                                 y1 = grd_curcanv->cv_bitmap.bm_y + close_y + 2;
1578                                 y2 = y1 + close_size - 2;
1579                                 if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
1580                                         grd_curcanv->cv_font    = save_font;
1581                                         WINDOS(dd_gr_set_current_canvas( save_canvas ),
1582                                                         gr_set_current_canvas( save_canvas ));
1583                                         keyd_repeat = old_keyd_repeat;
1584                                         game_flush_inputs();
1585                                         WIN(HideCursorW());
1586                                         MAC(hide_cursor();)
1587                                         if (time_stopped)
1588                                                 start_time();
1589                                         return;
1590                                 }
1591                         }
1592
1593                 }
1594                 #endif          // MACINTOSH WINDOWS
1595                 
1596                 if (ocitem!=citem)      {
1597                         MAC(hide_cursor();)
1598                         WIN(HideCursorW());
1599                         kc_drawitem( &items[ocitem], 0 );
1600                         kc_drawitem( &items[citem], 1 );
1601                         WIN(ShowCursorW());
1602                         MAC(show_cursor();)
1603                 }
1604         }
1605 }
1606
1607
1608 void kc_drawitem( kc_item *item, int is_current )
1609 {
1610         int x, w, h, aw;
1611         char btext[16];
1612 //      PA_DFX (pa_set_frontbuffer_current());
1613 WIN(DDGRLOCK(dd_grd_curcanv));
1614
1615         if (is_current)
1616                 gr_set_fontcolor( BM_XRGB(20,20,29), -1 );
1617         else
1618                 gr_set_fontcolor( BM_XRGB(15,15,24), -1 );
1619    gr_string( LHX(item->x), LHY(item->y), item->text );
1620 WIN(DDGRUNLOCK(dd_grd_curcanv));
1621
1622         if (item->value==255) {
1623                 strcpy( btext, "" );
1624         } else {
1625                 switch( item->type )    {
1626                         case BT_KEY:
1627                                 strncpy( btext, key_text[item->value], 10 ); break;
1628                         case BT_MOUSE_BUTTON:
1629                                 #ifndef MACINTOSH
1630                                 //strncpy( btext, Text_string[mousebutton_text[item->value]], 10 ); break;
1631                                 strncpy( btext, (item->value <= 3)?Text_string[mousebutton_text[item->value]]:mousebutton_textra[item->value-3], 10 ); break;
1632                                 #else
1633                                 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1634                                 #endif
1635                         case BT_MOUSE_AXIS:
1636                                 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1637                         case BT_JOY_BUTTON:
1638 #ifndef MACINTOSH
1639         #ifdef WINDOWS
1640                                 if (joybutton_text[item->value] != -1) 
1641                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1642                                 else 
1643                                         sprintf( btext, "BTN%2d", item->value+1 );
1644         #else   
1645                                 if ( joybutton_text[item->value] !=-1 )
1646                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1647                                 else
1648                                         sprintf( btext, "BTN%d", item->value );
1649         #endif
1650 #else
1651                                 strncpy( btext, joy_btn_name( item->value ), 10);
1652                                 if (btext == NULL)
1653                                         sprintf( btext, "BTN%d", item->value );
1654 #endif
1655                                 break;
1656                         case BT_JOY_AXIS:
1657                                 strncpy( btext, Text_string[joyaxis_text[item->value]], 10 ); break;
1658                         case BT_INVERT:
1659                                 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1660                 }
1661         }
1662         if (item->w1) {
1663         WIN(DDGRLOCK(dd_grd_curcanv));
1664                 gr_get_string_size(btext, &w, &h, &aw  );
1665
1666                 if (is_current)
1667                         gr_setcolor( BM_XRGB(21,0,24) );
1668                 else
1669                         gr_setcolor( BM_XRGB(16,0,19) );
1670                 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1671                 
1672                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1673
1674                 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1675         
1676                 gr_string( x, LHY(item->y), btext );
1677 //              PA_DFX (pa_set_backbuffer_current());
1678
1679         WIN(DDGRUNLOCK(dd_grd_curcanv));
1680         }
1681 }
1682
1683
1684 static int looper=0;
1685
1686 void kc_drawquestion( kc_item *item )
1687 {
1688         int c, x, w, h, aw;
1689
1690 WIN(DDGRLOCK(dd_grd_curcanv));  
1691   // PA_DFX (pa_set_frontbuffer_current());
1692
1693         gr_get_string_size("?", &w, &h, &aw  );
1694
1695         c = BM_XRGB(21,0,24);
1696
1697         //@@gr_setcolor( gr_fade_table[fades[looper]*256+c] );
1698         gr_setcolor(BM_XRGB(21*fades[looper]/31,0,24*fades[looper]/31));
1699         looper++;
1700         if (looper>63) looper=0;
1701
1702         gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1703         
1704         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1705
1706         x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1707    
1708         gr_string( x, LHY(item->y), "?" );
1709 //      PA_DFX (pa_set_backbuffer_current());
1710 WIN(DDGRUNLOCK(dd_grd_curcanv));
1711 gr_update();
1712 }
1713
1714 void kc_change_key( kc_item * item )
1715 {
1716         int i,n,f,k;
1717         ubyte keycode;
1718
1719 WIN(DDGRLOCK(dd_grd_curcanv));
1720         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1721         
1722         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_KEY );
1723 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1724
1725         game_flush_inputs();
1726         keycode=255;
1727         k=255;
1728         
1729         while( (k!=KEY_ESC) && (keycode==255) ) 
1730         {                               
1731         #ifdef WINDOWS
1732                 {
1733                         MSG msg;
1734
1735                         DoMessageStuff(&msg);
1736                         DDGRRESTORE;
1737                 
1738                 }
1739         #endif
1740
1741                 #ifdef NETWORK
1742                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1743                         multi_menu_poll();
1744                 #endif
1745 //              if ( Game_mode & GM_MULTI )
1746 //                      GameLoop( 0, 0 );                               // Continue
1747                 k = key_inkey();
1748                 timer_delay(f0_1/10);
1749                 kc_drawquestion( item );
1750         
1751                 for (i=0; i<256; i++ )  {
1752                         if (keyd_pressed[i] && (strlen(key_text[i])>0)) {
1753                                 f = 0;
1754                                 for (n=0; n<sizeof(system_keys); n++ )
1755                                         if ( system_keys[n] == i )
1756                                                 f=1;
1757                                 if (!f) 
1758                                         keycode=i;
1759                         }
1760                 }
1761         }
1762
1763         if (k!=KEY_ESC) {
1764                 for (i=0; i<Num_items; i++ )    {
1765                         n = item - All_items;
1766                         if ( (i!=n) && (All_items[i].type==BT_KEY) && (All_items[i].value==keycode) )           {
1767                                 All_items[i].value = 255;
1768                                 kc_drawitem( &All_items[i], 0 );
1769                         }
1770                 }
1771                 item->value = keycode;
1772         }
1773         kc_drawitem( item, 1 );
1774
1775 WIN(DDGRLOCK(dd_grd_curcanv));
1776         gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) );
1777 WIN(DDGRUNLOCK(dd_grd_curcanv));
1778
1779         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1780
1781         game_flush_inputs();
1782
1783 }
1784
1785 void kc_change_joybutton( kc_item * item )
1786 {
1787         int n,i,k;
1788         ubyte code;
1789
1790 WIN(DDGRLOCK(dd_grd_curcanv));
1791         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1792         
1793         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_JBUTTON );
1794 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1795
1796         game_flush_inputs();
1797         code=255;
1798         k=255;
1799         
1800         while( (k!=KEY_ESC) && (code==255))     
1801         {                               
1802         #ifdef WINDOWS
1803                 {
1804                         MSG msg;
1805                         DoMessageStuff(&msg);
1806                         DDGRRESTORE;
1807                 }
1808         #endif
1809
1810                 #ifdef NETWORK
1811                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1812                         multi_menu_poll();
1813                 #endif
1814 //              if ( Game_mode & GM_MULTI )
1815 //                      GameLoop( 0, 0 );                               // Continue
1816                 k = key_inkey();
1817                 timer_delay(f0_1/10);
1818
1819                 if (k == KEY_PRINT_SCREEN)
1820                         save_screen_shot(0);
1821
1822                 kc_drawquestion( item );
1823
1824                 WIN(code = joydefsw_do_button());
1825                 
1826 #ifdef MACINTOSH
1827                 code = joy_do_buttons();
1828 #endif
1829                 
1830 #if !defined(WINDOWS) && !defined(MACINTOSH)
1831                 if (Config_control_type==CONTROL_THRUSTMASTER_FCS)      {
1832                         int axis[4];
1833                         joystick_read_raw_axis( JOY_ALL_AXIS, axis );
1834                         kconfig_read_fcs( axis[3] );
1835                         if ( joy_get_button_state(7) ) code = 7;
1836                         if ( joy_get_button_state(11) ) code = 11;
1837                         if ( joy_get_button_state(15) ) code = 15;
1838                         if ( joy_get_button_state(19) ) code = 19;
1839                         for (i=0; i<4; i++ )    {
1840                                 if ( joy_get_button_state(i) )
1841                                         code = i;
1842                         }
1843                 } else if (Config_control_type==CONTROL_FLIGHTSTICK_PRO) {
1844                         for (i=4; i<20; i++ )   {
1845                                 if ( joy_get_button_state(i)  ) {
1846                                         code = i;
1847                                         mprintf(( 0, "JB: %d\n", code ));
1848                                 }
1849                         }
1850                 } else {
1851                         for (i=0; i<MAX_BUTTONS; i++ )  {
1852                                 if ( joy_get_button_state(i) )
1853                                         code = i;
1854                         }
1855                 }
1856 #endif
1857         }
1858         if (code!=255)  {
1859                 for (i=0; i<Num_items; i++ )    {
1860                         n = item - All_items;
1861                         if ( (i!=n) && (All_items[i].type==BT_JOY_BUTTON) && (All_items[i].value==code) ) {
1862                                 All_items[i].value = 255;
1863                                 kc_drawitem( &All_items[i], 0 );
1864                         }
1865                 }
1866                 item->value = code;
1867         }
1868         kc_drawitem( item, 1 );
1869         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1870         game_flush_inputs();
1871 }
1872
1873 void kc_change_mousebutton( kc_item * item )
1874 {
1875         int n,i,b,k;
1876         ubyte code;
1877
1878 WIN(DDGRLOCK(dd_grd_curcanv));
1879         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1880         
1881         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_MBUTTON );
1882 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1883
1884
1885         game_flush_inputs();
1886         code=255;
1887         k=255;
1888         
1889         while( (k!=KEY_ESC) && (code==255))     
1890         {                               
1891         #ifdef WINDOWS
1892                 {
1893                         MSG msg;
1894                         DoMessageStuff(&msg);
1895                         DDGRRESTORE;
1896                 }
1897         #endif
1898
1899                 #ifdef NETWORK
1900                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1901                         multi_menu_poll();
1902                 #endif
1903 //              if ( Game_mode & GM_MULTI )
1904 //                      GameLoop( 0, 0 );                               // Continue
1905                 k = key_inkey();
1906                 timer_delay(f0_1/10);
1907
1908                 if (k == KEY_PRINT_SCREEN)
1909                         save_screen_shot(0);
1910
1911                 kc_drawquestion( item );
1912
1913                 b = mouse_get_btns();
1914                 for (i = 0; i < 16; i++ ) {
1915                         if ( b & (1<<i) )       
1916                                 code = i;
1917                 }
1918         }
1919         if (code!=255)  {
1920                 for (i=0; i<Num_items; i++ )    {
1921                         n = item - All_items;
1922                         if ( (i!=n) && (All_items[i].type==BT_MOUSE_BUTTON) && (All_items[i].value==code) )             {
1923                                 All_items[i].value = 255;
1924                                 kc_drawitem( &All_items[i], 0 );
1925                         }
1926                 }
1927                 item->value = code;
1928         }
1929         kc_drawitem( item, 1 );
1930         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1931         game_flush_inputs();
1932
1933 }
1934
1935 void kc_change_joyaxis( kc_item * item )
1936 {
1937 #ifdef __unix__
1938         int axis[MAX_AXES];
1939         int old_axis[MAX_AXES];
1940 #else
1941         int axis[JOY_NUM_AXES];
1942         int old_axis[JOY_NUM_AXES];
1943 #endif
1944         int n,i,k;
1945         ubyte code;
1946    WINDOS (
1947          int numaxis=7,
1948          int numaxis=6
1949         );
1950
1951 WIN(DDGRLOCK(dd_grd_curcanv));
1952         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1953         
1954         gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS );
1955 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1956
1957         game_flush_inputs();
1958         code=255;
1959         k=255;
1960
1961         WINDOS(
1962                 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, old_axis ),
1963                 joystick_read_raw_axis( JOY_ALL_AXIS, old_axis )
1964         );
1965
1966         while( (k!=KEY_ESC) && (code==255))     
1967         {                               
1968         #ifdef WINDOWS
1969                 {
1970                         MSG msg;
1971                         DoMessageStuff(&msg);
1972                         DDGRRESTORE;
1973                 }
1974         #endif
1975
1976                 #ifdef NETWORK
1977                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1978                         multi_menu_poll();
1979                 #endif
1980 //              if ( Game_mode & GM_MULTI )
1981 //                      GameLoop( 0, 0 );                               // Continue
1982                 k = key_inkey();
1983                 timer_delay(f0_1/10);
1984
1985                 if (k == KEY_PRINT_SCREEN)
1986                         save_screen_shot(0);
1987
1988                 kc_drawquestion( item );
1989
1990                 WINDOS(
1991                         joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, axis ),
1992                         joystick_read_raw_axis( JOY_ALL_AXIS, axis )
1993                 );
1994                 
1995                 for (i=0; i<numaxis; i++ )      {
1996 #if defined (MACINTOSH)
1997                         if ( abs(axis[i]-old_axis[i])>100 )     {
1998 #elif defined(WINDOWS)
1999                         if ( abs(axis[i]-old_axis[i])>1024 )    {
2000 #else 
2001                         if ( abs(axis[i]-old_axis[i])>200 )     {
2002 #endif
2003                                 code = i;
2004                                 con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i);
2005                         }
2006                         //old_axis[i] = axis[i];
2007                 }
2008                 for (i=0; i<Num_items; i++ )    
2009                  {
2010                         n = item - All_items;
2011                         if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) 
2012                                 code = 255;
2013                  }
2014         
2015         }
2016         if (code!=255)  {
2017                 for (i=0; i<Num_items; i++ )    {
2018                         n = item - All_items;
2019                         if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) {
2020                                 All_items[i].value = 255;
2021                                 kc_drawitem( &All_items[i], 0 );
2022                         }
2023                 }
2024
2025                 item->value = code;                                      
2026         }
2027         kc_drawitem( item, 1 );
2028         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2029         game_flush_inputs();
2030
2031 }
2032
2033 void kc_change_mouseaxis( kc_item * item )
2034 {
2035         int i,n,k;
2036         ubyte code;
2037         int dx,dy;
2038 #ifdef SDL_INPUT
2039         int dz;
2040 #endif
2041
2042 WIN(DDGRLOCK(dd_grd_curcanv));
2043         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
2044         
2045         gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS );
2046 WIN(DDGRUNLOCK(dd_grd_curcanv));        
2047
2048         game_flush_inputs();
2049         code=255;
2050         k=255;
2051
2052         mouse_get_delta( &dx, &dy );
2053
2054         while( (k!=KEY_ESC) && (code==255))     
2055         {                               
2056         #ifdef WINDOWS
2057                 {
2058                         MSG msg;
2059                         DoMessageStuff(&msg);
2060                         DDGRRESTORE;
2061                 }
2062         #endif
2063
2064                 #ifdef NETWORK
2065                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
2066                         multi_menu_poll();
2067                 #endif
2068 //              if ( Game_mode & GM_MULTI )
2069 //                      GameLoop( 0, 0 );                               // Continue
2070                 k = key_inkey();
2071                 timer_delay(f0_1/10);
2072
2073                 if (k == KEY_PRINT_SCREEN)
2074                         save_screen_shot(0);
2075
2076                 kc_drawquestion( item );
2077
2078 #ifdef SDL_INPUT
2079                 mouse_get_delta_z( &dx, &dy, &dz );
2080 #else
2081                 mouse_get_delta( &dx, &dy );
2082 #endif
2083                 if ( abs(dx)>20 ) code = 0;
2084                 if ( abs(dy)>20 ) code = 1;
2085 #ifdef SDL_INPUT
2086                 if ( abs(dz)>20 ) code = 2;
2087 #endif
2088         }
2089         if (code!=255)  {
2090                 for (i=0; i<Num_items; i++ )    {
2091                         n = item - All_items;
2092                         if ( (i!=n) && (All_items[i].type==BT_MOUSE_AXIS) && (All_items[i].value==code) )               {
2093                                 All_items[i].value = 255;
2094                                 kc_drawitem( &All_items[i], 0 );
2095                         }
2096                 }
2097                 item->value = code;
2098         }
2099         kc_drawitem( item, 1 );
2100         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2101         game_flush_inputs();
2102
2103 }
2104
2105
2106 void kc_change_invert( kc_item * item )
2107 {
2108         game_flush_inputs();
2109
2110         if (item->value)
2111                 item->value = 0;
2112         else 
2113                 item->value = 1;
2114
2115         kc_drawitem( item, 1 );
2116
2117 }
2118
2119 #include "screens.h"
2120
2121 void kconfig(int n, char * title)
2122 {
2123         int i;
2124         grs_bitmap *save_bm;
2125
2126         set_screen_mode( SCREEN_MENU );
2127
2128         kc_set_controls();
2129
2130         //save screen
2131         WIN(mouse_set_mode(0));
2132         WIN(dd_gr_set_current_canvas(NULL));
2133         
2134 #if defined(POLY_ACC)
2135         save_bm = gr_create_bitmap2( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h, grd_curcanv->cv_bitmap.bm_type, NULL );
2136 #else
2137         save_bm = gr_create_bitmap( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
2138 #endif
2139         Assert( save_bm != NULL );
2140         
2141         WIN(DDGRLOCK(dd_grd_curcanv));
2142                 gr_bm_bitblt(grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_w, 
2143                                                  0, 0, 0, 0, &grd_curcanv->cv_bitmap, save_bm );
2144         WIN(DDGRUNLOCK(dd_grd_curcanv));
2145
2146         switch(n)       {
2147         case 0:kconfig_sub( kc_keyboard, NUM_KEY_CONTROLS, title );break;
2148         case 1:kconfig_sub( kc_joystick, NUM_OTHER_CONTROLS, title );break;
2149         case 2:kconfig_sub( kc_mouse, NUM_OTHER_CONTROLS, title ); break;
2150         case 3:kconfig_sub( kc_superjoy, NUM_OTHER_CONTROLS, title); break;
2151 #ifdef D2X_KEYS
2152         //added on 2/4/99 by Victor Rachels for new keys menu
2153         case 4:kconfig_sub( kc_d2x, NUM_D2X_CONTROLS, title ); break;
2154         //end this section addition - VR
2155 #endif
2156         default:
2157                 Int3();
2158                 return;
2159         }
2160
2161         //restore screen
2162         WIN(mouse_set_mode(1));
2163         WIN(dd_gr_set_current_canvas(NULL));
2164         WIN(DDGRLOCK(dd_grd_curcanv));
2165                 gr_bitmap(0, 0, save_bm);
2166         WIN(DDGRUNLOCK(dd_grd_curcanv));
2167         gr_free_bitmap(save_bm);
2168
2169         reset_cockpit();                //force cockpit redraw next time
2170
2171         // Update save values...
2172         
2173         for (i=0; i<NUM_KEY_CONTROLS; i++ )     
2174                 kconfig_settings[0][i] = kc_keyboard[i].value;
2175
2176         if ( (Config_control_type>0) && (Config_control_type<5)) { 
2177                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
2178                         kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
2179         } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
2180                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
2181                         kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
2182         }
2183         else if (Config_control_type == CONTROL_WINJOYSTICK) {
2184                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
2185                         kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
2186         }
2187
2188 #ifdef D2X_KEYS
2189         for (i=0; i<NUM_D2X_CONTROLS; i++)
2190                 kconfig_d2x_settings[i] = kc_d2x[i].value;
2191 #endif
2192 }
2193
2194
2195 void kconfig_read_fcs( int raw_axis )
2196 {
2197         int raw_button, button, axis_min[4], axis_center[4], axis_max[4];
2198
2199         if (Config_control_type!=CONTROL_THRUSTMASTER_FCS) return;
2200
2201         joy_get_cal_vals(axis_min, axis_center, axis_max);
2202
2203         if ( axis_max[3] > 1 )
2204                 raw_button = (raw_axis*100)/axis_max[3];
2205         else
2206                 raw_button = 0;
2207
2208         if ( raw_button > 88 )
2209                 button = 0;
2210         else if ( raw_button > 63 )
2211                 button = 7;
2212         else if ( raw_button > 39 )
2213                 button = 11;
2214         else if ( raw_button > 15 )
2215                 button = 15;
2216         else    
2217                 button = 19;
2218
2219         kconfig_set_fcs_button( 19, button );
2220         kconfig_set_fcs_button( 15, button );
2221         kconfig_set_fcs_button( 11, button );
2222         kconfig_set_fcs_button( 7, button );
2223 }
2224                 
2225
2226 void kconfig_set_fcs_button( int btn, int button )
2227 {
2228         int state,time_down,upcount,downcount;
2229         state = time_down = upcount = downcount = 0;
2230
2231         if ( joy_get_button_state(btn) ) {
2232                 if ( btn==button )      {
2233                         state = 1;
2234                         time_down = FrameTime;
2235                 } else {
2236                         upcount=1;
2237                 }
2238         } else {
2239                 if ( btn==button )      {
2240                         state = 1;
2241                         time_down = FrameTime;
2242                         downcount=1;
2243                 } else {
2244                         upcount=1;
2245                 }
2246         }                               
2247                         
2248         joy_set_btn_values( btn, state, time_down, downcount, upcount );
2249                                         
2250 }
2251
2252
2253
2254 fix Last_angles_p = 0;
2255 fix Last_angles_b = 0;
2256 fix Last_angles_h = 0;
2257 ubyte Last_angles_read = 0;
2258
2259 extern int                      VR_sensitivity;
2260                                                 
2261 int VR_sense_range[3] = { 25, 50, 75 };
2262
2263 #if 0 //ndef MACINTOSH
2264 read_head_tracker()
2265 {
2266 #ifndef WINDOWS
2267
2268         fix yaw, pitch, roll;
2269         int buttons;
2270
2271 //------ read vfx1 helmet --------
2272         if (vfx1_installed) {
2273                 vfx_get_data(&yaw,&pitch,&roll,&buttons);
2274         } else if (iglasses_headset_installed)  {
2275                 iglasses_read_headset( &yaw, &pitch, &roll );
2276         } else if (Victor_headset_installed)   {
2277                 victor_read_headset_filtered( &yaw, &pitch, &roll );
2278         } else {
2279                 return;
2280         }
2281
2282         Use_player_head_angles = 0;
2283         if ( Last_angles_read ) {
2284                 fix yaw1 = yaw;
2285                 
2286                 yaw1 = yaw;
2287                 if ( (Last_angles_h < (F1_0/4) ) && (yaw > ((F1_0*3)/4) ) )     
2288                         yaw1 -= F1_0;
2289                 else if ( (yaw < (F1_0/4) ) && (Last_angles_h > ((F1_0*3)/4) ) )        
2290                         yaw1 += F1_0;
2291         
2292                 Controls.pitch_time     += fixmul((pitch- Last_angles_p)*VR_sense_range[VR_sensitivity],FrameTime);
2293                 Controls.heading_time+= fixmul((yaw1 -  Last_angles_h)*VR_sense_range[VR_sensitivity],FrameTime);
2294                 Controls.bank_time      += fixmul((roll - Last_angles_b)*VR_sense_range[VR_sensitivity],FrameTime);
2295         }
2296         Last_angles_read = 1;
2297         Last_angles_p = pitch;
2298         Last_angles_h = yaw;
2299         Last_angles_b = roll;
2300 #endif
2301 }
2302 #endif
2303
2304 #define PH_SCALE        8
2305
2306 #ifdef WINDOWS
2307 #define JOYSTICK_READ_TIME      (F1_0/40)               //      Read joystick at 40 Hz.
2308 #else
2309 #define JOYSTICK_READ_TIME      (F1_0/10)               //      Read joystick at 10 Hz.
2310 #endif
2311
2312 fix     LastReadTime = 0;
2313
2314 fix     joy_axis[7];
2315
2316 ubyte                   kc_use_external_control = 0;
2317 ubyte                           kc_enable_external_control = 0;
2318 ubyte                   kc_external_intno = 0;
2319 ext_control_info        *kc_external_control = NULL;
2320 ubyte                           *kc_external_name = NULL;
2321 ubyte                           kc_external_version = 0;
2322 extern int Automap_active;
2323
2324 void kconfig_init_external_controls(int intno, int address)
2325 {
2326         int i;
2327         kc_external_intno = intno;
2328         kc_external_control     = (ext_control_info *)address;
2329         kc_use_external_control = 1;
2330         kc_enable_external_control  = 1;
2331
2332         i = FindArg ( "-xname" );
2333         if ( i )        
2334                 kc_external_name = Args[i+1];
2335         else
2336                 kc_external_name = "External Controller";
2337
2338    for (i=0;i<strlen (kc_external_name);i++)
2339     if (kc_external_name[i]=='_')
2340           kc_external_name[i]=' '; 
2341
2342         i = FindArg ( "-xver" );
2343         if ( i )
2344                 kc_external_version = atoi(Args[i+1]);
2345         
2346         printf( "%s int: 0x%x, data: 0x%p, ver:%d\n", kc_external_name, kc_external_intno, kc_external_control, kc_external_version );
2347
2348 }
2349
2350 #if !defined(MACINTOSH)
2351 /*void kconfig_read_external_controls()
2352 {
2353         union REGS r;
2354
2355         if ( !kc_enable_external_control && !CybermouseActive) 
2356                 return;
2357
2358         if ( kc_external_version == 0 ) 
2359                 memset( kc_external_control, 0, sizeof(control_info) );
2360         else if ( kc_external_version > 0 )     {
2361                 memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 );
2362                 if ( kc_external_version > 1 ) {
2363                         // Write ship pos and angles to external controls...
2364                         ubyte *temp_ptr = (ubyte *)kc_external_control;
2365                         vms_vector *ship_pos;
2366                         vms_matrix *ship_orient;
2367                         memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
2368                         temp_ptr += sizeof(control_info)+sizeof(vms_angvec) + 64;
2369                         ship_pos = (vms_vector *)temp_ptr;
2370                         temp_ptr += sizeof(vms_vector);
2371                         ship_orient = (vms_matrix *)temp_ptr;
2372                         // Fill in ship postion...
2373                         *ship_pos = Objects[Players[Player_num].objnum].pos;
2374                         // Fill in ship orientation...
2375                         *ship_orient = Objects[Players[Player_num].objnum].orient;
2376                 }
2377         }
2378
2379         if ( Automap_active )                    // (If in automap...)
2380                 kc_external_control->automap_state = 1;
2381         memset(&r,0,sizeof(r));
2382
2383 #ifndef WINDOWS
2384   
2385    if (!CybermouseActive)
2386         int386 ( kc_external_intno, &r, &r);            // Read external info...
2387 //      else
2388   //            ReadOWL (kc_external_control);
2389
2390 #endif
2391
2392         if ( Player_num > -1 )  {
2393                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL);    // Turn off roll when turning
2394                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING);   // Turn off leveling to nearest side.
2395                 Auto_leveling_on = 0;
2396
2397                 if ( kc_external_version > 0 ) {                
2398                         vms_matrix tempm, ViewMatrix;
2399                         vms_angvec * Kconfig_abs_movement;
2400                         char * oem_message;
2401         
2402                         Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
2403         
2404                         if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h )    {
2405                                 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
2406                                 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
2407                                 Objects[Players[Player_num].objnum].orient = ViewMatrix;                
2408                         }
2409                         oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
2410                         if (oem_message[0] != '\0' )
2411                                 HUD_init_message( oem_message );
2412                 }
2413         }
2414
2415         Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);                                               
2416         Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
2417         Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
2418         Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
2419         Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
2420         Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
2421         Controls.rear_view_down_count += kc_external_control->rear_view_down_count;     
2422         Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;     
2423         Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
2424         Controls.fire_primary_state |= kc_external_control->fire_primary_state;
2425         Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
2426         Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
2427         Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
2428         Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;     
2429         Controls.automap_down_count += kc_external_control->automap_down_count;
2430         Controls.automap_state |= kc_external_control->automap_state;
2431 } */
2432 #endif
2433
2434 #ifdef WINDOWS
2435 void controls_read_all_win()
2436 {
2437         int i;
2438         int slide_on, bank_on;
2439         int dx, dy;
2440         fix ctime;
2441         fix mouse_axis[2];
2442         int raw_joy_axis[7];
2443         int mouse_buttons;
2444         fix k0, k1, k2, k3, kp;
2445         fix k4, k5, k6, k7, kh;
2446         ubyte channel_masks;
2447         int use_mouse, use_joystick;
2448         int speed_factor=1;
2449
2450         if (Game_turbo_mode)
2451                 speed_factor = 2;
2452         
2453         {
2454                 fix temp = Controls.heading_time;
2455                 fix temp1 = Controls.pitch_time;
2456                 memset( &Controls, 0, sizeof(control_info) );
2457                 Controls.heading_time = temp;
2458                 Controls.pitch_time = temp1;
2459         }
2460         slide_on = 0;
2461         bank_on = 0;
2462
2463         ctime = timer_get_fixed_seconds();
2464
2465 //      DO JOYSTICK (X,Y,Z  R,U,V)
2466 //      ----------------------------------------------------------------------------
2467         if ( (LastReadTime + JOYSTICK_READ_TIME) > ctime ) {
2468                 if ((ctime < 0) && (LastReadTime > 0))
2469                         LastReadTime = ctime;
2470                 use_joystick=1;
2471         } else if ((Config_control_type==CONTROL_WINJOYSTICK)) {
2472                 LastReadTime = ctime;
2473                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, raw_joy_axis );
2474
2475                 for (i=0; i<7; i++ )    {
2476                         if (channel_masks&(1<<i))       {
2477                                 int joy_null_value = 28;
2478
2479                         // DO POV if joystick has a hat.
2480                         //      --------------------------------------------------------------------
2481                                 if (i == 3) {
2482                                         joydefsw_do_winjoybutton(raw_joy_axis);
2483                                 }
2484                                 else {
2485                                 // DO AXIS
2486                                 //      --------------------------------------------------------------------    
2487                                 //      mprintf((0, "(%d)=%d,", i, raw_joy_axis[i]));
2488                                         raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
2489                                 //      mprintf((0, "%d  ",raw_joy_axis[i]));
2490                                 //      if (i%2) mprintf((0,"\n"));
2491
2492         
2493                                         if (kc_superjoy[23].value==i)           // If this is the throttle
2494                                                 joy_null_value = 32;                            // Then use a larger dead-zone
2495         
2496                                         if (raw_joy_axis[i] > (joy_null_value-2)) 
2497                                                 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
2498                                         else if (raw_joy_axis[i] < -(joy_null_value+2))
2499                                                 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
2500                                         else
2501                                                 raw_joy_axis[i] = 0;
2502                                         joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
2503                                 }
2504                         } else {
2505                                 joy_axis[i] = 0;
2506                         }
2507                 }       
2508                 use_joystick=1;
2509
2510         } else {
2511                 for (i=0; i<6; i++ )
2512                         joy_axis[i] = 0;
2513                 use_joystick=0;
2514         }
2515
2516 //      DO MOUSE 
2517 //      ----------------------------------------------------------------------------
2518         if (Config_control_type==5) {
2519                 mouse_get_delta( &dx, &dy );
2520                 mouse_axis[0] = (dx*FrameTime)/35;
2521                 mouse_axis[1] = (dy*FrameTime)/25;
2522                 mouse_buttons = mouse_get_btns();
2523                 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
2524                 use_mouse=1;
2525    } else {
2526                 mouse_axis[0] = 0;
2527                 mouse_axis[1] = 0;
2528                 mouse_buttons = 0;
2529                 use_mouse=0;
2530         }
2531
2532 //------------- Read slide_on -------------
2533         
2534         // From keyboard...
2535         if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
2536         if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
2537         // From joystick...
2538         if ((use_joystick)&&(kc_superjoy[5].value<255)) slide_on |= joy_get_button_state( kc_superjoy[5].value );
2539         // From mouse...
2540         if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
2541
2542 //------------- Read bank_on ---------------
2543
2544         // From keyboard...
2545         if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
2546         if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
2547         // From joystick...
2548         if ( (use_joystick)&&(kc_superjoy[10].value < 255 )) bank_on |= joy_get_button_state( kc_superjoy[10].value );
2549         // From mouse...
2550         if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
2551
2552 //------------ Read pitch_time -----------
2553         if ( !slide_on )        {
2554                 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2555                 kp = 0;
2556                 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2;      // Divide by two since we want pitch to go slower
2557                 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
2558                 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
2559                 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
2560
2561                 // From keyboard...
2562                 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
2563                 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
2564                 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
2565                 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
2566
2567                 // From Cyberman...
2568                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2569                         kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
2570                         kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
2571                 }
2572         
2573                 if (kp == 0)
2574                         Controls.pitch_time = 0;
2575                 else if (kp > 0) {
2576                         if (Controls.pitch_time < 0)
2577                                 Controls.pitch_time = 0;
2578                 } else // kp < 0
2579                         if (Controls.pitch_time > 0)
2580                                 Controls.pitch_time = 0;
2581                 Controls.pitch_time += kp;
2582         
2583                 // From joystick...
2584                 if ( (use_joystick)&&(kc_superjoy[13].value < 255 ))    {
2585                         if ( !kc_superjoy[14].value )           // If not inverted...
2586                                 Controls.pitch_time -= (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2587                         else
2588                                 Controls.pitch_time += (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2589                 }
2590         
2591                 // From mouse...
2592                 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
2593                 if ( (use_mouse)&&(kc_mouse[13].value < 255) )  {
2594                         if ( !kc_mouse[14].value )              // If not inverted...
2595                                 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2596                         else
2597                                 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2598                 }
2599         } else {
2600                 Controls.pitch_time = 0;
2601         }
2602
2603
2604 //----------- Read vertical_thrust_time -----------------
2605
2606         if ( slide_on ) {
2607                 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
2608                 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
2609                 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
2610                 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
2611
2612                 // From keyboard...
2613                 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
2614                 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
2615                 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
2616                 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
2617
2618                 // From Cyberman...
2619                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2620                         Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
2621                         Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
2622                 }
2623         
2624                 // From joystick...
2625                 if ((use_joystick)&&( kc_superjoy[13].value < 255 ))    {
2626                         if ( !kc_superjoy[14].value )           // If not inverted...
2627                                 Controls.vertical_thrust_time += joy_axis[kc_superjoy[13].value];
2628                         else
2629                                 Controls.vertical_thrust_time -= joy_axis[kc_superjoy[13].value];
2630                 }
2631         
2632                 // From mouse...
2633                 if ( (use_mouse)&&(kc_mouse[13].value < 255 ))  {
2634                         if ( !kc_mouse[14].value )              // If not inverted...
2635                                 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
2636                         else
2637                                 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
2638                 }
2639         }
2640
2641         // From keyboard...
2642         if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
2643         if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
2644         if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
2645         if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
2646         
2647         // From joystick...
2648         if ((use_joystick)&&( kc_superjoy[19].value < 255 ))    {
2649                 if ( !kc_superjoy[20].value )           // If not inverted...
2650                         Controls.vertical_thrust_time += joy_axis[kc_superjoy[19].value];
2651                 else
2652                         Controls.vertical_thrust_time -= joy_axis[kc_superjoy[19].value];
2653         }
2654
2655         // From joystick buttons
2656         if ( (use_joystick)&&(kc_superjoy[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_superjoy[8].value );
2657         if ( (use_joystick)&&(kc_superjoy[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_superjoy[9].value );
2658
2659         // From mouse buttons
2660         if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
2661         if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
2662
2663         // From mouse...
2664         if ( (use_mouse)&&(kc_mouse[19].value < 255 ))  {
2665                 if ( !kc_mouse[20].value )              // If not inverted...
2666                         Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
2667                 else
2668                         Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
2669         }
2670
2671         // From Cyberman...
2672         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2673                 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
2674                 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
2675         }
2676
2677 //---------- Read heading_time -----------
2678
2679         if (!slide_on && !bank_on)      {
2680                 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2681                 kh = 0;
2682                 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
2683                 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
2684                 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
2685                 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
2686
2687                 // From keyboard...
2688                 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
2689                 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
2690                 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
2691                 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
2692
2693                 // From Cyberman...
2694                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2695                         kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
2696                         kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
2697                 }
2698         
2699                 if (kh == 0)
2700                         Controls.heading_time = 0;
2701                 else if (kh > 0) {
2702                         if (Controls.heading_time < 0)
2703                                 Controls.heading_time = 0;
2704                 } else // kh < 0
2705                         if (Controls.heading_time > 0)
2706                                 Controls.heading_time = 0;
2707                 Controls.heading_time += kh;
2708
2709                 // From joystick...
2710                 if ( (use_joystick)&&(kc_superjoy[15].value < 255 ))    {
2711                         if ( !kc_superjoy[16].value )           // If not inverted...
2712                                 Controls.heading_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2713                         else
2714                                 Controls.heading_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2715                 }
2716         
2717                 // From mouse...
2718                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
2719                         if ( !kc_mouse[16].value )              // If not inverted...
2720                                 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2721                         else
2722                                 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2723                 }
2724         } else {
2725                 Controls.heading_time = 0;
2726         }
2727
2728 //----------- Read sideways_thrust_time -----------------
2729
2730         if ( slide_on ) {
2731                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2732                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2733                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2734                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2735
2736                 // From keyboard...
2737                 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
2738                 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
2739                 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
2740                 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
2741         
2742                 // From joystick...
2743                 if ( (use_joystick)&&(kc_superjoy[15].value < 255 ))    {
2744                         if ( !kc_superjoy[16].value )           // If not inverted...
2745                                 Controls.sideways_thrust_time += joy_axis[kc_superjoy[15].value];
2746                         else
2747                                 Controls.sideways_thrust_time -= joy_axis[kc_superjoy[15].value];
2748                 }
2749                 
2750                 // From cyberman
2751                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2752                         Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
2753                         Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
2754                 }
2755         
2756                 // From mouse...
2757                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
2758                         if ( !kc_mouse[16].value )              // If not inverted...
2759                                 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
2760                         else
2761                                 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
2762                 }
2763         }
2764
2765         // From keyboard...
2766         if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
2767         if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
2768         if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
2769         if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
2770         
2771         // From joystick...
2772         if ( (use_joystick)&&(kc_superjoy[17].value < 255 ))    {
2773                 if ( !kc_superjoy[18].value )           // If not inverted...
2774                         Controls.sideways_thrust_time -= joy_axis[kc_superjoy[17].value];
2775                 else
2776                         Controls.sideways_thrust_time += joy_axis[kc_superjoy[17].value];
2777         }
2778
2779         // From joystick buttons
2780         if ( (use_joystick)&&(kc_superjoy[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_superjoy[6].value );
2781         if ( (use_joystick)&&(kc_superjoy[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_superjoy[7].value );
2782
2783         // From mouse buttons
2784         if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
2785         if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
2786
2787         // From mouse...
2788         if ( (use_mouse)&&(kc_mouse[17].value < 255 ))  {
2789                 if ( !kc_mouse[18].value )              // If not inverted...
2790                         Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
2791                 else
2792                         Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
2793         }
2794
2795 //----------- Read bank_time -----------------
2796
2797         if ( bank_on )  {
2798                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2799                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2800                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2801                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2802
2803                 // From keyboard...
2804                 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
2805                 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
2806                 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
2807                 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
2808
2809                 // From Cyberman...
2810                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2811                         Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
2812                         Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
2813                 }
2814
2815                 // From joystick...
2816                 if ( (use_joystick)&&(kc_superjoy[15].value < 255) )    {
2817                         if ( !kc_superjoy[16].value )           // If not inverted...
2818                                 Controls.bank_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2819                         else
2820                                 Controls.bank_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2821                 }
2822         
2823                 // From mouse...
2824                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
2825                         if ( !kc_mouse[16].value )              // If not inverted...
2826                                 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2827                         else
2828                                 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2829                 }
2830         }
2831
2832         // From keyboard...
2833         if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
2834         if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
2835         if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
2836         if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
2837
2838         // From joystick...
2839         if ( (use_joystick)&&(kc_superjoy[21].value < 255) )    {
2840                 if ( !kc_superjoy[22].value )           // If not inverted...
2841                         Controls.bank_time -= joy_axis[kc_superjoy[21].value];
2842                 else
2843                         Controls.bank_time += joy_axis[kc_superjoy[21].value];
2844         }
2845
2846         // From joystick buttons
2847         if ( (use_joystick)&&(kc_superjoy[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_superjoy[11].value );
2848         if ( (use_joystick)&&(kc_superjoy[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_superjoy[12].value );
2849
2850         // From mouse buttons
2851         if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
2852         if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
2853
2854         // From mouse...
2855         if ( (use_mouse)&&(kc_mouse[21].value < 255 ))  {
2856                 if ( !kc_mouse[22].value )              // If not inverted...
2857                         Controls.bank_time += mouse_axis[kc_mouse[21].value];
2858                 else
2859                         Controls.bank_time -= mouse_axis[kc_mouse[21].value];
2860         }
2861
2862         // From Cyberman
2863         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2864                 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
2865                 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
2866         }
2867
2868 //----------- Read forward_thrust_time -------------
2869
2870         // From keyboard...
2871         if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
2872         if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
2873         if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
2874         if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
2875
2876         // From joystick...
2877         if ( (use_joystick)&&(kc_superjoy[23].value < 255 ))    {
2878                 if ( !kc_superjoy[24].value )           // If not inverted...
2879                         Controls.forward_thrust_time -= joy_axis[kc_superjoy[23].value];
2880                 else
2881                         Controls.forward_thrust_time += joy_axis[kc_superjoy[23].value];
2882         }
2883
2884         // From joystick buttons
2885         if ( (use_joystick)&&(kc_superjoy[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_superjoy[2].value );
2886         if ( (use_joystick)&&(kc_superjoy[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_superjoy[3].value );
2887
2888         // From mouse...
2889         if ( (use_mouse)&&(kc_mouse[23].value < 255 ))  {
2890                 if ( !kc_mouse[24].value )              // If not inverted...
2891                         Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
2892                 else
2893                         Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
2894         }
2895
2896         // From mouse buttons
2897         if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
2898         if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
2899
2900 //----------- Read afterburner_state -------------
2901
2902         // From keyboard...
2903         if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
2904         if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
2905
2906         if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
2907
2908         if ( (use_joystick)&&(kc_superjoy[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_superjoy[27].value);
2909
2910 //-------Read headlight key--------------------------
2911         if (kc_keyboard[52].value < 255 )
2912                    Controls.headlight_count=key_down_count(kc_keyboard[52].value);
2913         if (kc_keyboard[53].value < 255 )
2914                    Controls.headlight_count=key_down_count(kc_keyboard[53].value);
2915                   if ((use_joystick)&&(kc_superjoy[30].value < 255 )) 
2916          Controls.headlight_count=joy_get_button_down_cnt(kc_superjoy[30].value);
2917                  
2918 //--------Read Cycle Primary Key------------------
2919
2920                   if (kc_keyboard[48].value<255)
2921                          Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
2922                   if (kc_keyboard[49].value<255)
2923                         Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
2924              if ((use_joystick)&&(kc_superjoy[28].value < 255 )) 
2925          Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_superjoy[28].value);
2926
2927 //--------Read Cycle Secondary Key------------------
2928
2929                   if (kc_keyboard[50].value<255)
2930                          Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
2931                   if (kc_keyboard[51].value<255)
2932                         Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
2933              if ((use_joystick)&&(kc_superjoy[29].value < 255 )) 
2934                         Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_superjoy[29].value);
2935
2936 //--------Read Toggle Bomb key----------------------
2937
2938                   if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
2939          {
2940           int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
2941
2942                          if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
2943                                   !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
2944                            {
2945                                  digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2946                                  HUD_init_message ("No bombs available!");
2947                                 }
2948                          else
2949                                 {       
2950                                  if (Players[Player_num].secondary_ammo[bomb]==0)
2951                                         {
2952                                          digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2953                                          HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
2954                                         }
2955                                   else
2956                                         {
2957                                Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
2958                                          digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
2959                                         }
2960                                 }
2961                         }
2962           
2963 //---------Read Energy->Shield key----------
2964
2965         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
2966                 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
2967         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
2968                 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
2969
2970 //----------- Read fire_primary_down_count
2971         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
2972         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
2973         if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_superjoy[0].value);
2974         if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
2975
2976 //----------- Read fire_primary_state
2977         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
2978         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
2979         if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_superjoy[0].value);
2980         if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
2981
2982 //----------- Read fire_secondary_down_count
2983         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
2984         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
2985         if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_superjoy[1].value);
2986         if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
2987
2988 //----------- Read fire_secondary_state
2989         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
2990         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
2991         if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_superjoy[1].value);
2992         if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
2993
2994 //----------- Read fire_flare_down_count
2995         if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
2996         if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
2997         if ((use_joystick)&&(kc_superjoy[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_superjoy[4].value);
2998         if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
2999
3000 //----------- Read drop_bomb_down_count
3001         if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
3002         if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
3003         if ((use_joystick)&&(kc_superjoy[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_superjoy[26].value);
3004         if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
3005
3006 //----------- Read rear_view_down_count
3007         if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
3008         if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
3009         if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_superjoy[25].value);
3010         if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
3011
3012 //----------- Read rear_view_down_state
3013         if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3014         if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3015         if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_superjoy[25].value);
3016         if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3017
3018 //----------- Read automap_down_count
3019         if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3020         if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3021
3022 //----------- Read automap_state
3023         if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3024         if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3025
3026 //----------- Read stupid-cruise-control-type of throttle.
3027         {
3028                 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3029                 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3030                 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3031                 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3032                 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3033                         Cruise_speed = 0;
3034                 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3035                         Cruise_speed = 0;
3036         
3037                 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3038                 if (Cruise_speed < 0 ) Cruise_speed = 0;
3039         
3040                 if (Controls.forward_thrust_time==0)
3041                         Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3042         }
3043
3044         //read_head_tracker();
3045
3046         // Read external controls
3047         if (kc_use_external_control || CybermouseActive)
3048                 kconfig_read_external_controls();
3049
3050 //----------- Clamp values between -FrameTime and FrameTime
3051         if (FrameTime > F1_0 )
3052                 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3053
3054         if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3055         if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3056         if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3057         if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3058         if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3059         if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3060 //      if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3061
3062         if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3063         if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3064         if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3065         if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3066         if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3067         if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3068 //      if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3069
3070
3071 //--------- Don't do anything if in debug mode
3072         #ifndef RELEASE
3073         if ( keyd_pressed[KEY_DELETE] ) {
3074                 memset( &Controls, 0, sizeof(control_info) );
3075         }
3076         #endif
3077 }
3078 #else
3079
3080
3081 fix Next_toggle_time[3]={0,0,0};
3082
3083 int allowed_to_toggle(int i)
3084 {
3085   //used for keeping tabs of when its ok to toggle headlight,primary,and secondary
3086  
3087         if (Next_toggle_time[i] > GameTime)
3088                 if (Next_toggle_time[i] < GameTime + (F1_0/8))  //      In case time is bogus, never wait > 1 second.
3089                         return 0;
3090
3091         Next_toggle_time[i] = GameTime + (F1_0/8);
3092
3093         return 1;
3094 }
3095
3096
3097 #ifdef D2X_KEYS
3098 //added on 2/7/99 by Victor Rachels for jostick state setting
3099 int d2x_joystick_ostate[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
3100 //end this section adition - VR
3101 #endif
3102
3103
3104 void controls_read_all()
3105 {
3106         int i;
3107         int slide_on, bank_on;
3108         int dx, dy;
3109 #ifdef SDL_INPUT
3110         int dz;
3111 #endif
3112         int idx, idy;
3113         fix ctime;
3114         fix mouse_axis[3] = {0,0,0};
3115 #ifdef __unix__
3116         int raw_joy_axis[MAX_AXES];
3117 #else
3118         int raw_joy_axis[JOY_NUM_AXES];
3119 #endif
3120         int mouse_buttons;
3121         fix k0, k1, k2, k3, kp;
3122         fix k4, k5, k6, k7, kh;
3123         ubyte channel_masks;
3124         int use_mouse, use_joystick;
3125         int speed_factor=1;
3126
3127         mouse_buttons=0;
3128         use_mouse=0;
3129
3130         if (Game_turbo_mode)
3131                 speed_factor = 2;
3132         
3133         {
3134                 fix temp = Controls.heading_time;
3135                 fix temp1 = Controls.pitch_time;
3136                 memset( &Controls, 0, sizeof(control_info) );
3137                 Controls.heading_time = temp;
3138                 Controls.pitch_time = temp1;
3139         }
3140         slide_on = 0;
3141         bank_on = 0;
3142
3143         ctime = timer_get_fixed_seconds();
3144
3145         //---------  Read Joystick -----------
3146 #ifndef MACINTOSH
3147         if ( (LastReadTime + JOYSTICK_READ_TIME > ctime) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) ) {
3148                 if ((ctime < 0) && (LastReadTime > 0))
3149                         LastReadTime = ctime;
3150                 use_joystick=1;
3151         } else if ((Config_control_type>0) && (Config_control_type<5) ) {
3152                 LastReadTime = ctime;
3153                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3154                 
3155                 for (i=0; i<6; i++ )    {
3156 #ifndef SDL_INPUT
3157                         if (channel_masks&(1<<i))       {
3158 #endif
3159                                 int joy_null_value = 10;
3160
3161                                 if ( (i==3) && (Config_control_type==CONTROL_THRUSTMASTER_FCS) )        {
3162                                         kconfig_read_fcs( raw_joy_axis[i] );
3163                                 } else {
3164                                         raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3165         
3166                                         if (kc_joystick[23].value==i)           // If this is the throttle
3167                                                 joy_null_value = 20;            // Then use a larger dead-zone
3168         
3169                                         if (raw_joy_axis[i] > joy_null_value) 
3170                                           raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3171                                         else if (raw_joy_axis[i] < -joy_null_value)
3172                                           raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3173                                         else
3174                                           raw_joy_axis[i] = 0;
3175                                         joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
3176                                 }
3177 #ifndef SDL_INPUT
3178                         } else {
3179                                 joy_axis[i] = 0;
3180                         }
3181 #endif
3182                 }       
3183                 use_joystick=1;
3184         } else {
3185                 for (i=0; i<4; i++ )
3186                         joy_axis[i] = 0;
3187                 use_joystick=0;
3188         }
3189 #else   // MACINTOSH
3190         //---------  Read Joystick -----------
3191         if ((Config_control_type>0) && (Config_control_type<5) ) {
3192                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3193                 for (i=0; i<4; i++ )    {
3194                         if (channel_masks&(1<<i))       {
3195                                 int joy_null_value = 10;
3196
3197                                 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3198
3199                                 if (kc_joystick[23].value==i)           // If this is the throttle
3200                                         joy_null_value = 20;                            // Then use a larger dead-zone
3201
3202                                 if (raw_joy_axis[i] > joy_null_value) 
3203                                         raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3204                                 else if (raw_joy_axis[i] < -joy_null_value)
3205                                         raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3206                                 else
3207                                         raw_joy_axis[i] = 0;
3208                                 joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
3209                         } else {
3210                                 joy_axis[i] = 0;
3211                         }
3212                 }       
3213                 use_joystick=1;
3214         } else {
3215                 for (i=0; i<4; i++ )
3216                         joy_axis[i] = 0;
3217                 use_joystick=0;
3218         }
3219 #endif          // ifndef MACINTOSH
3220
3221         if (Config_control_type==5 && !CybermouseActive) {
3222                 //---------  Read Mouse -----------
3223 #ifdef SDL_INPUT
3224                 mouse_get_delta_z( &dx, &dy, &dz );
3225 #else
3226                 mouse_get_delta( &dx, &dy );
3227 #endif
3228                 mouse_axis[0] = (dx*FrameTime)/35;
3229                 mouse_axis[1] = (dy*FrameTime)/25;
3230 #ifdef SDL_INPUT
3231                 mouse_axis[2] = (dz*FrameTime);
3232 #endif
3233                 mouse_buttons = mouse_get_btns();
3234                 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
3235                 use_mouse=1;
3236         } else if (Config_control_type==6 && !CybermouseActive) {
3237                 //---------  Read Cyberman -----------
3238                 mouse_get_cyberman_pos(&idx,&idy );
3239                 mouse_axis[0] = (idx*FrameTime)/128;
3240                 mouse_axis[1] = (idy*FrameTime)/128;
3241                 mouse_buttons = mouse_get_btns();
3242                 use_mouse=1;
3243         } else if (CybermouseActive) {
3244 //              ReadOWL (kc_external_control);
3245 //              CybermouseAdjust();
3246         } else {
3247                 mouse_axis[0] = 0;
3248                 mouse_axis[1] = 0;
3249                 mouse_buttons = 0;
3250                 use_mouse=0;
3251         }
3252
3253 #ifdef D2X_KEYS
3254         //added on 2/4/99 by Victor Rachels for d1x keys
3255         //--------- Read primary weapon select -------------
3256         //the following "if" added by WraithX to stop deadies from switchin weapons, 4/14/00
3257         if (!Player_is_dead)
3258         {
3259                 {
3260                         int d2x_joystick_state[10];
3261
3262                         for(i=0;i<10;i++)
3263                                 d2x_joystick_state[i] = joy_get_button_state(kc_d2x[i*2+1].value);
3264
3265
3266                         //----------------Weapon 1----------------
3267                         if(key_down_count(kc_d2x[0].value) ||
3268                            (joy_get_button_state(kc_d2x[1].value) &&
3269                                 (d2x_joystick_state[0]!=d2x_joystick_ostate[0]) ) )
3270                         {
3271                                 //int i, valu=0;
3272                                 do_weapon_select(0,0);
3273                                 /*
3274                                 for(i=MAX_PRIMARY_WEAPONS;i<MAX_PRIMARY_WEAPONS+NEWPRIMS;i++)
3275                                         if(primary_order[i]>primary_order[valu]&&player_has_weapon(i,0))
3276                                                 valu = i;
3277                                 LaserPowSelected = valu;
3278                                 */
3279                         }
3280                         //----------------Weapon 2----------------
3281                         if(key_down_count(kc_d2x[2].value) ||
3282                            (joy_get_button_state(kc_d2x[3].value) &&
3283                                 (d2x_joystick_state[1]!=d2x_joystick_ostate[1]) ) )
3284                                 do_weapon_select(1,0);
3285                         //----------------Weapon 3----------------
3286                         if(key_down_count(kc_d2x[4].value) ||
3287                            (joy_get_button_state(kc_d2x[5].value) &&
3288                                 (d2x_joystick_state[2]!=d2x_joystick_ostate[2]) ) )
3289                                 do_weapon_select(2,0);
3290                         //----------------Weapon 4----------------
3291                         if(key_down_count(kc_d2x[6].value) ||
3292                            (joy_get_button_state(kc_d2x[7].value) &&
3293                                 (d2x_joystick_state[3]!=d2x_joystick_ostate[3]) ) )
3294                                 do_weapon_select(3,0);
3295                         //----------------Weapon 5----------------
3296                         if(key_down_count(kc_d2x[8].value) ||
3297                            (joy_get_button_state(kc_d2x[9].value) &&
3298                                 (d2x_joystick_state[4]!=d2x_joystick_ostate[4]) ) )
3299                                 do_weapon_select(4,0);
3300  
3301                         //--------- Read secondary weapon select ----------
3302                         //----------------Weapon 6----------------
3303                         if(key_down_count(kc_d2x[10].value) ||
3304                            (joy_get_button_state(kc_d2x[11].value) &&
3305                                 (d2x_joystick_state[5]!=d2x_joystick_ostate[5]) ) )
3306                                 do_weapon_select(0,1);
3307                         //----------------Weapon 7----------------
3308                         if(key_down_count(kc_d2x[12].value) ||
3309                            (joy_get_button_state(kc_d2x[13].value) &&
3310                                 (d2x_joystick_state[6]!=d2x_joystick_ostate[6]) ) )
3311                                 do_weapon_select(1,1);
3312                         //----------------Weapon 8----------------
3313                         if(key_down_count(kc_d2x[14].value) ||
3314                            (joy_get_button_state(kc_d2x[15].value) &&
3315                                 (d2x_joystick_state[7]!=d2x_joystick_ostate[7]) ) )
3316                                 do_weapon_select(2,1);
3317                         //----------------Weapon 9----------------
3318                         if(key_down_count(kc_d2x[16].value) ||
3319                            (joy_get_button_state(kc_d2x[17].value) &&
3320                                 (d2x_joystick_state[8]!=d2x_joystick_ostate[8]) ) )
3321                                 do_weapon_select(3,1);
3322                         //----------------Weapon 0----------------
3323                         if(key_down_count(kc_d2x[18].value) ||
3324                            (joy_get_button_state(kc_d2x[19].value) &&
3325                                 (d2x_joystick_state[9]!=d2x_joystick_ostate[9]) ) )
3326                                 do_weapon_select(4,1);
3327                         memcpy(d2x_joystick_ostate,d2x_joystick_state,10*sizeof(int));
3328                 }
3329                 //end this section addition - VR
3330
3331
3332         }//end "if (!Player_is_dead)" - WraithX
3333 #endif
3334
3335
3336 //------------- Read slide_on -------------
3337         
3338         // From keyboard...
3339         if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
3340         if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
3341         // From joystick...
3342         if ((use_joystick)&&(kc_joystick[5].value<255)) slide_on |= joy_get_button_state( kc_joystick[5].value );
3343         // From mouse...
3344         if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
3345
3346 //------------- Read bank_on ---------------
3347
3348         // From keyboard...
3349         if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
3350         if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
3351         // From joystick...
3352         if ( (use_joystick)&&(kc_joystick[10].value < 255 )) bank_on |= joy_get_button_state( kc_joystick[10].value );
3353         // From mouse...
3354         if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
3355
3356 //------------ Read pitch_time -----------
3357         if ( !slide_on )        {
3358                 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3359                 kp = 0;
3360                 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2;      // Divide by two since we want pitch to go slower
3361                 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
3362                 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
3363                 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
3364
3365                 // From keyboard...
3366                 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
3367                 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
3368                 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
3369                 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
3370
3371                 // From Cyberman...
3372                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3373                         kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
3374                         kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
3375                 }
3376         
3377                 if (kp == 0)
3378                         Controls.pitch_time = 0;
3379                 else if (kp > 0) {
3380                         if (Controls.pitch_time < 0)
3381                                 Controls.pitch_time = 0;
3382                 } else // kp < 0
3383                         if (Controls.pitch_time > 0)
3384                                 Controls.pitch_time = 0;
3385                 Controls.pitch_time += kp;
3386         
3387                 // From joystick...
3388                 if ( (use_joystick)&&(kc_joystick[13].value < 255 ))    {
3389                         if ( !kc_joystick[14].value )           // If not inverted...
3390                                 Controls.pitch_time -= (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3391                         else
3392                                 Controls.pitch_time += (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3393                 }
3394         
3395                 // From mouse...
3396                 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
3397                 if ( (use_mouse)&&(kc_mouse[13].value < 255) )  {
3398                         if ( !kc_mouse[14].value )              // If not inverted...
3399                                 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3400                         else
3401                                 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3402                 }
3403         } else {
3404                 Controls.pitch_time = 0;
3405         }
3406
3407
3408 //----------- Read vertical_thrust_time -----------------
3409
3410         if ( slide_on ) {
3411                 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
3412                 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
3413                 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
3414                 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
3415
3416                 // From keyboard...
3417                 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
3418                 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
3419                 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
3420                 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
3421
3422                 // From Cyberman...
3423                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3424                         Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
3425                         Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
3426                 }
3427         
3428                 // From joystick...
3429                 if ((use_joystick)&&( kc_joystick[13].value < 255 ))    {
3430                         if ( !kc_joystick[14].value )           // If not inverted...
3431                                 Controls.vertical_thrust_time += joy_axis[kc_joystick[13].value];
3432                         else
3433                                 Controls.vertical_thrust_time -= joy_axis[kc_joystick[13].value];
3434                 }
3435         
3436                 // From mouse...
3437                 if ( (use_mouse)&&(kc_mouse[13].value < 255 ))  {
3438                         if ( !kc_mouse[14].value )              // If not inverted...
3439                                 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
3440                         else
3441                                 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
3442                 }
3443         }
3444
3445         // From keyboard...
3446         if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
3447         if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
3448         if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
3449         if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
3450         
3451         // From joystick...
3452         if ((use_joystick)&&( kc_joystick[19].value < 255 ))    {
3453                 if ( !kc_joystick[20].value )           // If not inverted...
3454                         Controls.vertical_thrust_time += joy_axis[kc_joystick[19].value];
3455                 else
3456                         Controls.vertical_thrust_time -= joy_axis[kc_joystick[19].value];
3457         }
3458
3459         // From joystick buttons
3460         if ( (use_joystick)&&(kc_joystick[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_joystick[8].value );
3461         if ( (use_joystick)&&(kc_joystick[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_joystick[9].value );
3462
3463         // From mouse buttons
3464         if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
3465         if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
3466
3467         // From mouse...
3468         if ( (use_mouse)&&(kc_mouse[19].value < 255 ))  {
3469                 if ( !kc_mouse[20].value )              // If not inverted...
3470                         Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
3471                 else
3472                         Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
3473         }
3474
3475         // From Cyberman...
3476         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3477                 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
3478                 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
3479         }
3480
3481 //---------- Read heading_time -----------
3482
3483         if (!slide_on && !bank_on)      {
3484                 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3485                 kh = 0;
3486                 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
3487                 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
3488                 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
3489                 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
3490
3491                 // From keyboard...
3492                 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
3493                 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
3494                 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
3495                 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
3496
3497                 // From Cyberman...
3498                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3499                         kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
3500                         kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
3501                 }
3502         
3503                 if (kh == 0)
3504                         Controls.heading_time = 0;
3505                 else if (kh > 0) {
3506                         if (Controls.heading_time < 0)
3507                                 Controls.heading_time = 0;
3508                 } else // kh < 0
3509                         if (Controls.heading_time > 0)
3510                                 Controls.heading_time = 0;
3511                 Controls.heading_time += kh;
3512
3513                 // From joystick...
3514                 if ( (use_joystick)&&(kc_joystick[15].value < 255 ))    {
3515                         if ( !kc_joystick[16].value )           // If not inverted...
3516                                 Controls.heading_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3517                         else
3518                                 Controls.heading_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3519                 }
3520         
3521                 // From mouse...
3522                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
3523                         if ( !kc_mouse[16].value )              // If not inverted...
3524                                 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3525                         else
3526                                 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3527                 }
3528         } else {
3529                 Controls.heading_time = 0;
3530         }
3531
3532 //----------- Read sideways_thrust_time -----------------
3533
3534         if ( slide_on ) {
3535                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3536                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3537                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3538                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3539
3540                 // From keyboard...
3541                 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
3542                 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
3543                 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
3544                 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
3545         
3546                 // From joystick...
3547                 if ( (use_joystick)&&(kc_joystick[15].value < 255 ))    {
3548                         if ( !kc_joystick[16].value )           // If not inverted...
3549                                 Controls.sideways_thrust_time += joy_axis[kc_joystick[15].value];
3550                         else
3551                                 Controls.sideways_thrust_time -= joy_axis[kc_joystick[15].value];
3552                 }
3553                 
3554                 // From cyberman
3555                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3556                         Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
3557                         Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
3558                 }
3559         
3560                 // From mouse...
3561                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
3562                         if ( !kc_mouse[16].value )              // If not inverted...
3563                                 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
3564                         else
3565                                 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
3566                 }
3567         }
3568
3569         // From keyboard...
3570         if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
3571         if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
3572         if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
3573         if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
3574         
3575         // From joystick...
3576         if ( (use_joystick)&&(kc_joystick[17].value < 255 ))    {
3577                 if ( !kc_joystick[18].value )           // If not inverted...
3578                         Controls.sideways_thrust_time -= joy_axis[kc_joystick[17].value];
3579                 else
3580                         Controls.sideways_thrust_time += joy_axis[kc_joystick[17].value];
3581         }
3582
3583         // From joystick buttons
3584         if ( (use_joystick)&&(kc_joystick[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_joystick[6].value );
3585         if ( (use_joystick)&&(kc_joystick[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_joystick[7].value );
3586
3587         // From mouse buttons
3588         if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
3589         if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
3590
3591         // From mouse...
3592         if ( (use_mouse)&&(kc_mouse[17].value < 255 ))  {
3593                 if ( !kc_mouse[18].value )              // If not inverted...
3594                         Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
3595                 else
3596                         Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
3597         }
3598
3599 //----------- Read bank_time -----------------
3600
3601         if ( bank_on )  {
3602                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3603                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3604                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3605                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3606
3607                 // From keyboard...
3608                 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
3609                 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
3610                 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
3611                 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
3612
3613                 // From Cyberman...
3614                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3615                         Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
3616                         Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
3617                 }
3618
3619                 // From joystick...
3620                 if ( (use_joystick)&&(kc_joystick[15].value < 255) )    {
3621                         if ( !kc_joystick[16].value )           // If not inverted...
3622                                 Controls.bank_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3623                         else
3624                                 Controls.bank_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3625                 }
3626         
3627                 // From mouse...
3628                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
3629                         if ( !kc_mouse[16].value )              // If not inverted...
3630                                 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3631                         else
3632                                 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3633                 }
3634         }
3635
3636         // From keyboard...
3637         if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
3638         if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
3639         if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
3640         if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
3641
3642         // From joystick...
3643         if ( (use_joystick)&&(kc_joystick[21].value < 255) )    {
3644                 if ( !kc_joystick[22].value )           // If not inverted...
3645                         Controls.bank_time -= joy_axis[kc_joystick[21].value];
3646                 else
3647                         Controls.bank_time += joy_axis[kc_joystick[21].value];
3648         }
3649
3650         // From joystick buttons
3651         if ( (use_joystick)&&(kc_joystick[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_joystick[11].value );
3652         if ( (use_joystick)&&(kc_joystick[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_joystick[12].value );
3653
3654         // From mouse buttons
3655         if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
3656         if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
3657
3658         // From mouse...
3659         if ( (use_mouse)&&(kc_mouse[21].value < 255 ))  {
3660                 if ( !kc_mouse[22].value )              // If not inverted...
3661                         Controls.bank_time += mouse_axis[kc_mouse[21].value];
3662                 else
3663                         Controls.bank_time -= mouse_axis[kc_mouse[21].value];
3664         }
3665
3666         // From Cyberman
3667         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3668                 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
3669                 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
3670         }
3671
3672 //----------- Read forward_thrust_time -------------
3673
3674         // From keyboard...
3675         if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
3676         if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
3677         if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
3678         if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
3679
3680         // From joystick...
3681         if ( (use_joystick)&&(kc_joystick[23].value < 255 ))    {
3682                 if ( !kc_joystick[24].value )           // If not inverted...
3683                         Controls.forward_thrust_time -= joy_axis[kc_joystick[23].value];
3684                 else
3685                         Controls.forward_thrust_time += joy_axis[kc_joystick[23].value];
3686         }
3687
3688         // From joystick buttons
3689         if ( (use_joystick)&&(kc_joystick[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_joystick[2].value );
3690         if ( (use_joystick)&&(kc_joystick[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_joystick[3].value );
3691
3692         // From mouse...
3693         if ( (use_mouse)&&(kc_mouse[23].value < 255 ))  {
3694                 if ( !kc_mouse[24].value )              // If not inverted...
3695                         Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
3696                 else
3697                         Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
3698         }
3699
3700         // From mouse buttons
3701         if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
3702         if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
3703
3704 //----------- Read afterburner_state -------------
3705
3706         // From keyboard...
3707         if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
3708         if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
3709
3710         if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
3711
3712         if ( (use_joystick)&&(kc_joystick[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_joystick[27].value);
3713
3714 //-------Read headlight key--------------------------
3715
3716         if (kc_keyboard[52].value < 255 )
3717                    Controls.headlight_count=key_down_count(kc_keyboard[52].value);
3718         if (kc_keyboard[53].value < 255 )
3719                    Controls.headlight_count+=key_down_count(kc_keyboard[53].value);
3720                   if ((use_joystick)&&(kc_joystick[30].value < 255 )) 
3721                Controls.headlight_count+=joy_get_button_down_cnt(kc_joystick[30].value);
3722
3723 //--------Read Cycle Primary Key------------------
3724
3725                   if (kc_keyboard[48].value<255)
3726                          Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
3727                   if (kc_keyboard[49].value<255)
3728                         Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
3729              if ((use_joystick)&&(kc_joystick[28].value < 255 )) 
3730          Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_joystick[28].value);
3731
3732
3733 //--------Read Cycle Secondary Key------------------
3734
3735                   if (kc_keyboard[50].value<255)
3736                          Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
3737                   if (kc_keyboard[51].value<255)
3738                         Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
3739              if ((use_joystick)&&(kc_joystick[29].value < 255 )) 
3740                         Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_joystick[29].value);
3741
3742 //--------Read Toggle Bomb key----------------------
3743
3744                   if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
3745          {
3746           int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
3747
3748                          if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
3749                                   !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
3750                            {
3751                                  digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3752                                  HUD_init_message ("No bombs available!");
3753                                 }
3754                          else
3755                                 {       
3756                                  if (Players[Player_num].secondary_ammo[bomb]==0)
3757                                         {
3758                                          digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3759                                          HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
3760                                         }
3761                                   else
3762                                         {
3763                                Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
3764                                          digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
3765                                         }
3766                                 }
3767                         }
3768           
3769 //---------Read Energy->Shield key----------
3770
3771         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
3772                 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
3773         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
3774                 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
3775
3776 //----------- Read fire_primary_down_count
3777         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
3778         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
3779         if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_joystick[0].value);
3780         if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
3781
3782 //----------- Read fire_primary_state
3783         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
3784         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
3785         if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_joystick[0].value);
3786         if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
3787
3788 //----------- Read fire_secondary_down_count
3789         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
3790         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
3791         if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_joystick[1].value);
3792         if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
3793
3794 //----------- Read fire_secondary_state
3795         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
3796         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
3797         if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_joystick[1].value);
3798         if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
3799
3800 //----------- Read fire_flare_down_count
3801         if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
3802         if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
3803         if ((use_joystick)&&(kc_joystick[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_joystick[4].value);
3804         if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
3805
3806 //----------- Read drop_bomb_down_count
3807         if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
3808         if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
3809         if ((use_joystick)&&(kc_joystick[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_joystick[26].value);
3810         if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
3811
3812 //----------- Read rear_view_down_count
3813         if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
3814         if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
3815         if ((use_joystick)&&(kc_joystick[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_joystick[25].value);
3816         if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
3817
3818 //----------- Read rear_view_down_state
3819         if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3820         if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3821         if ((use_joystick)&&(kc_joystick[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_joystick[25].value);
3822         if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3823
3824 //----------- Read automap_down_count
3825         if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3826         if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3827
3828 //----------- Read automap_state
3829         if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3830         if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3831
3832 //----------- Read stupid-cruise-control-type of throttle.
3833         {
3834                 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3835                 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3836                 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3837                 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3838                 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3839                         Cruise_speed = 0;
3840                 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3841                         Cruise_speed = 0;
3842         
3843                 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3844                 if (Cruise_speed < 0 ) Cruise_speed = 0;
3845         
3846                 if (Controls.forward_thrust_time==0)
3847                         Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3848         }
3849
3850 #if !defined(MACINTOSH)
3851         //read_head_tracker();
3852
3853         // Read external controls
3854         // if (kc_use_external_control || CybermouseActive)
3855         //      kconfig_read_external_controls();
3856 #endif
3857
3858 //----------- Clamp values between -FrameTime and FrameTime
3859         if (FrameTime > F1_0 )
3860                 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3861
3862         if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3863         if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3864         if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3865         if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3866         if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3867         if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3868 //      if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3869
3870         if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3871         if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3872         if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3873         if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3874         if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3875         if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3876 //      if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3877
3878
3879 //--------- Don't do anything if in debug mode
3880         #ifndef RELEASE
3881         if ( keyd_pressed[KEY_DELETE] ) {
3882                 memset( &Controls, 0, sizeof(control_info) );
3883         }
3884         #endif
3885 }
3886 #endif
3887
3888 void reset_cruise(void)
3889 {
3890         Cruise_speed=0;
3891 }
3892
3893
3894 void kc_set_controls()
3895 {
3896         int i;
3897
3898         for (i=0; i<NUM_KEY_CONTROLS; i++ )     
3899                 kc_keyboard[i].value = kconfig_settings[0][i];
3900
3901         if ( (Config_control_type>0) && (Config_control_type<5)) {
3902                 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3903                         kc_joystick[i].value = kconfig_settings[Config_control_type][i];
3904                         if (kc_joystick[i].type == BT_INVERT )  {
3905                                 if (kc_joystick[i].value!=1)
3906                                         kc_joystick[i].value    = 0;
3907                                 kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
3908                         }
3909                 }
3910         } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
3911                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
3912                         kc_mouse[i].value = kconfig_settings[Config_control_type][i];
3913                         if (kc_mouse[i].type == BT_INVERT )     {
3914                                 if (kc_mouse[i].value!=1)
3915                                         kc_mouse[i].value       = 0;
3916                                 kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
3917                         }
3918                 }
3919         } else if (Config_control_type == CONTROL_WINJOYSTICK) {
3920                 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3921                         kc_superjoy[i].value = kconfig_settings[Config_control_type][i];
3922                         if (kc_superjoy[i].type == BT_INVERT )  {
3923                                 if (kc_superjoy[i].value!=1)
3924                                         kc_superjoy[i].value    = 0;
3925                                 kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
3926                         }
3927                 }
3928         }
3929
3930 #ifdef D2X_KEYS
3931         for (i=0; i<NUM_D2X_CONTROLS; i++ )
3932                 kc_d2x[i].value = kconfig_d2x_settings[i];
3933 #endif
3934 }
3935
3936 #if 0 //ndef MACINTOSH  // no mac support for vr headset
3937
3938 void kconfig_center_headset()
3939 {
3940 #ifndef WINDOWS
3941         if (vfx1_installed)
3942                 vfx_center_headset();
3943 #endif
3944 //      } else if (iglasses_headset_installed)  {
3945 //      } else if (Victor_headset_installed)   {
3946 //      } else {
3947 //      }
3948
3949 }
3950
3951 #endif  // end of #ifndef MACINTOSH for kconfig_center_headset
3952
3953 void CybermouseAdjust ()
3954  {
3955 /*      if ( Player_num > -1 )  {
3956                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL);    // Turn off roll when turning
3957                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING);   // Turn off leveling to nearest side.
3958                 Auto_leveling_on = 0;
3959
3960                 if ( kc_external_version > 0 ) {                
3961                         vms_matrix tempm, ViewMatrix;
3962                         vms_angvec * Kconfig_abs_movement;
3963                         char * oem_message;
3964         
3965                         Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
3966         
3967                         if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h )    {
3968                                 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
3969                                 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
3970                                 Objects[Players[Player_num].objnum].orient = ViewMatrix;                
3971                         }
3972                         oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
3973                         if (oem_message[0] != '\0' )
3974                                 HUD_init_message( oem_message );
3975                 }
3976         }*/
3977
3978         Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);                                               
3979         Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
3980         Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
3981         Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
3982         Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
3983         Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
3984 //      Controls.rear_view_down_count += kc_external_control->rear_view_down_count;     
3985 //      Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;     
3986         Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
3987         Controls.fire_primary_state |= kc_external_control->fire_primary_state;
3988         Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
3989         Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
3990         Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
3991         Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;     
3992 //      Controls.automap_down_count += kc_external_control->automap_down_count;
3993 //      Controls.automap_state |= kc_external_control->automap_state;
3994   } 
3995
3996 char GetKeyValue (char key)
3997   {
3998         mprintf ((0,"Returning %c!\n",kc_keyboard[(int)key].value));
3999         return (kc_keyboard[(int)key].value);
4000   }
4001
4002 #if !defined(MACINTOSH)
4003
4004
4005 extern object *obj_find_first_of_type (int);
4006 void kconfig_read_external_controls()
4007 {
4008         //union REGS r;
4009    int i;
4010
4011         if ( !kc_enable_external_control ) return;
4012
4013         if ( kc_external_version == 0 ) 
4014                 memset( kc_external_control, 0, sizeof(ext_control_info));
4015         else if ( kc_external_version > 0 )     {
4016         
4017                 if (kc_external_version>=4)
4018                         memset( kc_external_control, 0, sizeof(advanced_ext_control_info));
4019       else if (kc_external_version>0)     
4020                         memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 );
4021                 else if (kc_external_version>2)
4022                         memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector) + sizeof(vms_matrix) +4 );
4023
4024                 if ( kc_external_version > 1 ) {
4025                         // Write ship pos and angles to external controls...
4026                         ubyte *temp_ptr = (ubyte *)kc_external_control;
4027                         vms_vector *ship_pos;
4028                         vms_matrix *ship_orient;
4029                         memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
4030                         temp_ptr += sizeof(ext_control_info) + sizeof(vms_angvec) + 64;
4031                         ship_pos = (vms_vector *)temp_ptr;
4032                         temp_ptr += sizeof(vms_vector);
4033                         ship_orient = (vms_matrix *)temp_ptr;
4034                         // Fill in ship postion...
4035                         *ship_pos = Objects[Players[Player_num].objnum].pos;
4036                         // Fill in ship orientation...
4037                         *ship_orient = Objects[Players[Player_num].objnum].orient;
4038                 }
4039     if (kc_external_version>=4)
4040           {
4041            advanced_ext_control_info *temp_ptr=(advanced_ext_control_info *)kc_external_control;
4042  
4043       temp_ptr->headlight_state=(Players[Player_num].flags & PLAYER_FLAGS_HEADLIGHT_ON);
4044                 temp_ptr->primary_weapon_flags=Players[Player_num].primary_weapon_flags;
4045                 temp_ptr->secondary_weapon_flags=Players[Player_num].secondary_weapon_flags;
4046       temp_ptr->current_primary_weapon=Primary_weapon;
4047       temp_ptr->current_secondary_weapon=Secondary_weapon;
4048
4049       temp_ptr->current_guidebot_command=Escort_goal_object;
4050
4051            temp_ptr->force_vector=ExtForceVec;
4052                 temp_ptr->force_matrix=ExtApplyForceMatrix;
4053            for (i=0;i<3;i++)
4054        temp_ptr->joltinfo[i]=ExtJoltInfo[i];  
4055       for (i=0;i<2;i++)
4056                    temp_ptr->x_vibrate_info[i]=ExtXVibrateInfo[i];
4057                 temp_ptr->x_vibrate_clear=ExtXVibrateClear;
4058            temp_ptr->game_status=ExtGameStatus;
4059    
4060       memset ((void *)&ExtForceVec,0,sizeof(vms_vector));
4061       memset ((void *)&ExtApplyForceMatrix,0,sizeof(vms_matrix));
4062       
4063       for (i=0;i<3;i++)
4064                  ExtJoltInfo[i]=0;
4065       for (i=0;i<2;i++)
4066                  ExtXVibrateInfo[i]=0;
4067       ExtXVibrateClear=0;
4068      }
4069         }
4070
4071         if ( Automap_active )                   // (If in automap...)
4072                 kc_external_control->automap_state = 1;
4073         //memset(&r,0,sizeof(r));
4074
4075   #if 0
4076  
4077         int386 ( kc_external_intno, &r, &r);            // Read external info...
4078
4079   #endif 
4080
4081         if ( Player_num > -1 )  {
4082                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL);    // Turn off roll when turning
4083                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING);   // Turn off leveling to nearest side.
4084                 Auto_leveling_on = 0;
4085
4086                 if ( kc_external_version > 0 ) {                
4087                         vms_matrix tempm, ViewMatrix;
4088                         vms_angvec * Kconfig_abs_movement;
4089                         char * oem_message;
4090         
4091                         Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(ext_control_info));
4092         
4093                         if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h )    {
4094                                 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
4095                                 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
4096                                 Objects[Players[Player_num].objnum].orient = ViewMatrix;                
4097                         }
4098                         oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
4099                         if (oem_message[0] != '\0' )
4100                                 HUD_init_message( oem_message );
4101                 }
4102         }
4103
4104         Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);                                               
4105         Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
4106         Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
4107         Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
4108         Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
4109         Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
4110         Controls.rear_view_down_count += kc_external_control->rear_view_down_count;     
4111         Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;     
4112         Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
4113         Controls.fire_primary_state |= kc_external_control->fire_primary_state;
4114         Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
4115         Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
4116         Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
4117         Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;     
4118         Controls.automap_down_count += kc_external_control->automap_down_count;
4119         Controls.automap_state |= kc_external_control->automap_state;
4120         
4121    if (kc_external_version>=3)
4122          {
4123                 ubyte *temp_ptr = (ubyte *)kc_external_control;
4124                 temp_ptr += (sizeof(ext_control_info) + sizeof(vms_angvec) + 64 + sizeof(vms_vector) + sizeof (vms_matrix));
4125   
4126            if (*(temp_ptr))
4127                  Controls.cycle_primary_count=(*(temp_ptr));
4128            if (*(temp_ptr+1))
4129                  Controls.cycle_secondary_count=(*(temp_ptr+1));
4130
4131                 if (*(temp_ptr+2))
4132                  Controls.afterburner_state=(*(temp_ptr+2));
4133                 if (*(temp_ptr+3))
4134                  Controls.headlight_count=(*(temp_ptr+3));
4135          }
4136    if (kc_external_version>=4)
4137          {
4138      int i;
4139           advanced_ext_control_info *temp_ptr=(advanced_ext_control_info *)kc_external_control;
4140      
4141      for (i=0;i<128;i++)
4142            if (temp_ptr->keyboard[i])
4143                         key_putkey (i);
4144
4145      if (temp_ptr->Reactor_blown)
4146       {
4147        if (Game_mode & GM_MULTI)
4148                     net_destroy_controlcen (obj_find_first_of_type (OBJ_CNTRLCEN));
4149                  else
4150                          do_controlcen_destroyed_stuff(obj_find_first_of_type (OBJ_CNTRLCEN));
4151            }
4152     }
4153   
4154 }
4155 #endif
4156