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