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