change byte to sbyte
[btb/d2x.git] / main / kconfig.c
1 /* $Id: kconfig.c,v 1.23 2003-10-04 02:58:23 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.23 2003-10-04 02:58:23 btb Exp $";
350 #endif
351
352 #ifdef WINDOWS
353 #include "desw.h"
354 #endif
355
356 #include <stdio.h>
357 #include <stdlib.h>
358 #include <string.h>
359 #include <stdarg.h>
360 #include <ctype.h>
361
362 #include "pa_enabl.h"                   //$$POLY_ACC
363 #include "error.h"
364 #include "pstypes.h"
365 #include "gr.h"
366 #include "mono.h"
367 #include "key.h"
368 #include "palette.h"
369 #include "game.h"
370 #include "gamefont.h"
371 #include "iff.h"
372 #include "u_mem.h"
373 #include "joy.h"
374 #include "mouse.h"
375 #include "kconfig.h"
376 #include "gauges.h"
377 #include "joydefs.h"
378 #include "songs.h"
379 #include "render.h"
380 #include "digi.h"
381 #include "newmenu.h"
382 #include "endlevel.h"
383 #include "multi.h"
384 #include "timer.h"
385 #include "text.h"
386 #include "player.h"
387 #include "menu.h"
388 #include "automap.h"
389 #include "args.h"
390 #include "lighting.h"
391 #include "ai.h"
392 #include "cntrlcen.h"
393 #if defined (TACTILE)
394  #include "tactile.h"
395 #endif
396
397 #if defined(POLY_ACC)
398 #include "poly_acc.h"
399 #endif
400
401 #include "collide.h"
402
403 #ifdef __unix__
404 #include "joystick.h"
405 #endif
406
407 ubyte ExtGameStatus=1;
408
409 vms_vector ExtForceVec;
410 vms_matrix ExtApplyForceMatrix;
411
412 int ExtJoltInfo[3]={0,0,0};
413 int ExtXVibrateInfo[2]={0,0};
414 int ExtYVibrateInfo[2]={0,0};
415 ubyte ExtXVibrateClear=0;
416 ubyte ExtYVibrateClear=0;
417
418 #define TABLE_CREATION 1
419
420 // Array used to 'blink' the cursor while waiting for a keypress.
421 sbyte fades[64] = { 1,1,1,2,2,3,4,4,5,6,8,9,10,12,13,15,16,17,19,20,22,23,24,26,27,28,28,29,30,30,31,31,31,31,31,30,30,29,28,28,27,26,24,23,22,20,19,17,16,15,13,12,10,9,8,6,5,4,4,3,2,2,1,1 };
422
423 //char * invert_text[2] = { "N", "Y" };
424 //char * joybutton_text[28] = { "BTN 1", "BTN 2", "BTN 3", "BTN 4", "", "TRIG", "LEFT", "HAT \81", "RIGHT", "", "", "HAT \80", "MID", "", "", "HAT \7f", "", "", "", "HAT \82", "TRIG", "LEFT", "RIGHT", "", "UP","DOWN","LEFT", "RIGHT" };
425 //char * joyaxis_text[4] = { "X1", "Y1", "X2", "Y2" };
426 //char * mouseaxis_text[2] = { "L/R", "F/B" };
427 //char * mousebutton_text[3] = { "Left", "Right", "Mid" };
428
429 int invert_text[2] = { TNUM_N, TNUM_Y };
430
431 #ifdef WINDOWS
432         int joybutton_text[28] = 
433         { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
434           -1, -1, -1, -1,
435           -1, -1, -1, -1,
436           -1, -1, -1, -1,
437           TNUM_HAT_L, TNUM_HAT_R, TNUM_HAT_U, TNUM_HAT_D,
438           -1, -1, -1, -1,
439           -1, -1, -1, -1
440         };
441         int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
442 #else
443         int joybutton_text[28] = 
444         { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
445           -1, TNUM_TRIG, TNUM_LEFT, TNUM_HAT_L,
446          TNUM_RIGHT, -1, TNUM_HAT2_D, TNUM_HAT_R,
447          TNUM_MID, -1, TNUM_HAT2_R, TNUM_HAT_U,
448          TNUM_HAT2_L, -1, TNUM_HAT2_U, TNUM_HAT_D,
449          TNUM_TRIG, TNUM_LEFT, TNUM_RIGHT, -1, 
450          TNUM_UP, TNUM_DOWN, TNUM_LEFT, TNUM_RIGHT };
451
452         int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
453 //      int joyaxis_text[4] = { TNUM_X1, TNUM_Y1, TNUM_X2, TNUM_Y2 };
454 #endif
455         
456 int mouseaxis_text[3] = { TNUM_L_R, TNUM_F_B, TNUM_Z1 };
457 #ifndef MACINTOSH
458 int mousebutton_text[3] = { TNUM_LEFT, TNUM_RIGHT, TNUM_MID };
459 char * mousebutton_textra[13] = { "M4", "M5", "M6", "M7", "M8", "M9", "M10","M11","M12","M13","M14","M15","M16" };//text for buttons above 3. -MPM
460 #else
461 char *mousebutton_text[3] = { "Btn", "", "" };          // only one silly mouse button on the mac
462 #endif
463
464 #ifdef MACINTOSH
465 char * key_text[256] = {         
466 "","S","D","F","H","G","Z","X","C","V","","B","Q", "W", "E", "R",
467 "Y","T","1","2","3","4","6","5","=","9","7","-", "8", "0", "]", "O",
468 "U","[","I","P","RET","L","J","'","K", ";", "\\", ",", "/", "N", "M", ".",
469 "TAB","SPC","`","DEL","","ESC","","APL","SHIFT","CAPSL","OPTN","CTRL","","","","A",
470 "","PAD.","","PAD*","","PAD+","","NMLCK","","","","PAD/","ENTER","","PAD-","",
471 "","PAD=","PAD0","PAD1","PAD2","PAD3","PAD4","PAD5","PAD6","PAD7","","PAD8","PAD9","","","",
472 "F5","F6","F7","","F8","F9","","F11","","F13","","F14","","F10","","F12",
473 "","PAUSE","HELP","HOME","PGUP","DEL","","END","F2","","F1","LARW","RARW","DARW","UARW","",
474 "","","","","","","","","","","","","","","","",
475 "","","","","","","","","","","","","","","","",
476 "","","","","","","","","","","","","","","","",
477 "","","","","","","","","","","","","","","","",
478 "","","","","","","","","","","","","","","","",
479 "","","","","","","","","","","","","","","","",
480 "","","","","","","","","","","","","","","","",
481 "","","","","","","","","","","","","","","",""};
482 #else
483 #if !defined OGL && !defined SDL_INPUT
484 char * key_text[256] = {         \
485 "","ESC","1","2","3","4","5","6","7","8","9","0","-",                   \
486 "=","BSPC","TAB","Q","W","E","R","T","Y","U","I","O",                           \
487 "P","[","]","\83","LCTRL","A","S","D","F",        \
488 "G","H","J","K","L",";","'","`",        \
489 "LSHFT","\\","Z","X","C","V","B","N","M",",",      \
490 ".","/","RSHFT","PAD*","LALT","SPC",      \
491 "CPSLK","F1","F2","F3","F4","F5","F6","F7","F8","F9",        \
492 "F10","NMLCK","SCLK","PAD7","PAD8","PAD9","PAD-",   \
493 "PAD4","PAD5","PAD6","PAD+","PAD1","PAD2","PAD3","PAD0", \
494 "PAD.","","","","F11","F12","","","","","","","","","",         \
495 "","","","","","","","","","","","","","","","","","","","",     \
496 "","","","","","","","","","","","","","","","","","","","",     \
497 "","","","","","","","","","","","","","","","","","",           \
498 "PAD\83","RCTRL","","","","","","","","","","","","","", \
499 "","","","","","","","","","","PAD/","","","RALT","",      \
500 "","","","","","","","","","","","","","HOME","\82","PGUP",     \
501 "","\81","","\7f","","END","\80","PGDN","INS",       \
502 "DEL","","","","","","","","","","","","","","","","","",     \
503 "","","","","","","","","","","","","","","","","","","","",     \
504 "","","","","","","" };
505 #endif /* OGL */
506 #endif
507
508 //added/removed by Victor Rachels for adding rebindable keys for these
509 // KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0
510 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 };
511
512 //extern void GameLoop(int, int );
513
514 extern void transfer_energy_to_shield(fix);
515 extern void CyclePrimary(),CycleSecondary(),InitMarkerInput();
516 extern ubyte DefiningMarkerMessage;
517 extern char CybermouseActive;
518
519 #ifdef WINDOWS
520 extern int joydefsw_do_button();
521 extern int joydefsw_do_winjoybutton(int *axis);
522 extern joydefsw_win_joyselect(char *title);
523 #endif
524
525 control_info Controls;
526
527 fix Cruise_speed=0;
528
529 // macros for drawing lo/hi res kconfig screens (see scores.c as well)
530
531 #define LHX(x)          ((x)*(MenuHires?2:1))
532 #define LHY(y)          ((y)*(MenuHires?2.4:1))
533
534
535 #define BT_KEY                          0
536 #define BT_MOUSE_BUTTON         1
537 #define BT_MOUSE_AXIS           2
538 #define BT_JOY_BUTTON           3
539 #define BT_JOY_AXIS                     4
540 #define BT_INVERT                               5
541
542 char *btype_text[] = { "BT_KEY", "BT_MOUSE_BUTTON", "BT_MOUSE_AXIS", "BT_JOY_BUTTON", "BT_JOY_AXIS", "BT_INVERT" };
543
544 #define INFO_Y 28
545
546 typedef struct kc_item {
547         short id;                               // The id of this item
548         short x, y;                             
549         short w1;
550         short w2;
551         short u,d,l,r;
552         //short text_num1;
553         char *text;
554         ubyte type;
555         ubyte value;            // what key,button,etc
556 } kc_item;
557
558 int Num_items=28;
559 kc_item *All_items;
560
561 ubyte kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS];
562
563 //added on 2/4/99 by Victor Rachels to add d1x new keys
564 ubyte kconfig_d2x_settings[MAX_D2X_CONTROLS];
565 //end this section addition - VR
566
567 //----------- WARNING!!!!!!! -------------------------------------------
568 // THESE NEXT FOUR BLOCKS OF DATA ARE GENERATED BY PRESSING DEL+F12 WHEN
569 // IN THE KEYBOARD CONFIG SCREEN.  BASICALLY, THAT PROCEDURE MODIFIES THE
570 // U,D,L,R FIELDS OF THE ARRAYS AND DUMPS THE NEW ARRAYS INTO KCONFIG.COD
571 //-------------------------------------------------------------------------
572 /*ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
573 {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},
574 {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},
575 {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},
576 {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},
577 {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},
578 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
579 {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},
580 };*/                                                                              
581
582 #ifndef MACINTOSH
583 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
584 {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},
585 {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},
586 {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},
587 {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},
588 {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},
589 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
590 {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},
591 #ifdef WINDOWS
592 {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},
593 #endif
594 };
595
596
597
598 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
599         {  0, 15, 49, 71, 26, 55,  2, 55,  1,"Pitch forward", BT_KEY, 255 },
600         {  1, 15, 49,100, 26, 50,  3,  0, 24,"Pitch forward", BT_KEY, 255 },
601         {  2, 15, 57, 71, 26,  0,  4, 25,  3,"Pitch backward", BT_KEY, 255 },
602         {  3, 15, 57,100, 26,  1,  5,  2, 26,"Pitch backward", BT_KEY, 255 },
603         {  4, 15, 65, 71, 26,  2,  6, 27,  5,"Turn left", BT_KEY, 255 },
604         {  5, 15, 65,100, 26,  3,  7,  4, 28,"Turn left", BT_KEY, 255 },
605         {  6, 15, 73, 71, 26,  4,  8, 29,  7,"Turn right", BT_KEY, 255 },
606         {  7, 15, 73,100, 26,  5,  9,  6, 34,"Turn right", BT_KEY, 255 },
607         {  8, 15, 85, 71, 26,  6, 10, 35,  9,"Slide on", BT_KEY, 255 },
608         {  9, 15, 85,100, 26,  7, 11,  8, 36,"Slide on", BT_KEY, 255 },
609         { 10, 15, 93, 71, 26,  8, 12, 37, 11,"Slide left", BT_KEY, 255 },
610         { 11, 15, 93,100, 26,  9, 13, 10, 44,"Slide left", BT_KEY, 255 },
611         { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
612         { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
613         { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
614         { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
615         { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
616         { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
617         { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
618         { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
619         { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
620         { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
621         { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
622         { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
623         { 24,158, 49, 83, 26, 51, 26,  1, 25,"Fire primary", BT_KEY, 255 },
624         { 25,158, 49,112, 26, 54, 27, 24,  2,"Fire primary", BT_KEY, 255 },
625         { 26,158, 57, 83, 26, 24, 28,  3, 27,"Fire secondary", BT_KEY, 255 },
626         { 27,158, 57,112, 26, 25, 29, 26,  4,"Fire secondary", BT_KEY, 255 },
627         { 28,158, 65, 83, 26, 26, 34,  5, 29,"Fire flare", BT_KEY, 255 },
628         { 29,158, 65,112, 26, 27, 35, 28,  6,"Fire flare", BT_KEY, 255 },
629         { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
630         { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
631         { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
632         { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
633         { 34,158, 73, 83, 26, 28, 36,  7, 35,"Drop Bomb", BT_KEY, 255 },
634         { 35,158, 73,112, 26, 29, 37, 34,  8,"Drop Bomb", BT_KEY, 255 },
635         { 36,158, 85, 83, 26, 34, 44,  9, 37,"REAR VIEW", BT_KEY, 255 },
636         { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
637         { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
638         { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
639         { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
640         { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
641         { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
642         { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
643         { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
644         { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
645         { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
646         { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
647         { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
648         { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
649         { 50, 15,169, 71, 26, 48,  1, 53, 51,"Cycle Second", BT_KEY, 255 },
650         { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
651         { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
652         { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
653         { 54,158,171, 83, 26, 52, 56, 51, 55,"Energy->Shield", BT_KEY, 255 },
654         { 55,158,171,112, 26, 53,  0, 54,  0,"Energy->Shield", BT_KEY, 255 },
655    { 56,158,179,83,  26, 54,  0, 0,  0, "Toggle Bomb",  BT_KEY,255},
656 };
657 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
658         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
659         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
660         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
661         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
662         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
663         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
664         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
665         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
666         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
667         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
668         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
669         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
670         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
671         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
672         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
673         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
674         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
675         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
676         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
677         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
678         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
679         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
680         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
681         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
682         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
683         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
684         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
685         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
686         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
687         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
688         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
689 };
690 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
691         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
692         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
693         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
694         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
695         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
696         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
697         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
698         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
699         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
700         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
701         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
702         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
703         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
704         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
705         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
706         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
707         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
708         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
709         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
710         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
711         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
712         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
713         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
714         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
715         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
716         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
717         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
718         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
719         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
720         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
721         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
722 };
723
724 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
725         {  0, 25, 46, 85, 26, 12,  1, 24,  5,"Fire primary", BT_MOUSE_BUTTON, 255 },
726         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
727         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
728         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
729         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_MOUSE_BUTTON, 255 },
730         {  5,180, 46, 59, 26, 24,  6,  0,  1,"Slide on", BT_MOUSE_BUTTON, 255 },
731         {  6,180, 54, 59, 26,  5,  7,  1,  4,"Slide left", BT_MOUSE_BUTTON, 255 },
732         {  7,180, 62, 59, 26,  6,  8,  4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
733         {  8,180, 70, 59, 26,  7,  9, 26,  9,"Slide up", BT_MOUSE_BUTTON, 255 },
734         {  9,180, 78, 59, 26,  8, 10,  8,  2,"Slide down", BT_MOUSE_BUTTON, 255 },
735         { 10,180, 90, 59, 26,  9, 11,  2,  3,"Bank on", BT_MOUSE_BUTTON, 255 },
736         { 11,180, 98, 59, 26, 10, 12,  3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
737         { 12,180,106, 59, 26, 11,  0, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
738         { 13,103,138, 58, 26, 27, 15, 25, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
739         { 14,103,138,106,  8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
740         { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
741         { 16,103,146,106,  8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
742         { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
743         { 18,103,154,106,  8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
744         { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
745         { 20,103,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
746         { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
747         { 22,103,170,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
748         { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
749         { 24,103,182,106,  8, 22,  5, 23,  0,"throttle", BT_INVERT, 255 },
750         { 25, 25,109, 85, 26,  3, 27, 12, 13,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
751         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
752         { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
753 };
754
755 //added on 2/4/99 by Victor Rachels to add d1x new keys
756 kc_item kc_d2x[NUM_D2X_CONTROLS] = {
757 //        id,x,y,w1,w2,u,d,l,r,text_num1,type,value
758         {  0, 15, 49, 71, 26, 27,  2, 27,  1, "WEAPON 1", BT_KEY, 255},
759         {  1, 15, 49,100, 26, 26,  3,  0,  2, "WEAPON 1", BT_JOY_BUTTON, 255},
760         {  2, 15, 57, 71, 26,  0,  4,  1,  3, "WEAPON 2", BT_KEY, 255},
761         {  3, 15, 57,100, 26,  1,  5,  2,  4, "WEAPON 2", BT_JOY_BUTTON, 255},
762         {  4, 15, 65, 71, 26,  2,  6,  3,  5, "WEAPON 3", BT_KEY, 255},
763         {  5, 15, 65,100, 26,  3,  7,  4,  6, "WEAPON 3", BT_JOY_BUTTON, 255},
764         {  6, 15, 73, 71, 26,  4,  8,  5,  7, "WEAPON 4", BT_KEY, 255},
765         {  7, 15, 73,100, 26,  5,  9,  6,  8, "WEAPON 4", BT_JOY_BUTTON, 255},
766         {  8, 15, 81, 71, 26,  6, 10,  7,  9, "WEAPON 5", BT_KEY, 255},
767         {  9, 15, 81,100, 26,  7, 11,  8, 10, "WEAPON 5", BT_JOY_BUTTON, 255},
768
769         { 10, 15, 89, 71, 26,  8, 12,  9, 11, "WEAPON 6", BT_KEY, 255},
770         { 11, 15, 89,100, 26,  9, 13, 10, 12, "WEAPON 6", BT_JOY_BUTTON, 255},
771         { 12, 15, 97, 71, 26, 10, 14, 11, 13, "WEAPON 7", BT_KEY, 255},
772         { 13, 15, 97,100, 26, 11, 15, 12, 14, "WEAPON 7", BT_JOY_BUTTON, 255},
773         { 14, 15,105, 71, 26, 12, 16, 13, 15, "WEAPON 8", BT_KEY, 255},
774         { 15, 15,105,100, 26, 13, 17, 14, 16, "WEAPON 8", BT_JOY_BUTTON, 255},
775         { 16, 15,113, 71, 26, 14, 18, 15, 17, "WEAPON 9", BT_KEY, 255},
776         { 17, 15,113,100, 26, 15, 19, 16, 18, "WEAPON 9", BT_JOY_BUTTON, 255},
777         { 18, 15,121, 71, 26, 16, 20, 17, 19, "WEAPON 0", BT_KEY, 255},
778         { 19, 15,121,100, 26, 17, 21, 18, 20, "WEAPON 0", BT_JOY_BUTTON, 255},
779
780         //{ 20, 15,131, 71, 26, 18, 22, 19, 21, "CYC PRIMARY", BT_KEY, 255},
781         //{ 21, 15,131,100, 26, 19, 23, 20, 22, "CYC PRIMARY", BT_JOY_BUTTON, 255},
782         //{ 22, 15,139, 71, 26, 20, 24, 21, 23, "CYC SECONDARY", BT_KEY, 255},
783         //{ 23, 15,139,100, 26, 21, 25, 22, 24, "CYC SECONDARY", BT_JOY_BUTTON, 255},
784         //{ 24,  8,147, 78, 26, 22, 26, 23, 25, "TOGGLE_PRIM AUTO", BT_KEY, 255},
785         //{ 25,  8,147,107, 26, 23, 27, 24, 26, "TOGGLE_PRIM_AUTO", BT_JOY_BUTTON, 255},
786         //{ 26,  8,155, 78, 26, 24,  1, 25, 27, "TOGGLE SEC AUTO", BT_KEY, 255},
787         //{ 27,  8,155,107, 26, 25,  0, 26,  0, "TOGGLE SEC AUTO", BT_JOY_BUTTON, 255},
788 };
789 //end this section addition - VR
790
791 #else           // ifndef MACINTOSH (following are macintosh controls)
792
793 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
794 {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},
795 {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},
796 {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},
797 {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},
798 {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},
799 {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},
800 {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},
801 };
802
803 ubyte default_firebird_settings[MAX_CONTROLS] =
804 {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};
805
806 ubyte default_mousestick_settings[MAX_CONTROLS] =
807 {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};
808
809 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
810         {  0, 15, 49, 71, 26, 55,  2, 55,  1,"Pitch forward", BT_KEY, 255 },
811         {  1, 15, 49,100, 26, 50,  3,  0, 24,"Pitch forward", BT_KEY, 255 },
812         {  2, 15, 57, 71, 26,  0,  4, 25,  3,"Pitch backward", BT_KEY, 255 },
813         {  3, 15, 57,100, 26,  1,  5,  2, 26,"Pitch backward", BT_KEY, 255 },
814         {  4, 15, 65, 71, 26,  2,  6, 27,  5,"Turn left", BT_KEY, 255 },
815         {  5, 15, 65,100, 26,  3,  7,  4, 28,"Turn left", BT_KEY, 255 },
816         {  6, 15, 73, 71, 26,  4,  8, 29,  7,"Turn right", BT_KEY, 255 },
817         {  7, 15, 73,100, 26,  5,  9,  6, 34,"Turn right", BT_KEY, 255 },
818         {  8, 15, 85, 71, 26,  6, 10, 35,  9,"Slide on", BT_KEY, 255 },
819         {  9, 15, 85,100, 26,  7, 11,  8, 36,"Slide on", BT_KEY, 255 },
820         { 10, 15, 93, 71, 26,  8, 12, 37, 11,"Slide left", BT_KEY, 255 },
821         { 11, 15, 93,100, 26,  9, 13, 10, 44,"Slide left", BT_KEY, 255 },
822         { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
823         { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
824         { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
825         { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
826         { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
827         { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
828         { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
829         { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
830         { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
831         { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
832         { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
833         { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
834         { 24,158, 49, 83, 26, 51, 26,  1, 25,"Fire primary", BT_KEY, 255 },
835         { 25,158, 49,112, 26, 54, 27, 24,  2,"Fire primary", BT_KEY, 255 },
836         { 26,158, 57, 83, 26, 24, 28,  3, 27,"Fire secondary", BT_KEY, 255 },
837         { 27,158, 57,112, 26, 25, 29, 26,  4,"Fire secondary", BT_KEY, 255 },
838         { 28,158, 65, 83, 26, 26, 34,  5, 29,"Fire flare", BT_KEY, 255 },
839         { 29,158, 65,112, 26, 27, 35, 28,  6,"Fire flare", BT_KEY, 255 },
840         { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
841         { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
842         { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
843         { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
844         { 34,158, 73, 83, 26, 28, 36,  7, 35,"Drop Bomb", BT_KEY, 255 },
845         { 35,158, 73,112, 26, 29, 37, 34,  8,"Drop Bomb", BT_KEY, 255 },
846         { 36,158, 85, 83, 26, 34, 44,  9, 37,"REAR VIEW", BT_KEY, 255 },
847         { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
848         { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
849         { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
850         { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
851         { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
852         { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
853         { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
854         { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
855         { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
856         { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
857         { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
858         { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
859         { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
860         { 50, 15,169, 71, 26, 48,  1, 53, 51,"Cycle Second", BT_KEY, 255 },
861         { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
862         { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
863         { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
864         { 54,158,171, 83, 26, 52, 25, 51, 55,"Energy->Shield", BT_KEY, 255 },
865         { 55,158,171,112, 26, 53,  0, 54,  0,"Energy->Shield", BT_KEY, 255 },
866 };
867 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
868         {  0, 25, 46, 85, 28, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
869         {  1, 25, 54, 85, 28,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
870         {  2, 25, 85, 85, 28, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
871         {  3, 25, 93, 85, 28,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
872         {  4, 25, 62, 85, 28,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
873         {  5,180, 46, 79, 28, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
874         {  6,180, 54, 79, 28,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
875         {  7,180, 62, 79, 28,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
876         {  8,180, 70, 79, 28,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
877         {  9,180, 78, 79, 28,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
878         { 10,180, 90, 79, 28,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
879         { 11,180, 98, 79, 28, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
880         { 12,180,106, 79, 28, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
881         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
882         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
883         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
884         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
885         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
886         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
887         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
888         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
889         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
890         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
891         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
892         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
893         { 25, 25,109, 85, 28,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
894         { 26, 25, 70, 85, 28,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
895         { 27, 25,117, 85, 28, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
896         { 28,180,114, 79, 28, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
897         { 29,180,122, 79, 28, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
898         { 30, 25,125, 85, 28, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
899 };
900 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
901         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
902         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
903         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
904         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
905         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
906         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
907         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
908         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
909         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
910         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
911         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
912         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
913         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
914         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
915         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
916         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
917         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
918         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
919         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
920         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
921         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
922         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
923         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
924         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
925         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
926         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
927         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
928         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
929         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
930         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
931         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
932 };
933
934 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
935         {  0, 25, 46, 85, 26, 28,  1, 28,  5,"Fire primary", BT_MOUSE_BUTTON, 255 },
936         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
937         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
938         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
939         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_MOUSE_BUTTON, 255 },
940         {  5,180, 46, 59, 26, 24,  6,  0,  1,"Slide on", BT_MOUSE_BUTTON, 255 },
941         {  6,180, 54, 59, 26,  5,  7,  1,  4,"Slide left", BT_MOUSE_BUTTON, 255 },
942         {  7,180, 62, 59, 26,  6,  8,  4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
943         {  8,180, 70, 59, 26,  7,  9, 26,  9,"Slide up", BT_MOUSE_BUTTON, 255 },
944         {  9,180, 78, 59, 26,  8, 10,  8,  2,"Slide down", BT_MOUSE_BUTTON, 255 },
945         { 10,180, 90, 59, 26,  9, 11,  2,  3,"Bank on", BT_MOUSE_BUTTON, 255 },
946         { 11,180, 98, 59, 26, 10, 12,  3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
947         { 12,180,106, 59, 26, 11, 28, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
948         { 13,103,138, 58, 26, 27, 15, 27, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
949         { 14,103,138,106,  8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
950         { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
951         { 16,103,146,106,  8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
952         { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
953         { 18,103,154,106,  8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
954         { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
955         { 20,103,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
956         { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
957         { 22,103,170,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
958         { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
959         { 24,103,182,106,  8, 22,  5, 23, 28,"throttle", BT_INVERT, 255 },
960         { 25, 25,109, 85, 26,  3, 27, 12, 27,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
961         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
962         { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
963 };
964
965 #endif
966
967 //added on 2/4/99 by Victor Rachels to add new keys system
968 ubyte default_kconfig_d2x_settings[MAX_D2X_CONTROLS] = {
969  0x2 ,0xff,0x3 ,0xff,0x4 ,0xff,0x5 ,0xff,0x6 ,0xff,0x7 ,0xff,0x8 ,0xff,0x9 ,
970  0xff,0xa ,0xff,0xb ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
971  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
972 //end this section addition - VR
973
974 void kc_drawitem( kc_item *item, int is_current );
975 void kc_change_key( kc_item * item );
976 void kc_change_joybutton( kc_item * item );
977 void kc_change_mousebutton( kc_item * item );
978 void kc_change_joyaxis( kc_item * item );
979 void kc_change_mouseaxis( kc_item * item );
980 void kc_change_invert( kc_item * item );
981 void kconfig_read_fcs( int raw_axis );
982 void kconfig_set_fcs_button( int btn, int button );
983 void kconfig_read_external_controls( void );
984
985 int kconfig_is_axes_used(int axis)
986 {
987         int i;
988         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
989                 if (( kc_joystick[i].type == BT_JOY_AXIS ) && (kc_joystick[i].value == axis ))
990                         return 1;
991         }
992         return 0;
993 }
994
995 #ifdef TABLE_CREATION
996 int find_item_at( kc_item * items, int nitems, int x, int y )
997 {
998         int i;
999         
1000         for (i=0; i<nitems; i++ )       {
1001                 if ( ((items[i].x+items[i].w1)==x) && (items[i].y==y))
1002                         return i;
1003         }
1004         return -1;
1005 }
1006
1007 int find_next_item_up( kc_item * items, int nitems, int citem )
1008 {
1009         int x, y, i;
1010
1011         y = items[citem].y;
1012         x = items[citem].x+items[citem].w1;
1013         
1014         do {    
1015                 y--;
1016                 if ( y < 0 ) {
1017                         y = grd_curcanv->cv_bitmap.bm_h-1;
1018                         x--;
1019                         if ( x < 0 ) {
1020                                 x = grd_curcanv->cv_bitmap.bm_w-1;
1021                         }
1022                 }
1023                 i = find_item_at( items, nitems, x, y );
1024         } while ( i < 0 );
1025         
1026         return i;
1027 }
1028
1029 int find_next_item_down( kc_item * items, int nitems, int citem )
1030 {
1031         int x, y, i;
1032
1033         y = items[citem].y;
1034         x = items[citem].x+items[citem].w1;
1035         
1036         do {    
1037                 y++;
1038                 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1039                         y = 0;
1040                         x++;
1041                         if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1042                                 x = 0;
1043                         }
1044                 }
1045                 i = find_item_at( items, nitems, x, y );
1046         } while ( i < 0 );
1047         
1048         return i;
1049 }
1050
1051 int find_next_item_right( kc_item * items, int nitems, int citem )
1052 {
1053         int x, y, i;
1054
1055         y = items[citem].y;
1056         x = items[citem].x+items[citem].w1;
1057         
1058         do {    
1059                 x++;
1060                 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1061                         x = 0;
1062                         y++;
1063                         if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1064                                 y = 0;
1065                         }
1066                 }
1067                 i = find_item_at( items, nitems, x, y );
1068         } while ( i < 0 );
1069         
1070         return i;
1071 }
1072
1073 int find_next_item_left( kc_item * items, int nitems, int citem )
1074 {
1075         int x, y, i;
1076
1077         y = items[citem].y;
1078         x = items[citem].x+items[citem].w1;
1079         
1080         do {    
1081                 x--;
1082                 if ( x < 0 ) {
1083                         x = grd_curcanv->cv_bitmap.bm_w-1;
1084                         y--;
1085                         if ( y < 0 ) {
1086                                 y = grd_curcanv->cv_bitmap.bm_h-1;
1087                         }
1088                 }
1089                 i = find_item_at( items, nitems, x, y );
1090         } while ( i < 0 );
1091         
1092         return i;
1093 }
1094 #endif
1095
1096 #if defined(MACINTOSH) || defined(WINDOWS)
1097 int get_item_height(kc_item *item)
1098 {
1099         int w, h, aw;
1100         char btext[10];
1101
1102         if (item->value==255) {
1103                 sprintf( btext, "" );
1104         } else {
1105                 switch( item->type )    {
1106                         case BT_KEY:
1107                                 strncpy( btext, key_text[item->value], 10 ); break;
1108                         case BT_MOUSE_BUTTON:
1109                         #ifdef WINDOWS
1110                                 strncpy( btext, Text_string[mousebutton_text[item->value]], 10); break;
1111                         #else
1112                                 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1113                         #endif
1114                         case BT_MOUSE_AXIS:
1115                                 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1116                         case BT_JOY_BUTTON:
1117                                 if ( joybutton_text[item->value] !=-1 )
1118                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1119                                 else
1120                                         sprintf( btext, "BTN%d", item->value );
1121                                 break;
1122                         case BT_JOY_AXIS:
1123                                 strncpy( btext, Text_string[joyaxis_text[item->value]], 10 ); break;
1124                         case BT_INVERT:
1125                                 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1126                 }
1127         }
1128         gr_get_string_size(btext, &w, &h, &aw  );
1129
1130         return h;
1131 }
1132 #endif
1133
1134 void kconfig_sub(kc_item * items,int nitems, char * title)
1135 {
1136 WINDOS(
1137         dd_grs_canvas * save_canvas,
1138         grs_canvas * save_canvas
1139 );
1140         grs_font * save_font;
1141         int old_keyd_repeat;
1142         #if defined(MACINTOSH) || defined(WINDOWS) 
1143         int mouse_state, omouse_state, mx, my, x1, x2, y1, y2;
1144         int close_x, close_y, close_size;
1145         #endif
1146
1147         int i,k,ocitem,citem;
1148         int time_stopped = 0;
1149 WIN(char *old_bg_pcx);
1150
1151 WIN(old_bg_pcx = _SCRContext.bkg_filename);
1152 WIN(DEFINE_SCREEN(NULL));
1153
1154         All_items = items;
1155         Num_items = nitems;
1156
1157         if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) )
1158         {
1159                 time_stopped = 1;
1160                 stop_time();
1161         }
1162
1163 //      if (Config_control_type == CONTROL_WINJOYSTICK) {
1164 //              WINDOS(
1165 //                      joydefsw_win_joyselect(title2); title = title2,
1166 //                      Int3()
1167 //              );                                                                                              // Get Samir...
1168 //      }
1169
1170 WINDOS(
1171         save_canvas = dd_grd_curcanv,
1172         save_canvas = grd_curcanv
1173 );
1174
1175
1176 WINDOS(
1177         dd_gr_set_current_canvas(NULL),
1178         gr_set_current_canvas(NULL)
1179 );              
1180         save_font = grd_curcanv->cv_font;
1181
1182 #ifdef WINDOWS
1183 KConfigPaint:
1184 #endif
1185         game_flush_inputs();
1186         old_keyd_repeat = keyd_repeat;
1187         keyd_repeat = 1;
1188
1189         //gr_clear_canvas( BM_XRGB(0,0,0) );
1190
1191         nm_draw_background(0, 0, grd_curcanv->cv_bitmap.bm_w - 1, grd_curcanv->cv_bitmap.bm_h - 1);
1192    gr_palette_load (gr_palette);
1193
1194         grd_curcanv->cv_font = MEDIUM3_FONT;
1195
1196 WIN(DDGRLOCK(dd_grd_curcanv));  
1197         {
1198                 char * p;
1199                 p = strchr( title, '\n' );
1200                 if ( p ) *p = 32;
1201                 gr_string( 0x8000, LHY(8), title );
1202                 if ( p ) *p = '\n';
1203         }
1204
1205
1206 //      if ( items == kc_keyboard )     {
1207 //              gr_string( 0x8000, 8, "Keyboard" );
1208 //      } else if ( items == kc_joystick )      {
1209 //              gr_string( 0x8000, 8, "Joysticks" );
1210 //      } else if ( items == kc_mouse ) {
1211 //              gr_string( 0x8000, 8, "Mouse" );
1212 //      }
1213
1214 #if defined(MACINTOSH) || defined(WINDOWS)
1215         close_x = close_y = 15;
1216         close_size = 10;
1217         gr_setcolor( BM_XRGB(0, 0, 0) );
1218         gr_rect(close_x, close_y, close_x + close_size, close_y + close_size);
1219         gr_setcolor( BM_XRGB(21, 21, 21) );
1220         gr_rect( close_x + 2, close_y + 2, close_x + close_size - 2, close_y + close_size -2 );
1221 #endif
1222
1223         grd_curcanv->cv_font = GAME_FONT;
1224         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1225
1226         #ifndef MACINTOSH
1227         gr_string( 0x8000, LHY(20), TXT_KCONFIG_STRING_1 );
1228         #else
1229         gr_string( 0x8000, LHY(20), "Enter changes, ctrl-d deletes, ctrl-r resets defaults, ESC exits");
1230         #endif
1231         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1232         if ( items == kc_keyboard )     {
1233                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1234                 gr_setcolor( BM_XRGB(31,27,6) );
1235                 
1236                 gr_scanline( LHX(98), LHX(106), LHY(42) );
1237                 gr_scanline( LHX(120), LHX(128), LHY(42) );
1238                 gr_pixel( LHX(98), LHY(43) );                                           
1239                 gr_pixel( LHX(98), LHY(44) );                                           
1240                 gr_pixel( LHX(128), LHY(43) );                                          
1241                 gr_pixel( LHX(128), LHY(44) );                                          
1242                 
1243                 gr_string( LHX(109), LHY(40), "OR" );
1244
1245                 gr_scanline( LHX(253), LHX(261), LHY(42) );
1246                 gr_scanline( LHX(274), LHX(283), LHY(42) );
1247                 gr_pixel( LHX(253), LHY(43) );                                          
1248                 gr_pixel( LHX(253), LHY(44) );                                          
1249                 gr_pixel( LHX(283), LHY(43) );                                          
1250                 gr_pixel( LHX(283), LHY(44) );                                          
1251
1252                 gr_string( LHX(264), LHY(40), "OR" );
1253
1254         } if ( items == kc_joystick )   {
1255                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1256                 gr_setcolor( BM_XRGB(31,27,6) );
1257                 gr_scanline( LHX(18), LHX(135), LHY(37) );
1258                 gr_scanline( LHX(181), LHX(294), LHY(37) );
1259                 gr_scanline( LHX(18), LHX(144), LHY(119+18) );
1260                 gr_scanline( LHX(174), LHX(294), LHY(119+18) );
1261                 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1262                 gr_string( 0x8000,LHY(117+18), TXT_AXES );
1263                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1264                 gr_string( LHX(81), LHY(137+8), TXT_AXIS );
1265                 gr_string( LHX(111), LHY(137+8), TXT_INVERT );
1266                 gr_string( LHX(222), LHY(137+8), TXT_AXIS );
1267                 gr_string( LHX(252), LHY(137+8), TXT_INVERT );
1268         } else if ( items == kc_mouse ) {
1269                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1270                 gr_setcolor( BM_XRGB(31,27,6) );
1271                 gr_scanline( LHX(18), LHX(135), LHY(37) );
1272                 gr_scanline( LHX(181), LHX(294), LHY(37) );
1273                 gr_scanline( LHX(18), LHX(144), LHY(119+5) );
1274                 gr_scanline( LHX(174), LHX(294), LHY(119+5) );
1275                 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1276                 gr_string( 0x8000,LHY(117+5), TXT_AXES );
1277                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1278                 gr_string( LHX(169), LHY(129), TXT_AXIS );
1279                 gr_string( LHX(199), LHY(129), TXT_INVERT );
1280         }
1281         else if ( items == kc_d2x )
1282         {
1283                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1284                 gr_setcolor( BM_XRGB(31,27,6) );
1285
1286                 gr_string(LHX( 94), LHY(40), "KB");
1287                 gr_string(LHX(121), LHY(40), "JOY");
1288         }
1289
1290 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1291
1292         for (i=0; i<nitems; i++ )       {
1293                 kc_drawitem( &items[i], 0 );
1294         }
1295
1296         citem = 0;
1297         kc_drawitem( &items[citem], 1 );
1298         
1299         WIN(ShowCursorW());
1300         MAC(show_cursor();)
1301
1302 #if defined(MACINTOSH) || defined(WINDOWS) 
1303         mouse_state = omouse_state = 0;
1304 #endif
1305
1306         while(1)                {
1307         //      Windows addendum to allow for kconfig input.
1308         #ifdef WINDOWS
1309                 {
1310                         MSG msg;
1311
1312                         DoMessageStuff(&msg);
1313
1314                         if (_RedrawScreen) {
1315                                 _RedrawScreen = FALSE;
1316
1317                                 dd_gr_set_current_canvas(NULL); 
1318
1319                                 goto KConfigPaint;
1320                         }
1321
1322                         DDGRRESTORE;
1323                 }
1324         #endif
1325                 gr_update();
1326
1327                 //see if redbook song needs to be restarted
1328                 songs_check_redbook_repeat();
1329
1330                 k = key_inkey();
1331                 
1332 #if defined(MACINTOSH) || defined(WINDOWS)
1333                 omouse_state = mouse_state;
1334                 mouse_state = mouse_button_state(0);
1335 #endif
1336                 
1337                 if ( !time_stopped ) {
1338                         #ifdef NETWORK
1339                         if (multi_menu_poll() == -1)
1340                                 k = -2;
1341                         #endif
1342                 }
1343                 ocitem = citem;
1344                 switch( k )     {
1345                 case KEY_BACKSP:
1346                         Int3();
1347                         break;
1348                 MAC(case KEY_COMMAND+KEY_SHIFTED+KEY_3:)
1349                 case KEY_PRINT_SCREEN:
1350                         save_screen_shot(0);
1351                         break;                                                  
1352                 case KEY_CTRLED+KEY_D:
1353                         items[citem].value = 255;
1354                         kc_drawitem( &items[citem], 1 );
1355                         break;
1356                 case KEY_CTRLED+KEY_R:  
1357                         if ( items==kc_keyboard )       {
1358                                 for (i=0; i<NUM_KEY_CONTROLS; i++ )             {
1359                                         items[i].value=default_kconfig_settings[0][i];
1360                                         kc_drawitem( &items[i], 0 );
1361                                 }
1362                         } else if ( items==kc_d2x ) {
1363                                 for(i=0;i<NUM_D2X_CONTROLS;i++)
1364                                 {
1365                                         items[i].value=default_kconfig_d2x_settings[i];
1366                                         kc_drawitem( &items[i], 0 );
1367                                 }
1368                         } else {
1369                                 #ifdef MACINTOSH
1370                           // hack for firebire and mousestick default controls since I made
1371                           // them the same control type -- dumb dumb dumb
1372                                 if (joy_have_firebird())
1373                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1374                                                 items[i].value = default_firebird_settings[i];
1375                                                 kc_drawitem( &items[i], 0 );
1376                                         }
1377                                 else if (joy_have_mousestick())
1378                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1379                                                 items[i].value = default_mousestick_settings[i];
1380                                                 kc_drawitem( &items[i], 0 );
1381                                         }
1382                                 else
1383                                 #endif  // note link to above else
1384                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1385                                                 items[i].value = default_kconfig_settings[Config_control_type][i];
1386                                                 kc_drawitem( &items[i], 0 );
1387                                         }
1388                         }
1389                         kc_drawitem( &items[citem], 1 );
1390                         break;
1391                 case KEY_DELETE:
1392                         items[citem].value=255;
1393                         kc_drawitem( &items[citem], 1 );
1394                         break;
1395                 case KEY_UP:            
1396                 case KEY_PAD8:
1397 #ifdef TABLE_CREATION
1398                         if (items[citem].u==-1) items[citem].u=find_next_item_up( items,nitems, citem);
1399 #endif
1400                         citem = items[citem].u; 
1401                         break;
1402                 
1403                 case KEY_DOWN:  
1404                 case KEY_PAD2:
1405 #ifdef TABLE_CREATION
1406                         if (items[citem].d==-1) items[citem].d=find_next_item_down( items,nitems, citem);
1407 #endif
1408                         citem = items[citem].d; 
1409                         break;
1410                 case KEY_LEFT:  
1411                 case KEY_PAD4:
1412 #ifdef TABLE_CREATION
1413                         if (items[citem].l==-1) items[citem].l=find_next_item_left( items,nitems, citem);
1414 #endif
1415                         citem = items[citem].l; 
1416                         break;
1417                 case KEY_RIGHT:         
1418                 case KEY_PAD6:
1419 #ifdef TABLE_CREATION
1420                         if (items[citem].r==-1) items[citem].r=find_next_item_right( items,nitems, citem);
1421 #endif
1422                         citem = items[citem].r; 
1423                         break;
1424                 case KEY_ENTER: 
1425                 case KEY_PADENTER:      
1426                         switch( items[citem].type )     {
1427                         case BT_KEY:            kc_change_key( &items[citem] ); break;
1428                         case BT_MOUSE_BUTTON:   kc_change_mousebutton( &items[citem] ); break;
1429                         case BT_MOUSE_AXIS:     kc_change_mouseaxis( &items[citem] ); break;
1430                         case BT_JOY_BUTTON:     kc_change_joybutton( &items[citem] ); break;
1431                         case BT_JOY_AXIS:       kc_change_joyaxis( &items[citem] ); break;
1432                         case BT_INVERT:         kc_change_invert( &items[citem] ); break;
1433                         }
1434                         break;
1435                 case -2:        
1436                 case KEY_ESC:
1437                         grd_curcanv->cv_font    = save_font;
1438
1439                 WIN(DEFINE_SCREEN(old_bg_pcx));
1440
1441                 WINDOS(
1442                         dd_gr_set_current_canvas(save_canvas),
1443                         gr_set_current_canvas( save_canvas )
1444                 );                      
1445                         keyd_repeat = old_keyd_repeat;
1446                         game_flush_inputs();
1447                         WIN( HideCursorW());
1448                         MAC( hide_cursor(); )
1449                         if (time_stopped)
1450                                 start_time();
1451                         return;
1452 #ifdef TABLE_CREATION
1453                 case KEY_DEBUGGED+KEY_F12:      {
1454                         FILE * fp;
1455                         for (i=0; i<NUM_KEY_CONTROLS; i++ )     {
1456                                 kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i);
1457                                 kc_keyboard[i].d = find_next_item_down( kc_keyboard,NUM_KEY_CONTROLS, i);
1458                                 kc_keyboard[i].l = find_next_item_left( kc_keyboard,NUM_KEY_CONTROLS, i);
1459                                 kc_keyboard[i].r = find_next_item_right( kc_keyboard,NUM_KEY_CONTROLS, i);
1460                         }
1461                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1462                                 kc_joystick[i].u = find_next_item_up( kc_joystick,NUM_OTHER_CONTROLS, i);
1463                                 kc_joystick[i].d = find_next_item_down( kc_joystick,NUM_OTHER_CONTROLS, i);
1464                                 kc_joystick[i].l = find_next_item_left( kc_joystick,NUM_OTHER_CONTROLS, i);
1465                                 kc_joystick[i].r = find_next_item_right( kc_joystick,NUM_OTHER_CONTROLS, i);
1466                         }
1467                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1468                                 kc_mouse[i].u = find_next_item_up( kc_mouse,NUM_OTHER_CONTROLS, i);
1469                                 kc_mouse[i].d = find_next_item_down( kc_mouse,NUM_OTHER_CONTROLS, i);
1470                                 kc_mouse[i].l = find_next_item_left( kc_mouse,NUM_OTHER_CONTROLS, i);
1471                                 kc_mouse[i].r = find_next_item_right( kc_mouse,NUM_OTHER_CONTROLS, i);
1472                         }
1473                         fp = fopen( "kconfig.cod", "wt" );
1474
1475                         fprintf( fp, "ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {\n" );
1476                         for (i=0; i<CONTROL_MAX_TYPES; i++ )    {
1477                                 int j;
1478                                 fprintf( fp, "{0x%x", kconfig_settings[i][0] );
1479                                 for (j=1; j<MAX_CONTROLS; j++ )
1480                                         fprintf( fp, ",0x%x", kconfig_settings[i][j] );
1481                                 fprintf( fp, "},\n" );
1482                         }
1483                         fprintf( fp, "};\n" );
1484                 
1485                         fprintf( fp, "\nkc_item kc_keyboard[NUM_KEY_CONTROLS] = {\n" );
1486                         for (i=0; i<NUM_KEY_CONTROLS; i++ )     {
1487                                 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1488                                         kc_keyboard[i].id, kc_keyboard[i].x, kc_keyboard[i].y, kc_keyboard[i].w1, kc_keyboard[i].w2,
1489                                         kc_keyboard[i].u, kc_keyboard[i].d, kc_keyboard[i].l, kc_keyboard[i].r,
1490                                         34, kc_keyboard[i].text, 34, btype_text[kc_keyboard[i].type] );
1491                         }
1492                         fprintf( fp, "};" );
1493
1494                         fprintf( fp, "\nkc_item kc_joystick[NUM_OTHER_CONTROLS] = {\n" );
1495                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1496                                 if (kc_joystick[i].type == BT_JOY_BUTTON)
1497                                         fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1498                                                 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1499                                                 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1500                                                 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1501                 else
1502                                         fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1503                                                 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1504                                                 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1505                                                 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1506                         }
1507                         fprintf( fp, "};" );
1508
1509                         fprintf( fp, "\nkc_item kc_mouse[NUM_OTHER_CONTROLS] = {\n" );
1510                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1511                                 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1512                                         kc_mouse[i].id, kc_mouse[i].x, kc_mouse[i].y, kc_mouse[i].w1, kc_mouse[i].w2,
1513                                         kc_mouse[i].u, kc_mouse[i].d, kc_mouse[i].l, kc_mouse[i].r,
1514                                         34, kc_mouse[i].text, 34, btype_text[kc_mouse[i].type] );
1515                         }
1516                         fprintf( fp, "};" );
1517
1518                         fclose(fp);
1519
1520                         }
1521                         break;
1522 #endif
1523                 }
1524
1525         #if defined (MACINTOSH) || defined(WINDOWS)
1526                 if ( (mouse_state && !omouse_state) || (mouse_state && omouse_state) ) {
1527                         int item_height;
1528                         
1529                         mouse_get_pos(&mx, &my);
1530                         for (i=0; i<nitems; i++ )       {
1531                                 item_height = get_item_height( &items[i] );
1532                                 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[i].x) + LHX(items[i].w1);
1533                                 x2 = x1 + LHX(items[i].w2);
1534                                 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[i].y);
1535                                 y2 = y1 + LHX(item_height);
1536                                 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1537                                         citem = i;
1538                                         break;
1539                                 }
1540                         }
1541                 }
1542                 else if ( !mouse_state && omouse_state ) {
1543                         int item_height;
1544                         
1545                         mouse_get_pos(&mx, &my);
1546                         item_height = get_item_height( &items[citem] );
1547                         x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[citem].x) + LHX(items[citem].w1);
1548                         x2 = x1 + LHX(items[citem].w2);
1549                         y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[citem].y);
1550                         y2 = y1 + LHY(item_height);
1551                         if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1552                                 WIN(HideCursorW());
1553                                 MAC(hide_cursor();)
1554                                 switch( items[citem].type )     {
1555                                 case BT_KEY:                            kc_change_key( &items[citem] ); break;
1556                                 case BT_MOUSE_BUTTON:   kc_change_mousebutton( &items[citem] ); break;
1557                                 case BT_MOUSE_AXIS:             kc_change_mouseaxis( &items[citem] ); break;
1558                                 case BT_JOY_BUTTON:             kc_change_joybutton( &items[citem] ); break;
1559                                 case BT_JOY_AXIS:               kc_change_joyaxis( &items[citem] ); break;
1560                                 case BT_INVERT:                         kc_change_invert( &items[citem] ); break;
1561                                 }
1562                                 MAC(show_cursor();)
1563                                 WIN(ShowCursorW());
1564                         } else {
1565                                 x1 = grd_curcanv->cv_bitmap.bm_x + close_x + 2;
1566                                 x2 = x1 + close_size - 2;
1567                                 y1 = grd_curcanv->cv_bitmap.bm_y + close_y + 2;
1568                                 y2 = y1 + close_size - 2;
1569                                 if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
1570                                         grd_curcanv->cv_font    = save_font;
1571                                         WINDOS(dd_gr_set_current_canvas( save_canvas ),
1572                                                         gr_set_current_canvas( save_canvas ));
1573                                         keyd_repeat = old_keyd_repeat;
1574                                         game_flush_inputs();
1575                                         WIN(HideCursorW());
1576                                         MAC(hide_cursor();)
1577                                         if (time_stopped)
1578                                                 start_time();
1579                                         return;
1580                                 }
1581                         }
1582
1583                 }
1584                 #endif          // MACINTOSH WINDOWS
1585                 
1586                 if (ocitem!=citem)      {
1587                         MAC(hide_cursor();)
1588                         WIN(HideCursorW());
1589                         kc_drawitem( &items[ocitem], 0 );
1590                         kc_drawitem( &items[citem], 1 );
1591                         WIN(ShowCursorW());
1592                         MAC(show_cursor();)
1593                 }
1594         }
1595 }
1596
1597
1598 void kc_drawitem( kc_item *item, int is_current )
1599 {
1600         int x, w, h, aw;
1601         char btext[16];
1602 //      PA_DFX (pa_set_frontbuffer_current());
1603 WIN(DDGRLOCK(dd_grd_curcanv));
1604
1605         if (is_current)
1606                 gr_set_fontcolor( BM_XRGB(20,20,29), -1 );
1607         else
1608                 gr_set_fontcolor( BM_XRGB(15,15,24), -1 );
1609    gr_string( LHX(item->x), LHY(item->y), item->text );
1610 WIN(DDGRUNLOCK(dd_grd_curcanv));
1611
1612         if (item->value==255) {
1613                 strcpy( btext, "" );
1614         } else {
1615                 switch( item->type )    {
1616                         case BT_KEY:
1617                                 strncpy( btext, key_text[item->value], 10 ); break;
1618                         case BT_MOUSE_BUTTON:
1619                                 #ifndef MACINTOSH
1620                                 //strncpy( btext, Text_string[mousebutton_text[item->value]], 10 ); break;
1621                                 strncpy( btext, (item->value <= 3)?Text_string[mousebutton_text[item->value]]:mousebutton_textra[item->value-3], 10 ); break;
1622                                 #else
1623                                 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1624                                 #endif
1625                         case BT_MOUSE_AXIS:
1626                                 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1627                         case BT_JOY_BUTTON:
1628 #ifndef MACINTOSH
1629         #ifdef WINDOWS
1630                                 if (joybutton_text[item->value] != -1) 
1631                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1632                                 else 
1633                                         sprintf( btext, "BTN%2d", item->value+1 );
1634         #else   
1635                                 if ( joybutton_text[item->value] !=-1 )
1636                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1637                                 else
1638                                         sprintf( btext, "BTN%d", item->value );
1639         #endif
1640 #else
1641                                 strncpy( btext, joy_btn_name( item->value ), 10);
1642                                 if (btext == NULL)
1643                                         sprintf( btext, "BTN%d", item->value );
1644 #endif
1645                                 break;
1646                         case BT_JOY_AXIS:
1647                                 strncpy( btext, Text_string[joyaxis_text[item->value]], 10 ); break;
1648                         case BT_INVERT:
1649                                 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1650                 }
1651         }
1652         if (item->w1) {
1653         WIN(DDGRLOCK(dd_grd_curcanv));
1654                 gr_get_string_size(btext, &w, &h, &aw  );
1655
1656                 if (is_current)
1657                         gr_setcolor( BM_XRGB(21,0,24) );
1658                 else
1659                         gr_setcolor( BM_XRGB(16,0,19) );
1660                 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1661                 
1662                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1663
1664                 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1665         
1666                 gr_string( x, LHY(item->y), btext );
1667 //              PA_DFX (pa_set_backbuffer_current());
1668
1669         WIN(DDGRUNLOCK(dd_grd_curcanv));
1670         }
1671 }
1672
1673
1674 static int looper=0;
1675
1676 void kc_drawquestion( kc_item *item )
1677 {
1678         int c, x, w, h, aw;
1679
1680 WIN(DDGRLOCK(dd_grd_curcanv));  
1681   // PA_DFX (pa_set_frontbuffer_current());
1682
1683         gr_get_string_size("?", &w, &h, &aw  );
1684
1685         c = BM_XRGB(21,0,24);
1686
1687         //@@gr_setcolor( gr_fade_table[fades[looper]*256+c] );
1688         gr_setcolor(BM_XRGB(21*fades[looper]/31,0,24*fades[looper]/31));
1689         looper++;
1690         if (looper>63) looper=0;
1691
1692         gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1693         
1694         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1695
1696         x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1697    
1698         gr_string( x, LHY(item->y), "?" );
1699 //      PA_DFX (pa_set_backbuffer_current());
1700 WIN(DDGRUNLOCK(dd_grd_curcanv));
1701 gr_update();
1702 }
1703
1704 void kc_change_key( kc_item * item )
1705 {
1706         int i,n,f,k;
1707         ubyte keycode;
1708
1709 WIN(DDGRLOCK(dd_grd_curcanv));
1710         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1711         
1712         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_KEY );
1713 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1714
1715         game_flush_inputs();
1716         keycode=255;
1717         k=255;
1718         
1719         while( (k!=KEY_ESC) && (keycode==255) ) 
1720         {                               
1721         #ifdef WINDOWS
1722                 {
1723                         MSG msg;
1724
1725                         DoMessageStuff(&msg);
1726                         DDGRRESTORE;
1727                 
1728                 }
1729         #endif
1730
1731                 #ifdef NETWORK
1732                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1733                         multi_menu_poll();
1734                 #endif
1735 //              if ( Game_mode & GM_MULTI )
1736 //                      GameLoop( 0, 0 );                               // Continue
1737                 k = key_inkey();
1738                 timer_delay(f0_1/10);
1739                 kc_drawquestion( item );
1740         
1741                 for (i=0; i<256; i++ )  {
1742                         if (keyd_pressed[i] && (strlen(key_text[i])>0)) {
1743                                 f = 0;
1744                                 for (n=0; n<sizeof(system_keys); n++ )
1745                                         if ( system_keys[n] == i )
1746                                                 f=1;
1747                                 if (!f) 
1748                                         keycode=i;
1749                         }
1750                 }
1751         }
1752
1753         if (k!=KEY_ESC) {
1754                 for (i=0; i<Num_items; i++ )    {
1755                         n = item - All_items;
1756                         if ( (i!=n) && (All_items[i].type==BT_KEY) && (All_items[i].value==keycode) )           {
1757                                 All_items[i].value = 255;
1758                                 kc_drawitem( &All_items[i], 0 );
1759                         }
1760                 }
1761                 item->value = keycode;
1762         }
1763         kc_drawitem( item, 1 );
1764
1765 WIN(DDGRLOCK(dd_grd_curcanv));
1766         gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) );
1767 WIN(DDGRUNLOCK(dd_grd_curcanv));
1768
1769         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1770
1771         game_flush_inputs();
1772
1773 }
1774
1775 void kc_change_joybutton( kc_item * item )
1776 {
1777         int n,i,k;
1778         ubyte code;
1779
1780 WIN(DDGRLOCK(dd_grd_curcanv));
1781         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1782         
1783         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_JBUTTON );
1784 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1785
1786         game_flush_inputs();
1787         code=255;
1788         k=255;
1789         
1790         while( (k!=KEY_ESC) && (code==255))     
1791         {                               
1792         #ifdef WINDOWS
1793                 {
1794                         MSG msg;
1795                         DoMessageStuff(&msg);
1796                         DDGRRESTORE;
1797                 }
1798         #endif
1799
1800                 #ifdef NETWORK
1801                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1802                         multi_menu_poll();
1803                 #endif
1804 //              if ( Game_mode & GM_MULTI )
1805 //                      GameLoop( 0, 0 );                               // Continue
1806                 k = key_inkey();
1807                 timer_delay(f0_1/10);
1808
1809                 if (k == KEY_PRINT_SCREEN)
1810                         save_screen_shot(0);
1811
1812                 kc_drawquestion( item );
1813
1814                 WIN(code = joydefsw_do_button());
1815                 
1816 #ifdef MACINTOSH
1817                 code = joy_do_buttons();
1818 #endif
1819                 
1820 #if !defined(WINDOWS) && !defined(MACINTOSH)
1821                 if (Config_control_type==CONTROL_THRUSTMASTER_FCS)      {
1822                         int axis[4];
1823                         joystick_read_raw_axis( JOY_ALL_AXIS, axis );
1824                         kconfig_read_fcs( axis[3] );
1825                         if ( joy_get_button_state(7) ) code = 7;
1826                         if ( joy_get_button_state(11) ) code = 11;
1827                         if ( joy_get_button_state(15) ) code = 15;
1828                         if ( joy_get_button_state(19) ) code = 19;
1829                         for (i=0; i<4; i++ )    {
1830                                 if ( joy_get_button_state(i) )
1831                                         code = i;
1832                         }
1833                 } else if (Config_control_type==CONTROL_FLIGHTSTICK_PRO) {
1834                         for (i=4; i<20; i++ )   {
1835                                 if ( joy_get_button_state(i)  ) {
1836                                         code = i;
1837                                         mprintf(( 0, "JB: %d\n", code ));
1838                                 }
1839                         }
1840                 } else {
1841                         for (i=0; i<MAX_BUTTONS; i++ )  {
1842                                 if ( joy_get_button_state(i) )
1843                                         code = i;
1844                         }
1845                 }
1846 #endif
1847         }
1848         if (code!=255)  {
1849                 for (i=0; i<Num_items; i++ )    {
1850                         n = item - All_items;
1851                         if ( (i!=n) && (All_items[i].type==BT_JOY_BUTTON) && (All_items[i].value==code) ) {
1852                                 All_items[i].value = 255;
1853                                 kc_drawitem( &All_items[i], 0 );
1854                         }
1855                 }
1856                 item->value = code;
1857         }
1858         kc_drawitem( item, 1 );
1859         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1860         game_flush_inputs();
1861 }
1862
1863 void kc_change_mousebutton( kc_item * item )
1864 {
1865         int n,i,b,k;
1866         ubyte code;
1867
1868 WIN(DDGRLOCK(dd_grd_curcanv));
1869         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1870         
1871         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_MBUTTON );
1872 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1873
1874
1875         game_flush_inputs();
1876         code=255;
1877         k=255;
1878         
1879         while( (k!=KEY_ESC) && (code==255))     
1880         {                               
1881         #ifdef WINDOWS
1882                 {
1883                         MSG msg;
1884                         DoMessageStuff(&msg);
1885                         DDGRRESTORE;
1886                 }
1887         #endif
1888
1889                 #ifdef NETWORK
1890                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1891                         multi_menu_poll();
1892                 #endif
1893 //              if ( Game_mode & GM_MULTI )
1894 //                      GameLoop( 0, 0 );                               // Continue
1895                 k = key_inkey();
1896                 timer_delay(f0_1/10);
1897
1898                 if (k == KEY_PRINT_SCREEN)
1899                         save_screen_shot(0);
1900
1901                 kc_drawquestion( item );
1902
1903                 b = mouse_get_btns();
1904                 for (i = 0; i < 16; i++ ) {
1905                         if ( b & (1<<i) )       
1906                                 code = i;
1907                 }
1908         }
1909         if (code!=255)  {
1910                 for (i=0; i<Num_items; i++ )    {
1911                         n = item - All_items;
1912                         if ( (i!=n) && (All_items[i].type==BT_MOUSE_BUTTON) && (All_items[i].value==code) )             {
1913                                 All_items[i].value = 255;
1914                                 kc_drawitem( &All_items[i], 0 );
1915                         }
1916                 }
1917                 item->value = code;
1918         }
1919         kc_drawitem( item, 1 );
1920         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1921         game_flush_inputs();
1922
1923 }
1924
1925 void kc_change_joyaxis( kc_item * item )
1926 {
1927 #ifdef __unix__
1928         int axis[MAX_AXES];
1929         int old_axis[MAX_AXES];
1930 #else
1931         int axis[JOY_NUM_AXES];
1932         int old_axis[JOY_NUM_AXES];
1933 #endif
1934         int n,i,k;
1935         ubyte code;
1936    WINDOS (
1937          int numaxis=7,
1938          int numaxis=6
1939         );
1940
1941 WIN(DDGRLOCK(dd_grd_curcanv));
1942         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1943         
1944         gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS );
1945 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1946
1947         game_flush_inputs();
1948         code=255;
1949         k=255;
1950
1951         WINDOS(
1952                 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, old_axis ),
1953                 joystick_read_raw_axis( JOY_ALL_AXIS, old_axis )
1954         );
1955
1956         while( (k!=KEY_ESC) && (code==255))     
1957         {                               
1958         #ifdef WINDOWS
1959                 {
1960                         MSG msg;
1961                         DoMessageStuff(&msg);
1962                         DDGRRESTORE;
1963                 }
1964         #endif
1965
1966                 #ifdef NETWORK
1967                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1968                         multi_menu_poll();
1969                 #endif
1970 //              if ( Game_mode & GM_MULTI )
1971 //                      GameLoop( 0, 0 );                               // Continue
1972                 k = key_inkey();
1973                 timer_delay(f0_1/10);
1974
1975                 if (k == KEY_PRINT_SCREEN)
1976                         save_screen_shot(0);
1977
1978                 kc_drawquestion( item );
1979
1980                 WINDOS(
1981                         joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, axis ),
1982                         joystick_read_raw_axis( JOY_ALL_AXIS, axis )
1983                 );
1984                 
1985                 for (i=0; i<numaxis; i++ )      {
1986 #if defined (MACINTOSH)
1987                         if ( abs(axis[i]-old_axis[i])>100 )     {
1988 #elif defined(WINDOWS)
1989                         if ( abs(axis[i]-old_axis[i])>1024 )    {
1990 #else 
1991                         if ( abs(axis[i]-old_axis[i])>200 )     {
1992 #endif
1993                                 code = i;
1994                                 con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i);
1995                         }
1996                         //old_axis[i] = axis[i];
1997                 }
1998                 for (i=0; i<Num_items; i++ )    
1999                  {
2000                         n = item - All_items;
2001                         if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) 
2002                                 code = 255;
2003                  }
2004         
2005         }
2006         if (code!=255)  {
2007                 for (i=0; i<Num_items; i++ )    {
2008                         n = item - All_items;
2009                         if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) {
2010                                 All_items[i].value = 255;
2011                                 kc_drawitem( &All_items[i], 0 );
2012                         }
2013                 }
2014
2015                 item->value = code;                                      
2016         }
2017         kc_drawitem( item, 1 );
2018         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2019         game_flush_inputs();
2020
2021 }
2022
2023 void kc_change_mouseaxis( kc_item * item )
2024 {
2025         int i,n,k;
2026         ubyte code;
2027         int dx,dy;
2028 #ifdef SDL_INPUT
2029         int dz;
2030 #endif
2031
2032 WIN(DDGRLOCK(dd_grd_curcanv));
2033         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
2034         
2035         gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS );
2036 WIN(DDGRUNLOCK(dd_grd_curcanv));        
2037
2038         game_flush_inputs();
2039         code=255;
2040         k=255;
2041
2042         mouse_get_delta( &dx, &dy );
2043
2044         while( (k!=KEY_ESC) && (code==255))     
2045         {                               
2046         #ifdef WINDOWS
2047                 {
2048                         MSG msg;
2049                         DoMessageStuff(&msg);
2050                         DDGRRESTORE;
2051                 }
2052         #endif
2053
2054                 #ifdef NETWORK
2055                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
2056                         multi_menu_poll();
2057                 #endif
2058 //              if ( Game_mode & GM_MULTI )
2059 //                      GameLoop( 0, 0 );                               // Continue
2060                 k = key_inkey();
2061                 timer_delay(f0_1/10);
2062
2063                 if (k == KEY_PRINT_SCREEN)
2064                         save_screen_shot(0);
2065
2066                 kc_drawquestion( item );
2067
2068 #ifdef SDL_INPUT
2069                 mouse_get_delta_z( &dx, &dy, &dz );
2070 #else
2071                 mouse_get_delta( &dx, &dy );
2072 #endif
2073                 if ( abs(dx)>20 ) code = 0;
2074                 if ( abs(dy)>20 ) code = 1;
2075 #ifdef SDL_INPUT
2076                 if ( abs(dz)>20 ) code = 2;
2077 #endif
2078         }
2079         if (code!=255)  {
2080                 for (i=0; i<Num_items; i++ )    {
2081                         n = item - All_items;
2082                         if ( (i!=n) && (All_items[i].type==BT_MOUSE_AXIS) && (All_items[i].value==code) )               {
2083                                 All_items[i].value = 255;
2084                                 kc_drawitem( &All_items[i], 0 );
2085                         }
2086                 }
2087                 item->value = code;
2088         }
2089         kc_drawitem( item, 1 );
2090         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2091         game_flush_inputs();
2092
2093 }
2094
2095
2096 void kc_change_invert( kc_item * item )
2097 {
2098         game_flush_inputs();
2099
2100         if (item->value)
2101                 item->value = 0;
2102         else 
2103                 item->value = 1;
2104
2105         kc_drawitem( item, 1 );
2106
2107 }
2108
2109 #include "screens.h"
2110
2111 void kconfig(int n, char * title)
2112 {
2113         int i;
2114         grs_bitmap *save_bm;
2115
2116         set_screen_mode( SCREEN_MENU );
2117
2118         kc_set_controls();
2119
2120         //save screen
2121         WIN(mouse_set_mode(0));
2122         WIN(dd_gr_set_current_canvas(NULL));
2123         
2124 #if defined(POLY_ACC)
2125         save_bm = gr_create_bitmap2( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h, grd_curcanv->cv_bitmap.bm_type, NULL );
2126 #else
2127         save_bm = gr_create_bitmap( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
2128 #endif
2129         Assert( save_bm != NULL );
2130         
2131         WIN(DDGRLOCK(dd_grd_curcanv));
2132                 gr_bm_bitblt(grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_w, 
2133                                                  0, 0, 0, 0, &grd_curcanv->cv_bitmap, save_bm );
2134         WIN(DDGRUNLOCK(dd_grd_curcanv));
2135
2136         switch(n)       {
2137         case 0:kconfig_sub( kc_keyboard, NUM_KEY_CONTROLS, title );break;
2138         case 1:kconfig_sub( kc_joystick, NUM_OTHER_CONTROLS, title );break;
2139         case 2:kconfig_sub( kc_mouse, NUM_OTHER_CONTROLS, title ); break;
2140         case 3:kconfig_sub( kc_superjoy, NUM_OTHER_CONTROLS, title); break;
2141         //added on 2/4/99 by Victor Rachels for new keys menu
2142         case 4:kconfig_sub( kc_d2x, NUM_D2X_CONTROLS, title ); break;
2143         //end this section addition - VR
2144         default:
2145                 Int3();
2146                 return;
2147         }
2148
2149         //restore screen
2150         WIN(mouse_set_mode(1));
2151         WIN(dd_gr_set_current_canvas(NULL));
2152         WIN(DDGRLOCK(dd_grd_curcanv));
2153                 gr_bitmap(0, 0, save_bm);
2154         WIN(DDGRUNLOCK(dd_grd_curcanv));
2155         gr_free_bitmap(save_bm);
2156
2157         reset_cockpit();                //force cockpit redraw next time
2158
2159         // Update save values...
2160         
2161         for (i=0; i<NUM_KEY_CONTROLS; i++ )     
2162                 kconfig_settings[0][i] = kc_keyboard[i].value;
2163
2164         if ( (Config_control_type>0) && (Config_control_type<5)) { 
2165                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
2166                         kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
2167         } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
2168                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
2169                         kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
2170         }
2171         else if (Config_control_type == CONTROL_WINJOYSTICK) {
2172                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
2173                         kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
2174         }
2175
2176         for (i=0; i<NUM_D2X_CONTROLS; i++)
2177                 kconfig_d2x_settings[i] = kc_d2x[i].value;
2178 }
2179
2180
2181 void kconfig_read_fcs( int raw_axis )
2182 {
2183         int raw_button, button, axis_min[4], axis_center[4], axis_max[4];
2184
2185         if (Config_control_type!=CONTROL_THRUSTMASTER_FCS) return;
2186
2187         joy_get_cal_vals(axis_min, axis_center, axis_max);
2188
2189         if ( axis_max[3] > 1 )
2190                 raw_button = (raw_axis*100)/axis_max[3];
2191         else
2192                 raw_button = 0;
2193
2194         if ( raw_button > 88 )
2195                 button = 0;
2196         else if ( raw_button > 63 )
2197                 button = 7;
2198         else if ( raw_button > 39 )
2199                 button = 11;
2200         else if ( raw_button > 15 )
2201                 button = 15;
2202         else    
2203                 button = 19;
2204
2205         kconfig_set_fcs_button( 19, button );
2206         kconfig_set_fcs_button( 15, button );
2207         kconfig_set_fcs_button( 11, button );
2208         kconfig_set_fcs_button( 7, button );
2209 }
2210                 
2211
2212 void kconfig_set_fcs_button( int btn, int button )
2213 {
2214         int state,time_down,upcount,downcount;
2215         state = time_down = upcount = downcount = 0;
2216
2217         if ( joy_get_button_state(btn) ) {
2218                 if ( btn==button )      {
2219                         state = 1;
2220                         time_down = FrameTime;
2221                 } else {
2222                         upcount=1;
2223                 }
2224         } else {
2225                 if ( btn==button )      {
2226                         state = 1;
2227                         time_down = FrameTime;
2228                         downcount=1;
2229                 } else {
2230                         upcount=1;
2231                 }
2232         }                               
2233                         
2234         joy_set_btn_values( btn, state, time_down, downcount, upcount );
2235                                         
2236 }
2237
2238
2239
2240 fix Last_angles_p = 0;
2241 fix Last_angles_b = 0;
2242 fix Last_angles_h = 0;
2243 ubyte Last_angles_read = 0;
2244
2245 extern int                      VR_sensitivity;
2246                                                 
2247 int VR_sense_range[3] = { 25, 50, 75 };
2248
2249 #if 0 //ndef MACINTOSH
2250 read_head_tracker()
2251 {
2252 #ifndef WINDOWS
2253
2254         fix yaw, pitch, roll;
2255         int buttons;
2256
2257 //------ read vfx1 helmet --------
2258         if (vfx1_installed) {
2259                 vfx_get_data(&yaw,&pitch,&roll,&buttons);
2260         } else if (iglasses_headset_installed)  {
2261                 iglasses_read_headset( &yaw, &pitch, &roll );
2262         } else if (Victor_headset_installed)   {
2263                 victor_read_headset_filtered( &yaw, &pitch, &roll );
2264         } else {
2265                 return;
2266         }
2267
2268         Use_player_head_angles = 0;
2269         if ( Last_angles_read ) {
2270                 fix yaw1 = yaw;
2271                 
2272                 yaw1 = yaw;
2273                 if ( (Last_angles_h < (F1_0/4) ) && (yaw > ((F1_0*3)/4) ) )     
2274                         yaw1 -= F1_0;
2275                 else if ( (yaw < (F1_0/4) ) && (Last_angles_h > ((F1_0*3)/4) ) )        
2276                         yaw1 += F1_0;
2277         
2278                 Controls.pitch_time     += fixmul((pitch- Last_angles_p)*VR_sense_range[VR_sensitivity],FrameTime);
2279                 Controls.heading_time+= fixmul((yaw1 -  Last_angles_h)*VR_sense_range[VR_sensitivity],FrameTime);
2280                 Controls.bank_time      += fixmul((roll - Last_angles_b)*VR_sense_range[VR_sensitivity],FrameTime);
2281         }
2282         Last_angles_read = 1;
2283         Last_angles_p = pitch;
2284         Last_angles_h = yaw;
2285         Last_angles_b = roll;
2286 #endif
2287 }
2288 #endif
2289
2290 #define PH_SCALE        8
2291
2292 #ifdef WINDOWS
2293 #define JOYSTICK_READ_TIME      (F1_0/40)               //      Read joystick at 40 Hz.
2294 #else
2295 #define JOYSTICK_READ_TIME      (F1_0/10)               //      Read joystick at 10 Hz.
2296 #endif
2297
2298 fix     LastReadTime = 0;
2299
2300 fix     joy_axis[7];
2301
2302 ubyte                   kc_use_external_control = 0;
2303 ubyte                           kc_enable_external_control = 0;
2304 ubyte                   kc_external_intno = 0;
2305 ext_control_info        *kc_external_control = NULL;
2306 ubyte                           *kc_external_name = NULL;
2307 ubyte                           kc_external_version = 0;
2308 extern int Automap_active;
2309
2310 void kconfig_init_external_controls(int intno, int address)
2311 {
2312         int i;
2313         kc_external_intno = intno;
2314         kc_external_control     = (ext_control_info *)address;
2315         kc_use_external_control = 1;
2316         kc_enable_external_control  = 1;
2317
2318         i = FindArg ( "-xname" );
2319         if ( i )        
2320                 kc_external_name = Args[i+1];
2321         else
2322                 kc_external_name = "External Controller";
2323
2324    for (i=0;i<strlen (kc_external_name);i++)
2325     if (kc_external_name[i]=='_')
2326           kc_external_name[i]=' '; 
2327
2328         i = FindArg ( "-xver" );
2329         if ( i )
2330                 kc_external_version = atoi(Args[i+1]);
2331         
2332         printf( "%s int: 0x%x, data: 0x%p, ver:%d\n", kc_external_name, kc_external_intno, kc_external_control, kc_external_version );
2333
2334 }
2335
2336 #if !defined(MACINTOSH)
2337 /*void kconfig_read_external_controls()
2338 {
2339         union REGS r;
2340
2341         if ( !kc_enable_external_control && !CybermouseActive) 
2342                 return;
2343
2344         if ( kc_external_version == 0 ) 
2345                 memset( kc_external_control, 0, sizeof(control_info) );
2346         else if ( kc_external_version > 0 )     {
2347                 memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 );
2348                 if ( kc_external_version > 1 ) {
2349                         // Write ship pos and angles to external controls...
2350                         ubyte *temp_ptr = (ubyte *)kc_external_control;
2351                         vms_vector *ship_pos;
2352                         vms_matrix *ship_orient;
2353                         memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
2354                         temp_ptr += sizeof(control_info)+sizeof(vms_angvec) + 64;
2355                         ship_pos = (vms_vector *)temp_ptr;
2356                         temp_ptr += sizeof(vms_vector);
2357                         ship_orient = (vms_matrix *)temp_ptr;
2358                         // Fill in ship postion...
2359                         *ship_pos = Objects[Players[Player_num].objnum].pos;
2360                         // Fill in ship orientation...
2361                         *ship_orient = Objects[Players[Player_num].objnum].orient;
2362                 }
2363         }
2364
2365         if ( Automap_active )                    // (If in automap...)
2366                 kc_external_control->automap_state = 1;
2367         memset(&r,0,sizeof(r));
2368
2369 #ifndef WINDOWS
2370   
2371    if (!CybermouseActive)
2372         int386 ( kc_external_intno, &r, &r);            // Read external info...
2373 //      else
2374   //            ReadOWL (kc_external_control);
2375
2376 #endif
2377
2378         if ( Player_num > -1 )  {
2379                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL);    // Turn off roll when turning
2380                 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING);   // Turn off leveling to nearest side.
2381                 Auto_leveling_on = 0;
2382
2383                 if ( kc_external_version > 0 ) {                
2384                         vms_matrix tempm, ViewMatrix;
2385                         vms_angvec * Kconfig_abs_movement;
2386                         char * oem_message;
2387         
2388                         Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
2389         
2390                         if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h )    {
2391                                 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
2392                                 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
2393                                 Objects[Players[Player_num].objnum].orient = ViewMatrix;                
2394                         }
2395                         oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
2396                         if (oem_message[0] != '\0' )
2397                                 HUD_init_message( oem_message );
2398                 }
2399         }
2400
2401         Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);                                               
2402         Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
2403         Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
2404         Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
2405         Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
2406         Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
2407         Controls.rear_view_down_count += kc_external_control->rear_view_down_count;     
2408         Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;     
2409         Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
2410         Controls.fire_primary_state |= kc_external_control->fire_primary_state;
2411         Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
2412         Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
2413         Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
2414         Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;     
2415         Controls.automap_down_count += kc_external_control->automap_down_count;
2416         Controls.automap_state |= kc_external_control->automap_state;
2417 } */
2418 #endif
2419
2420 #ifdef WINDOWS
2421 void controls_read_all_win()
2422 {
2423         int i;
2424         int slide_on, bank_on;
2425         int dx, dy;
2426         fix ctime;
2427         fix mouse_axis[2];
2428         int raw_joy_axis[7];
2429         int mouse_buttons;
2430         fix k0, k1, k2, k3, kp;
2431         fix k4, k5, k6, k7, kh;
2432         ubyte channel_masks;
2433         int use_mouse, use_joystick;
2434         int speed_factor=1;
2435
2436         if (Game_turbo_mode)
2437                 speed_factor = 2;
2438         
2439         {
2440                 fix temp = Controls.heading_time;
2441                 fix temp1 = Controls.pitch_time;
2442                 memset( &Controls, 0, sizeof(control_info) );
2443                 Controls.heading_time = temp;
2444                 Controls.pitch_time = temp1;
2445         }
2446         slide_on = 0;
2447         bank_on = 0;
2448
2449         ctime = timer_get_fixed_seconds();
2450
2451 //      DO JOYSTICK (X,Y,Z  R,U,V)
2452 //      ----------------------------------------------------------------------------
2453         if ( (LastReadTime + JOYSTICK_READ_TIME) > ctime ) {
2454                 if ((ctime < 0) && (LastReadTime > 0))
2455                         LastReadTime = ctime;
2456                 use_joystick=1;
2457         } else if ((Config_control_type==CONTROL_WINJOYSTICK)) {
2458                 LastReadTime = ctime;
2459                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, raw_joy_axis );
2460
2461                 for (i=0; i<7; i++ )    {
2462                         if (channel_masks&(1<<i))       {
2463                                 int joy_null_value = 28;
2464
2465                         // DO POV if joystick has a hat.
2466                         //      --------------------------------------------------------------------
2467                                 if (i == 3) {
2468                                         joydefsw_do_winjoybutton(raw_joy_axis);
2469                                 }
2470                                 else {
2471                                 // DO AXIS
2472                                 //      --------------------------------------------------------------------    
2473                                 //      mprintf((0, "(%d)=%d,", i, raw_joy_axis[i]));
2474                                         raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
2475                                 //      mprintf((0, "%d  ",raw_joy_axis[i]));
2476                                 //      if (i%2) mprintf((0,"\n"));
2477
2478         
2479                                         if (kc_superjoy[23].value==i)           // If this is the throttle
2480                                                 joy_null_value = 32;                            // Then use a larger dead-zone
2481         
2482                                         if (raw_joy_axis[i] > (joy_null_value-2)) 
2483                                                 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
2484                                         else if (raw_joy_axis[i] < -(joy_null_value+2))
2485                                                 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
2486                                         else
2487                                                 raw_joy_axis[i] = 0;
2488                                         joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
2489                                 }
2490                         } else {
2491                                 joy_axis[i] = 0;
2492                         }
2493                 }       
2494                 use_joystick=1;
2495
2496         } else {
2497                 for (i=0; i<6; i++ )
2498                         joy_axis[i] = 0;
2499                 use_joystick=0;
2500         }
2501
2502 //      DO MOUSE 
2503 //      ----------------------------------------------------------------------------
2504         if (Config_control_type==5) {
2505                 mouse_get_delta( &dx, &dy );
2506                 mouse_axis[0] = (dx*FrameTime)/35;
2507                 mouse_axis[1] = (dy*FrameTime)/25;
2508                 mouse_buttons = mouse_get_btns();
2509                 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
2510                 use_mouse=1;
2511    } else {
2512                 mouse_axis[0] = 0;
2513                 mouse_axis[1] = 0;
2514                 mouse_buttons = 0;
2515                 use_mouse=0;
2516         }
2517
2518 //------------- Read slide_on -------------
2519         
2520         // From keyboard...
2521         if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
2522         if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
2523         // From joystick...
2524         if ((use_joystick)&&(kc_superjoy[5].value<255)) slide_on |= joy_get_button_state( kc_superjoy[5].value );
2525         // From mouse...
2526         if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
2527
2528 //------------- Read bank_on ---------------
2529
2530         // From keyboard...
2531         if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
2532         if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
2533         // From joystick...
2534         if ( (use_joystick)&&(kc_superjoy[10].value < 255 )) bank_on |= joy_get_button_state( kc_superjoy[10].value );
2535         // From mouse...
2536         if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
2537
2538 //------------ Read pitch_time -----------
2539         if ( !slide_on )        {
2540                 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2541                 kp = 0;
2542                 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2;      // Divide by two since we want pitch to go slower
2543                 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
2544                 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
2545                 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
2546
2547                 // From keyboard...
2548                 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
2549                 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
2550                 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
2551                 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
2552
2553                 // From Cyberman...
2554                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2555                         kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
2556                         kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
2557                 }
2558         
2559                 if (kp == 0)
2560                         Controls.pitch_time = 0;
2561                 else if (kp > 0) {
2562                         if (Controls.pitch_time < 0)
2563                                 Controls.pitch_time = 0;
2564                 } else // kp < 0
2565                         if (Controls.pitch_time > 0)
2566                                 Controls.pitch_time = 0;
2567                 Controls.pitch_time += kp;
2568         
2569                 // From joystick...
2570                 if ( (use_joystick)&&(kc_superjoy[13].value < 255 ))    {
2571                         if ( !kc_superjoy[14].value )           // If not inverted...
2572                                 Controls.pitch_time -= (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2573                         else
2574                                 Controls.pitch_time += (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2575                 }
2576         
2577                 // From mouse...
2578                 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
2579                 if ( (use_mouse)&&(kc_mouse[13].value < 255) )  {
2580                         if ( !kc_mouse[14].value )              // If not inverted...
2581                                 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2582                         else
2583                                 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2584                 }
2585         } else {
2586                 Controls.pitch_time = 0;
2587         }
2588
2589
2590 //----------- Read vertical_thrust_time -----------------
2591
2592         if ( slide_on ) {
2593                 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
2594                 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
2595                 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
2596                 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
2597
2598                 // From keyboard...
2599                 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
2600                 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
2601                 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
2602                 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
2603
2604                 // From Cyberman...
2605                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2606                         Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
2607                         Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
2608                 }
2609         
2610                 // From joystick...
2611                 if ((use_joystick)&&( kc_superjoy[13].value < 255 ))    {
2612                         if ( !kc_superjoy[14].value )           // If not inverted...
2613                                 Controls.vertical_thrust_time += joy_axis[kc_superjoy[13].value];
2614                         else
2615                                 Controls.vertical_thrust_time -= joy_axis[kc_superjoy[13].value];
2616                 }
2617         
2618                 // From mouse...
2619                 if ( (use_mouse)&&(kc_mouse[13].value < 255 ))  {
2620                         if ( !kc_mouse[14].value )              // If not inverted...
2621                                 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
2622                         else
2623                                 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
2624                 }
2625         }
2626
2627         // From keyboard...
2628         if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
2629         if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
2630         if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
2631         if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
2632         
2633         // From joystick...
2634         if ((use_joystick)&&( kc_superjoy[19].value < 255 ))    {
2635                 if ( !kc_superjoy[20].value )           // If not inverted...
2636                         Controls.vertical_thrust_time += joy_axis[kc_superjoy[19].value];
2637                 else
2638                         Controls.vertical_thrust_time -= joy_axis[kc_superjoy[19].value];
2639         }
2640
2641         // From joystick buttons
2642         if ( (use_joystick)&&(kc_superjoy[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_superjoy[8].value );
2643         if ( (use_joystick)&&(kc_superjoy[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_superjoy[9].value );
2644
2645         // From mouse buttons
2646         if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
2647         if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
2648
2649         // From mouse...
2650         if ( (use_mouse)&&(kc_mouse[19].value < 255 ))  {
2651                 if ( !kc_mouse[20].value )              // If not inverted...
2652                         Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
2653                 else
2654                         Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
2655         }
2656
2657         // From Cyberman...
2658         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2659                 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
2660                 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
2661         }
2662
2663 //---------- Read heading_time -----------
2664
2665         if (!slide_on && !bank_on)      {
2666                 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2667                 kh = 0;
2668                 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
2669                 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
2670                 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
2671                 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
2672
2673                 // From keyboard...
2674                 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
2675                 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
2676                 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
2677                 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
2678
2679                 // From Cyberman...
2680                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2681                         kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
2682                         kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
2683                 }
2684         
2685                 if (kh == 0)
2686                         Controls.heading_time = 0;
2687                 else if (kh > 0) {
2688                         if (Controls.heading_time < 0)
2689                                 Controls.heading_time = 0;
2690                 } else // kh < 0
2691                         if (Controls.heading_time > 0)
2692                                 Controls.heading_time = 0;
2693                 Controls.heading_time += kh;
2694
2695                 // From joystick...
2696                 if ( (use_joystick)&&(kc_superjoy[15].value < 255 ))    {
2697                         if ( !kc_superjoy[16].value )           // If not inverted...
2698                                 Controls.heading_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2699                         else
2700                                 Controls.heading_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2701                 }
2702         
2703                 // From mouse...
2704                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
2705                         if ( !kc_mouse[16].value )              // If not inverted...
2706                                 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2707                         else
2708                                 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2709                 }
2710         } else {
2711                 Controls.heading_time = 0;
2712         }
2713
2714 //----------- Read sideways_thrust_time -----------------
2715
2716         if ( slide_on ) {
2717                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2718                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2719                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2720                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2721
2722                 // From keyboard...
2723                 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
2724                 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
2725                 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
2726                 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
2727         
2728                 // From joystick...
2729                 if ( (use_joystick)&&(kc_superjoy[15].value < 255 ))    {
2730                         if ( !kc_superjoy[16].value )           // If not inverted...
2731                                 Controls.sideways_thrust_time += joy_axis[kc_superjoy[15].value];
2732                         else
2733                                 Controls.sideways_thrust_time -= joy_axis[kc_superjoy[15].value];
2734                 }
2735                 
2736                 // From cyberman
2737                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2738                         Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
2739                         Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
2740                 }
2741         
2742                 // From mouse...
2743                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
2744                         if ( !kc_mouse[16].value )              // If not inverted...
2745                                 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
2746                         else
2747                                 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
2748                 }
2749         }
2750
2751         // From keyboard...
2752         if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
2753         if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
2754         if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
2755         if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
2756         
2757         // From joystick...
2758         if ( (use_joystick)&&(kc_superjoy[17].value < 255 ))    {
2759                 if ( !kc_superjoy[18].value )           // If not inverted...
2760                         Controls.sideways_thrust_time -= joy_axis[kc_superjoy[17].value];
2761                 else
2762                         Controls.sideways_thrust_time += joy_axis[kc_superjoy[17].value];
2763         }
2764
2765         // From joystick buttons
2766         if ( (use_joystick)&&(kc_superjoy[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_superjoy[6].value );
2767         if ( (use_joystick)&&(kc_superjoy[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_superjoy[7].value );
2768
2769         // From mouse buttons
2770         if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
2771         if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
2772
2773         // From mouse...
2774         if ( (use_mouse)&&(kc_mouse[17].value < 255 ))  {
2775                 if ( !kc_mouse[18].value )              // If not inverted...
2776                         Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
2777                 else
2778                         Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
2779         }
2780
2781 //----------- Read bank_time -----------------
2782
2783         if ( bank_on )  {
2784                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2785                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2786                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2787                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2788
2789                 // From keyboard...
2790                 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
2791                 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
2792                 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
2793                 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
2794
2795                 // From Cyberman...
2796                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2797                         Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
2798                         Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
2799                 }
2800
2801                 // From joystick...
2802                 if ( (use_joystick)&&(kc_superjoy[15].value < 255) )    {
2803                         if ( !kc_superjoy[16].value )           // If not inverted...
2804                                 Controls.bank_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2805                         else
2806                                 Controls.bank_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2807                 }
2808         
2809                 // From mouse...
2810                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
2811                         if ( !kc_mouse[16].value )              // If not inverted...
2812                                 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2813                         else
2814                                 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2815                 }
2816         }
2817
2818         // From keyboard...
2819         if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
2820         if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
2821         if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
2822         if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
2823
2824         // From joystick...
2825         if ( (use_joystick)&&(kc_superjoy[21].value < 255) )    {
2826                 if ( !kc_superjoy[22].value )           // If not inverted...
2827                         Controls.bank_time -= joy_axis[kc_superjoy[21].value];
2828                 else
2829                         Controls.bank_time += joy_axis[kc_superjoy[21].value];
2830         }
2831
2832         // From joystick buttons
2833         if ( (use_joystick)&&(kc_superjoy[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_superjoy[11].value );
2834         if ( (use_joystick)&&(kc_superjoy[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_superjoy[12].value );
2835
2836         // From mouse buttons
2837         if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
2838         if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
2839
2840         // From mouse...
2841         if ( (use_mouse)&&(kc_mouse[21].value < 255 ))  {
2842                 if ( !kc_mouse[22].value )              // If not inverted...
2843                         Controls.bank_time += mouse_axis[kc_mouse[21].value];
2844                 else
2845                         Controls.bank_time -= mouse_axis[kc_mouse[21].value];
2846         }
2847
2848         // From Cyberman
2849         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
2850                 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
2851                 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
2852         }
2853
2854 //----------- Read forward_thrust_time -------------
2855
2856         // From keyboard...
2857         if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
2858         if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
2859         if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
2860         if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
2861
2862         // From joystick...
2863         if ( (use_joystick)&&(kc_superjoy[23].value < 255 ))    {
2864                 if ( !kc_superjoy[24].value )           // If not inverted...
2865                         Controls.forward_thrust_time -= joy_axis[kc_superjoy[23].value];
2866                 else
2867                         Controls.forward_thrust_time += joy_axis[kc_superjoy[23].value];
2868         }
2869
2870         // From joystick buttons
2871         if ( (use_joystick)&&(kc_superjoy[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_superjoy[2].value );
2872         if ( (use_joystick)&&(kc_superjoy[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_superjoy[3].value );
2873
2874         // From mouse...
2875         if ( (use_mouse)&&(kc_mouse[23].value < 255 ))  {
2876                 if ( !kc_mouse[24].value )              // If not inverted...
2877                         Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
2878                 else
2879                         Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
2880         }
2881
2882         // From mouse buttons
2883         if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
2884         if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
2885
2886 //----------- Read afterburner_state -------------
2887
2888         // From keyboard...
2889         if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
2890         if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
2891
2892         if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
2893
2894         if ( (use_joystick)&&(kc_superjoy[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_superjoy[27].value);
2895
2896 //-------Read headlight key--------------------------
2897         if (kc_keyboard[52].value < 255 )
2898                    Controls.headlight_count=key_down_count(kc_keyboard[52].value);
2899         if (kc_keyboard[53].value < 255 )
2900                    Controls.headlight_count=key_down_count(kc_keyboard[53].value);
2901                   if ((use_joystick)&&(kc_superjoy[30].value < 255 )) 
2902          Controls.headlight_count=joy_get_button_down_cnt(kc_superjoy[30].value);
2903                  
2904 //--------Read Cycle Primary Key------------------
2905
2906                   if (kc_keyboard[48].value<255)
2907                          Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
2908                   if (kc_keyboard[49].value<255)
2909                         Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
2910              if ((use_joystick)&&(kc_superjoy[28].value < 255 )) 
2911          Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_superjoy[28].value);
2912
2913 //--------Read Cycle Secondary Key------------------
2914
2915                   if (kc_keyboard[50].value<255)
2916                          Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
2917                   if (kc_keyboard[51].value<255)
2918                         Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
2919              if ((use_joystick)&&(kc_superjoy[29].value < 255 )) 
2920                         Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_superjoy[29].value);
2921
2922 //--------Read Toggle Bomb key----------------------
2923
2924                   if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
2925          {
2926           int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
2927
2928                          if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
2929                                   !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
2930                            {
2931                                  digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2932                                  HUD_init_message ("No bombs available!");
2933                                 }
2934                          else
2935                                 {       
2936                                  if (Players[Player_num].secondary_ammo[bomb]==0)
2937                                         {
2938                                          digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2939                                          HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
2940                                         }
2941                                   else
2942                                         {
2943                                Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
2944                                          digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
2945                                         }
2946                                 }
2947                         }
2948           
2949 //---------Read Energy->Shield key----------
2950
2951         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
2952                 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
2953         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
2954                 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
2955
2956 //----------- Read fire_primary_down_count
2957         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
2958         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
2959         if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_superjoy[0].value);
2960         if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
2961
2962 //----------- Read fire_primary_state
2963         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
2964         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
2965         if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_superjoy[0].value);
2966         if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
2967
2968 //----------- Read fire_secondary_down_count
2969         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
2970         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
2971         if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_superjoy[1].value);
2972         if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
2973
2974 //----------- Read fire_secondary_state
2975         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
2976         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
2977         if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_superjoy[1].value);
2978         if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
2979
2980 //----------- Read fire_flare_down_count
2981         if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
2982         if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
2983         if ((use_joystick)&&(kc_superjoy[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_superjoy[4].value);
2984         if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
2985
2986 //----------- Read drop_bomb_down_count
2987         if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
2988         if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
2989         if ((use_joystick)&&(kc_superjoy[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_superjoy[26].value);
2990         if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
2991
2992 //----------- Read rear_view_down_count
2993         if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
2994         if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
2995         if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_superjoy[25].value);
2996         if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
2997
2998 //----------- Read rear_view_down_state
2999         if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3000         if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3001         if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_superjoy[25].value);
3002         if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3003
3004 //----------- Read automap_down_count
3005         if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3006         if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3007
3008 //----------- Read automap_state
3009         if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3010         if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3011
3012 //----------- Read stupid-cruise-control-type of throttle.
3013         {
3014                 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3015                 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3016                 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3017                 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3018                 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3019                         Cruise_speed = 0;
3020                 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3021                         Cruise_speed = 0;
3022         
3023                 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3024                 if (Cruise_speed < 0 ) Cruise_speed = 0;
3025         
3026                 if (Controls.forward_thrust_time==0)
3027                         Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3028         }
3029
3030         //read_head_tracker();
3031
3032         // Read external controls
3033         if (kc_use_external_control || CybermouseActive)
3034                 kconfig_read_external_controls();
3035
3036 //----------- Clamp values between -FrameTime and FrameTime
3037         if (FrameTime > F1_0 )
3038                 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3039
3040         if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3041         if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3042         if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3043         if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3044         if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3045         if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3046 //      if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3047
3048         if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3049         if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3050         if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3051         if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3052         if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3053         if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3054 //      if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3055
3056
3057 //--------- Don't do anything if in debug mode
3058         #ifndef RELEASE
3059         if ( keyd_pressed[KEY_DELETE] ) {
3060                 memset( &Controls, 0, sizeof(control_info) );
3061         }
3062         #endif
3063 }
3064 #else
3065
3066
3067 fix Next_toggle_time[3]={0,0,0};
3068
3069 int allowed_to_toggle(int i)
3070 {
3071   //used for keeping tabs of when its ok to toggle headlight,primary,and secondary
3072  
3073         if (Next_toggle_time[i] > GameTime)
3074                 if (Next_toggle_time[i] < GameTime + (F1_0/8))  //      In case time is bogus, never wait > 1 second.
3075                         return 0;
3076
3077         Next_toggle_time[i] = GameTime + (F1_0/8);
3078
3079         return 1;
3080 }
3081
3082
3083 //added on 2/7/99 by Victor Rachels for jostick state setting
3084 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};
3085 //end this section adition - VR
3086
3087
3088 void controls_read_all()
3089 {
3090         int i;
3091         int slide_on, bank_on;
3092         int dx, dy;
3093 #ifdef SDL_INPUT
3094         int dz;
3095 #endif
3096         int idx, idy;
3097         fix ctime;
3098         fix mouse_axis[3] = {0,0,0};
3099 #ifdef __unix__
3100         int raw_joy_axis[MAX_AXES];
3101 #else
3102         int raw_joy_axis[JOY_NUM_AXES];
3103 #endif
3104         int mouse_buttons;
3105         fix k0, k1, k2, k3, kp;
3106         fix k4, k5, k6, k7, kh;
3107         ubyte channel_masks;
3108         int use_mouse, use_joystick;
3109         int speed_factor=1;
3110
3111         mouse_buttons=0;
3112         use_mouse=0;
3113
3114         if (Game_turbo_mode)
3115                 speed_factor = 2;
3116         
3117         {
3118                 fix temp = Controls.heading_time;
3119                 fix temp1 = Controls.pitch_time;
3120                 memset( &Controls, 0, sizeof(control_info) );
3121                 Controls.heading_time = temp;
3122                 Controls.pitch_time = temp1;
3123         }
3124         slide_on = 0;
3125         bank_on = 0;
3126
3127         ctime = timer_get_fixed_seconds();
3128
3129         //---------  Read Joystick -----------
3130 #ifndef MACINTOSH
3131         if ( (LastReadTime + JOYSTICK_READ_TIME > ctime) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) ) {
3132                 if ((ctime < 0) && (LastReadTime > 0))
3133                         LastReadTime = ctime;
3134                 use_joystick=1;
3135         } else if ((Config_control_type>0) && (Config_control_type<5) ) {
3136                 LastReadTime = ctime;
3137                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3138                 
3139                 for (i=0; i<6; i++ )    {
3140 #ifndef SDL_INPUT
3141                         if (channel_masks&(1<<i))       {
3142 #endif
3143                                 int joy_null_value = 10;
3144
3145                                 if ( (i==3) && (Config_control_type==CONTROL_THRUSTMASTER_FCS) )        {
3146                                         kconfig_read_fcs( raw_joy_axis[i] );
3147                                 } else {
3148                                         raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3149         
3150                                         if (kc_joystick[23].value==i)           // If this is the throttle
3151                                                 joy_null_value = 20;            // Then use a larger dead-zone
3152         
3153                                         if (raw_joy_axis[i] > joy_null_value) 
3154                                           raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3155                                         else if (raw_joy_axis[i] < -joy_null_value)
3156                                           raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3157                                         else
3158                                           raw_joy_axis[i] = 0;
3159                                         joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
3160                                 }
3161 #ifndef SDL_INPUT
3162                         } else {
3163                                 joy_axis[i] = 0;
3164                         }
3165 #endif
3166                 }       
3167                 use_joystick=1;
3168         } else {
3169                 for (i=0; i<4; i++ )
3170                         joy_axis[i] = 0;
3171                 use_joystick=0;
3172         }
3173 #else   // MACINTOSH
3174         //---------  Read Joystick -----------
3175         if ((Config_control_type>0) && (Config_control_type<5) ) {
3176                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3177                 for (i=0; i<4; i++ )    {
3178                         if (channel_masks&(1<<i))       {
3179                                 int joy_null_value = 10;
3180
3181                                 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3182
3183                                 if (kc_joystick[23].value==i)           // If this is the throttle
3184                                         joy_null_value = 20;                            // Then use a larger dead-zone
3185
3186                                 if (raw_joy_axis[i] > joy_null_value) 
3187                                         raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3188                                 else if (raw_joy_axis[i] < -joy_null_value)
3189                                         raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3190                                 else
3191                                         raw_joy_axis[i] = 0;
3192                                 joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
3193                         } else {
3194                                 joy_axis[i] = 0;
3195                         }
3196                 }       
3197                 use_joystick=1;
3198         } else {
3199                 for (i=0; i<4; i++ )
3200                         joy_axis[i] = 0;
3201                 use_joystick=0;
3202         }
3203 #endif          // ifndef MACINTOSH