1 /* $Id: kconfig.c,v 1.27 2003-12-18 11:24:04 btb Exp $ */
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.
17 * Routines to configure keyboard, joystick, etc..
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
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
28 * Revision 1.16 1995/10/24 18:10:22 allender
29 * get mouse stuff working right this time?
31 * Revision 1.15 1995/10/23 14:50:50 allender
32 * corrected values for control type in kc_set_controls
34 * Revision 1.14 1995/10/21 16:36:54 allender
35 * fix up mouse read time
37 * Revision 1.13 1995/10/20 00:46:53 allender
38 * fix up mouse reading problem
40 * Revision 1.12 1995/10/19 13:36:38 allender
41 * mouse support in kconfig screens
43 * Revision 1.11 1995/10/18 21:06:06 allender
44 * removed Int3 in cruise stuff -- was in there for debugging and
47 * Revision 1.10 1995/10/17 13:12:47 allender
48 * fixed config menus so buttons don't get configured
50 * Revision 1.9 1995/10/15 23:07:55 allender
51 * added return key as second button for primary fire
53 * Revision 1.8 1995/09/05 08:49:47 allender
54 * change 'PADRTN' label to 'ENTER'
56 * Revision 1.7 1995/09/01 15:38:22 allender
57 * took out cap of reading controls max 25 times/sec
59 * Revision 1.6 1995/09/01 13:33:59 allender
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
66 * Revision 1.4 1995/07/28 15:43:13 allender
67 * make mousebutton control primary fire
69 * Revision 1.3 1995/07/26 17:04:32 allender
70 * new defaults and make joystick main button work correctly
72 * Revision 1.2 1995/07/17 08:51:03 allender
73 * fixed up configuration menus to look right
75 * Revision 1.1 1995/05/16 15:26:56 allender
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.
82 * Revision 2.10 1995/07/07 16:48:01 john
83 * Fixed bug with new interface.
85 * Revision 2.9 1995/07/03 15:02:32 john
86 * Added new version of external controls for Cybermouse absolute position.
88 * Revision 2.8 1995/06/30 12:30:28 john
89 * Added -Xname command line.
91 * Revision 2.7 1995/03/30 16:36:56 mike
94 * Revision 2.6 1995/03/21 14:39:31 john
95 * Ifdef'd out the NETWORK code.
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.
101 * Revision 2.4 1995/03/10 13:47:24 john
102 * Added head tracking sensitivity.
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.
108 * Revision 2.2 1995/03/08 15:32:39 john
109 * Made VictorMaxx head tracking use Greenleaf code.
111 * Revision 2.1 1995/03/06 15:23:31 john
112 * New screen techniques.
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.
118 * Revision 1.105 1995/02/22 14:11:58 allender
119 * remove anonymous unions from object structure
121 * Revision 1.104 1995/02/13 12:01:56 john
122 * Fixed bug with buggin not mmaking player faster.
124 * Revision 1.103 1995/02/09 22:00:46 john
125 * Added i-glasses tracking.
127 * Revision 1.102 1995/01/24 21:25:47 john
128 * Fixed bug with slide/bank on not working with
131 * Revision 1.101 1995/01/24 16:09:56 john
132 * Fixed bug with Wingman extreme customize text overwriting title.
134 * Revision 1.100 1995/01/24 12:37:46 john
135 * Made Esc exit key define menu.
137 * Revision 1.99 1995/01/23 23:54:43 matt
138 * Made keypad enter work
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.
144 * Revision 1.97 1995/01/12 11:41:33 john
145 * Added external control reading.
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.
151 * Revision 1.95 1994/12/29 11:17:38 john
152 * Took out some warnings and mprintf.
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.
160 * Revision 1.93 1994/12/27 12:16:20 john
161 * Fixed bug with slide on not working with joystick or mouse buttons.
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.
167 * Revision 1.91 1994/12/16 00:11:23 matt
168 * Made delete key act normally when debug out
170 * Revision 1.90 1994/12/14 17:41:15 john
171 * Added more buttons so that Yoke would work.
173 * Revision 1.89 1994/12/13 17:25:35 allender
174 * Added Assert for bogus time for joystick reading.
176 * Revision 1.88 1994/12/13 14:48:01 john
177 * Took out some debugging mprintf's
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.
184 * Revision 1.86 1994/12/13 01:11:32 john
185 * Fixed bug with message clearing overwriting
188 * Revision 1.85 1994/12/12 00:35:58 john
189 * Added or thing for keys.
191 * Revision 1.84 1994/12/09 17:08:06 john
192 * Made mouse a bit less sensitive.
194 * Revision 1.83 1994/12/09 16:04:00 john
195 * Increased mouse sensitivity.
197 * Revision 1.82 1994/12/09 00:41:26 mike
198 * fix hang in automap print screen
200 * Revision 1.81 1994/12/08 11:50:37 john
201 * Made strcpy only copy corect number of chars,.
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.
206 * Revision 1.79 1994/12/07 14:52:28 yuan
209 * Revision 1.78 1994/12/07 13:37:40 john
210 * Made the joystick thrust work in reverse.
212 * Revision 1.77 1994/12/07 11:28:24 matt
213 * Did a little localization support
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.
219 * Revision 1.75 1994/12/03 22:35:25 yuan
222 * Revision 1.74 1994/12/03 15:39:24 john
223 * Made numeric keypad move in conifg.
225 * Revision 1.73 1994/12/01 16:23:39 john
226 * Fixed include mistake.
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.
232 * Revision 1.71 1994/12/01 12:30:49 john
233 * Made Ctrl+D delete, not Ctrl+E
235 * Revision 1.70 1994/12/01 11:52:52 john
236 * Added default values for GamePad.
238 * Revision 1.69 1994/11/30 00:59:12 mike
241 * Revision 1.68 1994/11/29 03:45:50 john
242 * Added joystick sensitivity; Added sound channels to detail menu. Removed -maxchannels
245 * Revision 1.67 1994/11/27 23:13:44 matt
246 * Made changes for new mprintf calling convention
248 * Revision 1.66 1994/11/27 19:52:12 matt
249 * Made screen shots work in a few more places
251 * Revision 1.65 1994/11/22 16:54:50 mike
252 * autorepeat on missiles.
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.
258 * Revision 1.63 1994/11/19 15:14:48 mike
259 * remove unused code and data
261 * Revision 1.62 1994/11/18 23:37:56 john
262 * Changed some shorts to ints.
264 * Revision 1.61 1994/11/17 13:36:35 rob
265 * Added better network hook in kconfig menu.
267 * Revision 1.60 1994/11/14 20:09:13 john
268 * Made Tab be default for automap.
270 * Revision 1.59 1994/11/13 16:34:07 matt
271 * Fixed victormaxx angle conversions
273 * Revision 1.58 1994/11/12 14:47:05 john
274 * Added support for victor head tracking.
276 * Revision 1.57 1994/11/08 15:14:55 john
277 * Added more calls so net doesn't die in net game.
279 * Revision 1.56 1994/11/07 14:01:07 john
280 * Changed the gamma correction sequencing.
282 * Revision 1.55 1994/11/01 16:40:08 john
283 * Added Gamma correction.
285 * Revision 1.54 1994/10/25 23:09:26 john
286 * Made the automap key configurable.
288 * Revision 1.53 1994/10/25 13:11:59 john
289 * Made keys the way Adam speced 'em for final game.
291 * Revision 1.52 1994/10/24 17:44:22 john
292 * Added stereo channel reversing.
294 * Revision 1.51 1994/10/22 13:23:18 john
295 * Made default rear view key be R.
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.
301 * Revision 1.49 1994/10/21 15:20:15 john
302 * Made PrtScr do screen dump, not F2.
304 * Revision 1.48 1994/10/21 13:41:36 john
305 * Allowed F2 to screen dump.
307 * Revision 1.47 1994/10/17 13:07:05 john
308 * Moved the descent.cfg info into the player config file.
310 * Revision 1.46 1994/10/14 15:30:22 john
311 * Added Cyberman default positions.
313 * Revision 1.45 1994/10/14 15:24:54 john
314 * Made Cyberman work with config.
316 * Revision 1.44 1994/10/14 12:46:04 john
317 * Added the ability to reset all to default.
319 * Revision 1.43 1994/10/14 12:18:31 john
320 * Made mouse invert axis always be 0 or 1.
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
328 * Revision 1.41 1994/10/13 21:27:02 john
329 * Made axis invert value always be 0 or 1.
331 * Revision 1.40 1994/10/13 20:18:15 john
332 * Added some more system keys, such as F? and CAPSLOCK.
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.
339 * Revision 1.38 1994/10/13 15:41:57 mike
340 * Remove afterburner.
349 static char rcsid[] = "$Id: kconfig.c,v 1.27 2003-12-18 11:24:04 btb Exp $";
362 #include "pa_enabl.h" //$$POLY_ACC
370 #include "gamefont.h"
382 #include "endlevel.h"
390 #include "lighting.h"
392 #include "cntrlcen.h"
393 #if defined (TACTILE)
397 #if defined(POLY_ACC)
398 #include "poly_acc.h"
404 #include "joystick.h"
407 ubyte ExtGameStatus=1;
409 vms_vector ExtForceVec;
410 vms_matrix ExtApplyForceMatrix;
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;
418 #define TABLE_CREATION 1
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 };
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" };
429 int invert_text[2] = { TNUM_N, TNUM_Y };
431 #ifndef USE_LINUX_JOY
433 int joybutton_text[28] =
434 { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
438 TNUM_HAT_L, TNUM_HAT_R, TNUM_HAT_U, TNUM_HAT_D,
442 int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
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 };
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 };
458 int mouseaxis_text[3] = { TNUM_L_R, TNUM_F_B, TNUM_Z1 };
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
463 char *mousebutton_text[3] = { "Btn", "", "" }; // only one silly mouse button on the mac
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 "","","","","","","","","","","","","","","",""};
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 "","","","","","","" };
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 };
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 };
518 //extern void GameLoop(int, int );
520 extern void transfer_energy_to_shield(fix);
521 extern void CyclePrimary(),CycleSecondary(),InitMarkerInput();
522 extern ubyte DefiningMarkerMessage;
523 extern char CybermouseActive;
526 extern int joydefsw_do_button();
527 extern int joydefsw_do_winjoybutton(int *axis);
528 extern joydefsw_win_joyselect(char *title);
531 control_info Controls;
535 // macros for drawing lo/hi res kconfig screens (see scores.c as well)
537 #define LHX(x) ((x)*(MenuHires?2:1))
538 #define LHY(y) ((y)*(MenuHires?2.4:1))
542 #define BT_MOUSE_BUTTON 1
543 #define BT_MOUSE_AXIS 2
544 #define BT_JOY_BUTTON 3
545 #define BT_JOY_AXIS 4
548 char *btype_text[] = { "BT_KEY", "BT_MOUSE_BUTTON", "BT_MOUSE_AXIS", "BT_JOY_BUTTON", "BT_JOY_AXIS", "BT_INVERT" };
552 typedef struct kc_item {
553 short id; // The id of this item
561 ubyte value; // what key,button,etc
567 ubyte kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS];
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
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},
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},
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},
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},
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 },
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 },
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 },
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},
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},
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},
796 //end this section addition - VR
799 #else // ifndef MACINTOSH (following are macintosh controls)
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},
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};
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};
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 },
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 },
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 },
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 },
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
982 void kc_drawitem( kc_item *item, int is_current );
983 void kc_change_key( kc_item * item );
984 void kc_change_joybutton( kc_item * item );
985 void kc_change_mousebutton( kc_item * item );
986 void kc_change_joyaxis( kc_item * item );
987 void kc_change_mouseaxis( kc_item * item );
988 void kc_change_invert( kc_item * item );
989 void kconfig_read_fcs( int raw_axis );
990 void kconfig_set_fcs_button( int btn, int button );
991 void kconfig_read_external_controls( void );
993 int kconfig_is_axes_used(int axis)
996 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
997 if (( kc_joystick[i].type == BT_JOY_AXIS ) && (kc_joystick[i].value == axis ))
1003 #ifdef TABLE_CREATION
1004 int find_item_at( kc_item * items, int nitems, int x, int y )
1008 for (i=0; i<nitems; i++ ) {
1009 if ( ((items[i].x+items[i].w1)==x) && (items[i].y==y))
1015 int find_next_item_up( kc_item * items, int nitems, int citem )
1020 x = items[citem].x+items[citem].w1;
1025 y = grd_curcanv->cv_bitmap.bm_h-1;
1028 x = grd_curcanv->cv_bitmap.bm_w-1;
1031 i = find_item_at( items, nitems, x, y );
1037 int find_next_item_down( kc_item * items, int nitems, int citem )
1042 x = items[citem].x+items[citem].w1;
1046 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1049 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1053 i = find_item_at( items, nitems, x, y );
1059 int find_next_item_right( kc_item * items, int nitems, int citem )
1064 x = items[citem].x+items[citem].w1;
1068 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1071 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1075 i = find_item_at( items, nitems, x, y );
1081 int find_next_item_left( kc_item * items, int nitems, int citem )
1086 x = items[citem].x+items[citem].w1;
1091 x = grd_curcanv->cv_bitmap.bm_w-1;
1094 y = grd_curcanv->cv_bitmap.bm_h-1;
1097 i = find_item_at( items, nitems, x, y );
1104 #ifdef NEWMENU_MOUSE
1105 int get_item_height(kc_item *item)
1110 if (item->value==255) {
1113 switch( item->type ) {
1115 strncpy( btext, key_text[item->value], 10 ); break;
1116 case BT_MOUSE_BUTTON:
1118 strncpy( btext, Text_string[mousebutton_text[item->value]], 10); break;
1120 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1123 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1125 #ifdef USE_LINUX_JOY
1126 sprintf(btext, "J%d B%d", j_button[item->value].joydev, j_Get_joydev_button_number(item->value));
1128 if ( joybutton_text[item->value] !=-1 )
1129 strncpy( btext, Text_string[ joybutton_text[item->value] ], 10 );
1131 sprintf( btext, "BTN%d", item->value );
1135 #ifdef USE_LINUX_JOY
1136 sprintf( btext, "J%d A%d", j_axis[item->value].joydev, j_Get_joydev_axis_number (item->value) );
1138 strncpy(btext, Text_string[joyaxis_text[item->value]], 10);
1142 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1145 gr_get_string_size(btext, &w, &h, &aw );
1151 void kconfig_sub(kc_item * items,int nitems, char * title)
1154 dd_grs_canvas * save_canvas,
1155 grs_canvas * save_canvas
1157 grs_font * save_font;
1158 int old_keyd_repeat;
1159 #ifdef NEWMENU_MOUSE
1160 int mouse_state, omouse_state, mx, my, x1, x2, y1, y2;
1161 int close_x, close_y, close_size;
1164 int i,k,ocitem,citem;
1165 int time_stopped = 0;
1166 WIN(char *old_bg_pcx);
1168 WIN(old_bg_pcx = _SCRContext.bkg_filename);
1169 WIN(DEFINE_SCREEN(NULL));
1174 if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) )
1180 // if (Config_control_type == CONTROL_WINJOYSTICK) {
1182 // joydefsw_win_joyselect(title2); title = title2,
1184 // ); // Get Samir...
1188 save_canvas = dd_grd_curcanv,
1189 save_canvas = grd_curcanv
1194 dd_gr_set_current_canvas(NULL),
1195 gr_set_current_canvas(NULL)
1197 save_font = grd_curcanv->cv_font;
1202 game_flush_inputs();
1203 old_keyd_repeat = keyd_repeat;
1206 //gr_clear_canvas( BM_XRGB(0,0,0) );
1208 nm_draw_background(0, 0, grd_curcanv->cv_bitmap.bm_w - 1, grd_curcanv->cv_bitmap.bm_h - 1);
1209 gr_palette_load (gr_palette);
1211 grd_curcanv->cv_font = MEDIUM3_FONT;
1213 WIN(DDGRLOCK(dd_grd_curcanv));
1216 p = strchr( title, '\n' );
1218 gr_string( 0x8000, LHY(8), title );
1223 // if ( items == kc_keyboard ) {
1224 // gr_string( 0x8000, 8, "Keyboard" );
1225 // } else if ( items == kc_joystick ) {
1226 // gr_string( 0x8000, 8, "Joysticks" );
1227 // } else if ( items == kc_mouse ) {
1228 // gr_string( 0x8000, 8, "Mouse" );
1231 #ifdef NEWMENU_MOUSE
1232 close_x = close_y = MenuHires?15:7;
1233 close_size = MenuHires?10:5;
1234 gr_setcolor( BM_XRGB(0, 0, 0) );
1235 gr_rect(close_x, close_y, close_x + close_size, close_y + close_size);
1236 gr_setcolor( BM_XRGB(21, 21, 21) );
1237 gr_rect(close_x + LHX(1), close_y + LHX(1), close_x + close_size - LHX(1), close_y + close_size - LHX(1));
1240 grd_curcanv->cv_font = GAME_FONT;
1241 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1244 gr_string( 0x8000, LHY(20), TXT_KCONFIG_STRING_1 );
1246 gr_string( 0x8000, LHY(20), "Enter changes, ctrl-d deletes, ctrl-r resets defaults, ESC exits");
1248 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1249 if ( items == kc_keyboard ) {
1250 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1251 gr_setcolor( BM_XRGB(31,27,6) );
1253 gr_scanline( LHX(98), LHX(106), LHY(42) );
1254 gr_scanline( LHX(120), LHX(128), LHY(42) );
1255 gr_pixel( LHX(98), LHY(43) );
1256 gr_pixel( LHX(98), LHY(44) );
1257 gr_pixel( LHX(128), LHY(43) );
1258 gr_pixel( LHX(128), LHY(44) );
1260 gr_string( LHX(109), LHY(40), "OR" );
1262 gr_scanline( LHX(253), LHX(261), LHY(42) );
1263 gr_scanline( LHX(274), LHX(283), LHY(42) );
1264 gr_pixel( LHX(253), LHY(43) );
1265 gr_pixel( LHX(253), LHY(44) );
1266 gr_pixel( LHX(283), LHY(43) );
1267 gr_pixel( LHX(283), LHY(44) );
1269 gr_string( LHX(264), LHY(40), "OR" );
1271 } if ( items == kc_joystick ) {
1272 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1273 gr_setcolor( BM_XRGB(31,27,6) );
1274 gr_scanline( LHX(18), LHX(135), LHY(37) );
1275 gr_scanline( LHX(181), LHX(294), LHY(37) );
1276 gr_scanline( LHX(18), LHX(144), LHY(119+18) );
1277 gr_scanline( LHX(174), LHX(294), LHY(119+18) );
1278 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1279 gr_string( 0x8000,LHY(117+18), TXT_AXES );
1280 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1281 gr_string( LHX(81), LHY(137+8), TXT_AXIS );
1282 gr_string( LHX(111), LHY(137+8), TXT_INVERT );
1283 gr_string( LHX(222), LHY(137+8), TXT_AXIS );
1284 gr_string( LHX(252), LHY(137+8), TXT_INVERT );
1285 } else if ( items == kc_mouse ) {
1286 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1287 gr_setcolor( BM_XRGB(31,27,6) );
1288 gr_scanline( LHX(18), LHX(135), LHY(37) );
1289 gr_scanline( LHX(181), LHX(294), LHY(37) );
1290 gr_scanline( LHX(18), LHX(144), LHY(119+5) );
1291 gr_scanline( LHX(174), LHX(294), LHY(119+5) );
1292 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1293 gr_string( 0x8000,LHY(117+5), TXT_AXES );
1294 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1295 gr_string( LHX(169), LHY(129), TXT_AXIS );
1296 gr_string( LHX(199), LHY(129), TXT_INVERT );
1299 else if ( items == kc_d2x )
1301 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1302 gr_setcolor( BM_XRGB(31,27,6) );
1304 gr_string(LHX( 94), LHY(40), "KB");
1305 gr_string(LHX(121), LHY(40), "JOY");
1309 WIN(DDGRUNLOCK(dd_grd_curcanv));
1311 for (i=0; i<nitems; i++ ) {
1312 kc_drawitem( &items[i], 0 );
1316 kc_drawitem( &items[citem], 1 );
1318 newmenu_show_cursor();
1320 #ifdef NEWMENU_MOUSE
1321 mouse_state = omouse_state = 0;
1325 // Windows addendum to allow for kconfig input.
1330 DoMessageStuff(&msg);
1332 if (_RedrawScreen) {
1333 _RedrawScreen = FALSE;
1335 dd_gr_set_current_canvas(NULL);
1345 //see if redbook song needs to be restarted
1346 songs_check_redbook_repeat();
1350 #ifdef NEWMENU_MOUSE
1351 omouse_state = mouse_state;
1352 mouse_state = mouse_button_state(0);
1355 if ( !time_stopped ) {
1357 if (multi_menu_poll() == -1)
1366 MAC(case KEY_COMMAND+KEY_SHIFTED+KEY_3:)
1367 case KEY_PRINT_SCREEN:
1368 save_screen_shot(0);
1370 case KEY_CTRLED+KEY_D:
1371 items[citem].value = 255;
1372 kc_drawitem( &items[citem], 1 );
1374 case KEY_CTRLED+KEY_R:
1375 if ( items==kc_keyboard ) {
1376 for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
1377 items[i].value=default_kconfig_settings[0][i];
1378 kc_drawitem( &items[i], 0 );
1381 } else if ( items==kc_d2x ) {
1382 for(i=0;i<NUM_D2X_CONTROLS;i++)
1384 items[i].value=default_kconfig_d2x_settings[i];
1385 kc_drawitem( &items[i], 0 );
1390 // hack for firebire and mousestick default controls since I made
1391 // them the same control type -- dumb dumb dumb
1392 if (joy_have_firebird())
1393 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1394 items[i].value = default_firebird_settings[i];
1395 kc_drawitem( &items[i], 0 );
1397 else if (joy_have_mousestick())
1398 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1399 items[i].value = default_mousestick_settings[i];
1400 kc_drawitem( &items[i], 0 );
1403 #endif // note link to above else
1404 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1405 items[i].value = default_kconfig_settings[Config_control_type][i];
1406 kc_drawitem( &items[i], 0 );
1409 kc_drawitem( &items[citem], 1 );
1412 items[citem].value=255;
1413 kc_drawitem( &items[citem], 1 );
1417 #ifdef TABLE_CREATION
1418 if (items[citem].u==-1) items[citem].u=find_next_item_up( items,nitems, citem);
1420 citem = items[citem].u;
1425 #ifdef TABLE_CREATION
1426 if (items[citem].d==-1) items[citem].d=find_next_item_down( items,nitems, citem);
1428 citem = items[citem].d;
1432 #ifdef TABLE_CREATION
1433 if (items[citem].l==-1) items[citem].l=find_next_item_left( items,nitems, citem);
1435 citem = items[citem].l;
1439 #ifdef TABLE_CREATION
1440 if (items[citem].r==-1) items[citem].r=find_next_item_right( items,nitems, citem);
1442 citem = items[citem].r;
1446 switch( items[citem].type ) {
1447 case BT_KEY: kc_change_key( &items[citem] ); break;
1448 case BT_MOUSE_BUTTON: kc_change_mousebutton( &items[citem] ); break;
1449 case BT_MOUSE_AXIS: kc_change_mouseaxis( &items[citem] ); break;
1450 case BT_JOY_BUTTON: kc_change_joybutton( &items[citem] ); break;
1451 case BT_JOY_AXIS: kc_change_joyaxis( &items[citem] ); break;
1452 case BT_INVERT: kc_change_invert( &items[citem] ); break;
1457 grd_curcanv->cv_font = save_font;
1459 WIN(DEFINE_SCREEN(old_bg_pcx));
1462 dd_gr_set_current_canvas(save_canvas),
1463 gr_set_current_canvas( save_canvas )
1465 keyd_repeat = old_keyd_repeat;
1466 game_flush_inputs();
1467 newmenu_hide_cursor();
1471 #ifdef TABLE_CREATION
1472 case KEY_DEBUGGED+KEY_F12: {
1474 for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
1475 kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i);
1476 kc_keyboard[i].d = find_next_item_down( kc_keyboard,NUM_KEY_CONTROLS, i);
1477 kc_keyboard[i].l = find_next_item_left( kc_keyboard,NUM_KEY_CONTROLS, i);
1478 kc_keyboard[i].r = find_next_item_right( kc_keyboard,NUM_KEY_CONTROLS, i);
1480 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1481 kc_joystick[i].u = find_next_item_up( kc_joystick,NUM_OTHER_CONTROLS, i);
1482 kc_joystick[i].d = find_next_item_down( kc_joystick,NUM_OTHER_CONTROLS, i);
1483 kc_joystick[i].l = find_next_item_left( kc_joystick,NUM_OTHER_CONTROLS, i);
1484 kc_joystick[i].r = find_next_item_right( kc_joystick,NUM_OTHER_CONTROLS, i);
1486 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1487 kc_mouse[i].u = find_next_item_up( kc_mouse,NUM_OTHER_CONTROLS, i);
1488 kc_mouse[i].d = find_next_item_down( kc_mouse,NUM_OTHER_CONTROLS, i);
1489 kc_mouse[i].l = find_next_item_left( kc_mouse,NUM_OTHER_CONTROLS, i);
1490 kc_mouse[i].r = find_next_item_right( kc_mouse,NUM_OTHER_CONTROLS, i);
1492 fp = fopen( "kconfig.cod", "wt" );
1494 fprintf( fp, "ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {\n" );
1495 for (i=0; i<CONTROL_MAX_TYPES; i++ ) {
1497 fprintf( fp, "{0x%x", kconfig_settings[i][0] );
1498 for (j=1; j<MAX_CONTROLS; j++ )
1499 fprintf( fp, ",0x%x", kconfig_settings[i][j] );
1500 fprintf( fp, "},\n" );
1502 fprintf( fp, "};\n" );
1504 fprintf( fp, "\nkc_item kc_keyboard[NUM_KEY_CONTROLS] = {\n" );
1505 for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
1506 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1507 kc_keyboard[i].id, kc_keyboard[i].x, kc_keyboard[i].y, kc_keyboard[i].w1, kc_keyboard[i].w2,
1508 kc_keyboard[i].u, kc_keyboard[i].d, kc_keyboard[i].l, kc_keyboard[i].r,
1509 34, kc_keyboard[i].text, 34, btype_text[kc_keyboard[i].type] );
1511 fprintf( fp, "};" );
1513 fprintf( fp, "\nkc_item kc_joystick[NUM_OTHER_CONTROLS] = {\n" );
1514 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1515 if (kc_joystick[i].type == BT_JOY_BUTTON)
1516 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1517 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1518 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1519 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1521 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1522 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1523 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1524 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1526 fprintf( fp, "};" );
1528 fprintf( fp, "\nkc_item kc_mouse[NUM_OTHER_CONTROLS] = {\n" );
1529 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1530 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1531 kc_mouse[i].id, kc_mouse[i].x, kc_mouse[i].y, kc_mouse[i].w1, kc_mouse[i].w2,
1532 kc_mouse[i].u, kc_mouse[i].d, kc_mouse[i].l, kc_mouse[i].r,
1533 34, kc_mouse[i].text, 34, btype_text[kc_mouse[i].type] );
1535 fprintf( fp, "};" );
1544 #ifdef NEWMENU_MOUSE
1545 if ( (mouse_state && !omouse_state) || (mouse_state && omouse_state) ) {
1548 mouse_get_pos(&mx, &my);
1549 for (i=0; i<nitems; i++ ) {
1550 item_height = get_item_height( &items[i] );
1551 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[i].x) + LHX(items[i].w1);
1552 x2 = x1 + LHX(items[i].w2);
1553 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[i].y);
1554 y2 = y1 + LHX(item_height);
1555 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1561 else if ( !mouse_state && omouse_state ) {
1564 mouse_get_pos(&mx, &my);
1565 item_height = get_item_height( &items[citem] );
1566 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[citem].x) + LHX(items[citem].w1);
1567 x2 = x1 + LHX(items[citem].w2);
1568 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[citem].y);
1569 y2 = y1 + LHY(item_height);
1570 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1571 newmenu_hide_cursor();
1572 switch( items[citem].type ) {
1573 case BT_KEY: kc_change_key( &items[citem] ); break;
1574 case BT_MOUSE_BUTTON: kc_change_mousebutton( &items[citem] ); break;
1575 case BT_MOUSE_AXIS: kc_change_mouseaxis( &items[citem] ); break;
1576 case BT_JOY_BUTTON: kc_change_joybutton( &items[citem] ); break;
1577 case BT_JOY_AXIS: kc_change_joyaxis( &items[citem] ); break;
1578 case BT_INVERT: kc_change_invert( &items[citem] ); break;
1580 newmenu_show_cursor();
1582 x1 = grd_curcanv->cv_bitmap.bm_x + close_x + LHX(1);
1583 x2 = x1 + close_size - LHX(1);
1584 y1 = grd_curcanv->cv_bitmap.bm_y + close_y + LHX(1);
1585 y2 = y1 + close_size - LHX(1);
1586 if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
1587 grd_curcanv->cv_font = save_font;
1588 WINDOS(dd_gr_set_current_canvas( save_canvas ),
1589 gr_set_current_canvas( save_canvas ));
1590 keyd_repeat = old_keyd_repeat;
1591 game_flush_inputs();
1592 newmenu_hide_cursor();
1600 #endif // NEWMENU_MOUSE
1602 if (ocitem!=citem) {
1603 newmenu_hide_cursor();
1604 kc_drawitem( &items[ocitem], 0 );
1605 kc_drawitem( &items[citem], 1 );
1606 newmenu_show_cursor();
1612 void kc_drawitem( kc_item *item, int is_current )
1616 // PA_DFX (pa_set_frontbuffer_current());
1617 WIN(DDGRLOCK(dd_grd_curcanv));
1620 gr_set_fontcolor( BM_XRGB(20,20,29), -1 );
1622 gr_set_fontcolor( BM_XRGB(15,15,24), -1 );
1623 gr_string( LHX(item->x), LHY(item->y), item->text );
1624 WIN(DDGRUNLOCK(dd_grd_curcanv));
1626 if (item->value==255) {
1627 strcpy( btext, "" );
1629 switch( item->type ) {
1631 strncpy( btext, key_text[item->value], 10 ); break;
1632 case BT_MOUSE_BUTTON:
1634 //strncpy( btext, Text_string[mousebutton_text[item->value]], 10 ); break;
1635 strncpy( btext, (item->value <= 3)?Text_string[mousebutton_text[item->value]]:mousebutton_textra[item->value-3], 10 ); break;
1637 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1640 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1642 #ifdef USE_LINUX_JOY
1643 sprintf(btext, "J%d B%d", j_button[item->value].joydev, j_Get_joydev_button_number(item->value));
1647 if (joybutton_text[item->value] != -1)
1648 strncpy( btext, Text_string[ joybutton_text[item->value] ], 10 );
1650 sprintf( btext, "BTN%2d", item->value+1 );
1652 if ( joybutton_text[item->value] !=-1 )
1653 strncpy( btext, Text_string[ joybutton_text[item->value] ], 10 );
1655 sprintf( btext, "BTN%d", item->value );
1658 strncpy( btext, joy_btn_name( item->value ), 10);
1660 sprintf( btext, "BTN%d", item->value );
1665 #ifdef USE_LINUX_JOY
1666 sprintf(btext, "J%d A%d", j_axis[item->value].joydev, j_Get_joydev_axis_number(item->value));
1668 strncpy(btext, Text_string[joyaxis_text[item->value]], 10);
1672 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1676 WIN(DDGRLOCK(dd_grd_curcanv));
1677 gr_get_string_size(btext, &w, &h, &aw );
1680 gr_setcolor( BM_XRGB(21,0,24) );
1682 gr_setcolor( BM_XRGB(16,0,19) );
1683 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1685 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1687 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1689 gr_string( x, LHY(item->y), btext );
1690 // PA_DFX (pa_set_backbuffer_current());
1692 WIN(DDGRUNLOCK(dd_grd_curcanv));
1697 static int looper=0;
1699 void kc_drawquestion( kc_item *item )
1703 WIN(DDGRLOCK(dd_grd_curcanv));
1704 // PA_DFX (pa_set_frontbuffer_current());
1706 gr_get_string_size("?", &w, &h, &aw );
1708 c = BM_XRGB(21,0,24);
1710 //@@gr_setcolor( gr_fade_table[fades[looper]*256+c] );
1711 gr_setcolor(BM_XRGB(21*fades[looper]/31,0,24*fades[looper]/31));
1713 if (looper>63) looper=0;
1715 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1717 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1719 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1721 gr_string( x, LHY(item->y), "?" );
1722 // PA_DFX (pa_set_backbuffer_current());
1723 WIN(DDGRUNLOCK(dd_grd_curcanv));
1727 void kc_change_key( kc_item * item )
1732 WIN(DDGRLOCK(dd_grd_curcanv));
1733 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1735 gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_KEY );
1736 WIN(DDGRUNLOCK(dd_grd_curcanv));
1738 game_flush_inputs();
1742 while( (k!=KEY_ESC) && (keycode==255) )
1748 DoMessageStuff(&msg);
1755 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1758 // if ( Game_mode & GM_MULTI )
1759 // GameLoop( 0, 0 ); // Continue
1761 timer_delay(f0_1/10);
1762 kc_drawquestion( item );
1764 for (i=0; i<256; i++ ) {
1765 if (keyd_pressed[i] && (strlen(key_text[i])>0)) {
1767 for (n=0; n<sizeof(system_keys); n++ )
1768 if ( system_keys[n] == i )
1777 for (i=0; i<Num_items; i++ ) {
1778 n = item - All_items;
1779 if ( (i!=n) && (All_items[i].type==BT_KEY) && (All_items[i].value==keycode) ) {
1780 All_items[i].value = 255;
1781 kc_drawitem( &All_items[i], 0 );
1784 item->value = keycode;
1786 kc_drawitem( item, 1 );
1788 WIN(DDGRLOCK(dd_grd_curcanv));
1789 gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) );
1790 WIN(DDGRUNLOCK(dd_grd_curcanv));
1792 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1794 game_flush_inputs();
1798 void kc_change_joybutton( kc_item * item )
1803 WIN(DDGRLOCK(dd_grd_curcanv));
1804 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1806 gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_JBUTTON );
1807 WIN(DDGRUNLOCK(dd_grd_curcanv));
1809 game_flush_inputs();
1813 while( (k!=KEY_ESC) && (code==255))
1818 DoMessageStuff(&msg);
1824 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1827 // if ( Game_mode & GM_MULTI )
1828 // GameLoop( 0, 0 ); // Continue
1830 timer_delay(f0_1/10);
1832 if (k == KEY_PRINT_SCREEN)
1833 save_screen_shot(0);
1835 kc_drawquestion( item );
1837 WIN(code = joydefsw_do_button());
1840 code = joy_do_buttons();
1843 #if !defined(WINDOWS) && !defined(MACINTOSH)
1844 if (Config_control_type==CONTROL_THRUSTMASTER_FCS) {
1846 joystick_read_raw_axis( JOY_ALL_AXIS, axis );
1847 kconfig_read_fcs( axis[3] );
1848 if ( joy_get_button_state(7) ) code = 7;
1849 if ( joy_get_button_state(11) ) code = 11;
1850 if ( joy_get_button_state(15) ) code = 15;
1851 if ( joy_get_button_state(19) ) code = 19;
1852 for (i=0; i<4; i++ ) {
1853 if ( joy_get_button_state(i) )
1856 } else if (Config_control_type==CONTROL_FLIGHTSTICK_PRO) {
1857 for (i=4; i<20; i++ ) {
1858 if ( joy_get_button_state(i) ) {
1860 mprintf(( 0, "JB: %d\n", code ));
1864 for (i=0; i<MAX_BUTTONS; i++ ) {
1865 if ( joy_get_button_state(i) )
1872 for (i=0; i<Num_items; i++ ) {
1873 n = item - All_items;
1874 if ( (i!=n) && (All_items[i].type==BT_JOY_BUTTON) && (All_items[i].value==code) ) {
1875 All_items[i].value = 255;
1876 kc_drawitem( &All_items[i], 0 );
1881 kc_drawitem( item, 1 );
1882 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1883 game_flush_inputs();
1886 void kc_change_mousebutton( kc_item * item )
1891 WIN(DDGRLOCK(dd_grd_curcanv));
1892 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1894 gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_MBUTTON );
1895 WIN(DDGRUNLOCK(dd_grd_curcanv));
1898 game_flush_inputs();
1902 while( (k!=KEY_ESC) && (code==255))
1907 DoMessageStuff(&msg);
1913 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1916 // if ( Game_mode & GM_MULTI )
1917 // GameLoop( 0, 0 ); // Continue
1919 timer_delay(f0_1/10);
1921 if (k == KEY_PRINT_SCREEN)
1922 save_screen_shot(0);
1924 kc_drawquestion( item );
1926 b = mouse_get_btns();
1927 for (i = 0; i < 16; i++ ) {
1933 for (i=0; i<Num_items; i++ ) {
1934 n = item - All_items;
1935 if ( (i!=n) && (All_items[i].type==BT_MOUSE_BUTTON) && (All_items[i].value==code) ) {
1936 All_items[i].value = 255;
1937 kc_drawitem( &All_items[i], 0 );
1942 kc_drawitem( item, 1 );
1943 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1944 game_flush_inputs();
1948 void kc_change_joyaxis( kc_item * item )
1950 #ifdef USE_LINUX_JOY
1952 int old_axis[MAX_AXES];
1953 int numaxis = j_num_axes;
1955 int axis[JOY_NUM_AXES];
1956 int old_axis[JOY_NUM_AXES];
1957 int numaxis = JOY_NUM_AXES;
1962 WIN(DDGRLOCK(dd_grd_curcanv));
1963 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1965 gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS );
1966 WIN(DDGRUNLOCK(dd_grd_curcanv));
1968 game_flush_inputs();
1973 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, old_axis ),
1974 joystick_read_raw_axis( JOY_ALL_AXIS, old_axis )
1977 while( (k!=KEY_ESC) && (code==255))
1982 DoMessageStuff(&msg);
1988 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1991 // if ( Game_mode & GM_MULTI )
1992 // GameLoop( 0, 0 ); // Continue
1994 timer_delay(f0_1/10);
1996 if (k == KEY_PRINT_SCREEN)
1997 save_screen_shot(0);
1999 kc_drawquestion( item );
2002 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, axis ),
2003 joystick_read_raw_axis( JOY_ALL_AXIS, axis )
2006 for (i=0; i<numaxis; i++ ) {
2007 #if defined (MACINTOSH)
2008 if ( abs(axis[i]-old_axis[i])>100 ) {
2009 #elif defined(WINDOWS)
2010 if ( abs(axis[i]-old_axis[i])>1024 ) {
2012 if ( abs(axis[i]-old_axis[i])>200 ) {
2015 con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i);
2017 //old_axis[i] = axis[i];
2019 for (i=0; i<Num_items; i++ )
2021 n = item - All_items;
2022 if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) )
2028 for (i=0; i<Num_items; i++ ) {
2029 n = item - All_items;
2030 if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) {
2031 All_items[i].value = 255;
2032 kc_drawitem( &All_items[i], 0 );
2038 kc_drawitem( item, 1 );
2039 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2040 game_flush_inputs();
2044 void kc_change_mouseaxis( kc_item * item )
2053 WIN(DDGRLOCK(dd_grd_curcanv));
2054 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
2056 gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS );
2057 WIN(DDGRUNLOCK(dd_grd_curcanv));
2059 game_flush_inputs();
2063 mouse_get_delta( &dx, &dy );
2065 while( (k!=KEY_ESC) && (code==255))
2070 DoMessageStuff(&msg);
2076 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
2079 // if ( Game_mode & GM_MULTI )
2080 // GameLoop( 0, 0 ); // Continue
2082 timer_delay(f0_1/10);
2084 if (k == KEY_PRINT_SCREEN)
2085 save_screen_shot(0);
2087 kc_drawquestion( item );
2090 mouse_get_delta_z( &dx, &dy, &dz );
2092 mouse_get_delta( &dx, &dy );
2094 if ( abs(dx)>20 ) code = 0;
2095 if ( abs(dy)>20 ) code = 1;
2097 if ( abs(dz)>20 ) code = 2;
2101 for (i=0; i<Num_items; i++ ) {
2102 n = item - All_items;
2103 if ( (i!=n) && (All_items[i].type==BT_MOUSE_AXIS) && (All_items[i].value==code) ) {
2104 All_items[i].value = 255;
2105 kc_drawitem( &All_items[i], 0 );
2110 kc_drawitem( item, 1 );
2111 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2112 game_flush_inputs();
2117 void kc_change_invert( kc_item * item )
2119 game_flush_inputs();
2126 kc_drawitem( item, 1 );
2130 #include "screens.h"
2132 void kconfig(int n, char * title)
2135 grs_bitmap *save_bm;
2137 set_screen_mode( SCREEN_MENU );
2142 WIN(mouse_set_mode(0));
2143 WIN(dd_gr_set_current_canvas(NULL));
2145 #if defined(POLY_ACC)
2146 save_bm = gr_create_bitmap2( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h, grd_curcanv->cv_bitmap.bm_type, NULL );
2148 save_bm = gr_create_bitmap( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
2150 Assert( save_bm != NULL );
2152 WIN(DDGRLOCK(dd_grd_curcanv));
2153 gr_bm_bitblt(grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_w,
2154 0, 0, 0, 0, &grd_curcanv->cv_bitmap, save_bm );
2155 WIN(DDGRUNLOCK(dd_grd_curcanv));
2158 case 0:kconfig_sub( kc_keyboard, NUM_KEY_CONTROLS, title );break;
2159 case 1:kconfig_sub( kc_joystick, NUM_OTHER_CONTROLS, title );break;
2160 case 2:kconfig_sub( kc_mouse, NUM_OTHER_CONTROLS, title ); break;
2161 case 3:kconfig_sub( kc_superjoy, NUM_OTHER_CONTROLS, title); break;
2163 //added on 2/4/99 by Victor Rachels for new keys menu
2164 case 4:kconfig_sub( kc_d2x, NUM_D2X_CONTROLS, title ); break;
2165 //end this section addition - VR
2173 WIN(mouse_set_mode(1));
2174 WIN(dd_gr_set_current_canvas(NULL));
2175 WIN(DDGRLOCK(dd_grd_curcanv));
2176 gr_bitmap(0, 0, save_bm);
2177 WIN(DDGRUNLOCK(dd_grd_curcanv));
2178 gr_free_bitmap(save_bm);
2180 reset_cockpit(); //force cockpit redraw next time
2182 // Update save values...
2184 for (i=0; i<NUM_KEY_CONTROLS; i++ )
2185 kconfig_settings[0][i] = kc_keyboard[i].value;
2187 if ( (Config_control_type>0) && (Config_control_type<5)) {
2188 for (i=0; i<NUM_OTHER_CONTROLS; i++ )
2189 kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
2190 } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
2191 for (i=0; i<NUM_OTHER_CONTROLS; i++ )
2192 kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
2194 else if (Config_control_type == CONTROL_WINJOYSTICK) {
2195 for (i=0; i<NUM_OTHER_CONTROLS; i++ )
2196 kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
2200 for (i=0; i<NUM_D2X_CONTROLS; i++)
2201 kconfig_d2x_settings[i] = kc_d2x[i].value;
2206 void kconfig_read_fcs( int raw_axis )
2208 int raw_button, button, axis_min[4], axis_center[4], axis_max[4];
2210 if (Config_control_type!=CONTROL_THRUSTMASTER_FCS) return;
2212 joy_get_cal_vals(axis_min, axis_center, axis_max);
2214 if ( axis_max[3] > 1 )
2215 raw_button = (raw_axis*100)/axis_max[3];
2219 if ( raw_button > 88 )
2221 else if ( raw_button > 63 )
2223 else if ( raw_button > 39 )
2225 else if ( raw_button > 15 )
2230 kconfig_set_fcs_button( 19, button );
2231 kconfig_set_fcs_button( 15, button );
2232 kconfig_set_fcs_button( 11, button );
2233 kconfig_set_fcs_button( 7, button );
2237 void kconfig_set_fcs_button( int btn, int button )
2239 int state,time_down,upcount,downcount;
2240 state = time_down = upcount = downcount = 0;
2242 if ( joy_get_button_state(btn) ) {
2243 if ( btn==button ) {
2245 time_down = FrameTime;
2250 if ( btn==button ) {
2252 time_down = FrameTime;
2259 joy_set_btn_values( btn, state, time_down, downcount, upcount );
2265 fix Last_angles_p = 0;
2266 fix Last_angles_b = 0;
2267 fix Last_angles_h = 0;
2268 ubyte Last_angles_read = 0;
2270 extern int VR_sensitivity;
2272 int VR_sense_range[3] = { 25, 50, 75 };
2274 #if 0 //ndef MACINTOSH
2279 fix yaw, pitch, roll;
2282 //------ read vfx1 helmet --------
2283 if (vfx1_installed) {
2284 vfx_get_data(&yaw,&pitch,&roll,&buttons);
2285 } else if (iglasses_headset_installed) {
2286 iglasses_read_headset( &yaw, &pitch, &roll );
2287 } else if (Victor_headset_installed) {
2288 victor_read_headset_filtered( &yaw, &pitch, &roll );
2293 Use_player_head_angles = 0;
2294 if ( Last_angles_read ) {
2298 if ( (Last_angles_h < (F1_0/4) ) && (yaw > ((F1_0*3)/4) ) )
2300 else if ( (yaw < (F1_0/4) ) && (Last_angles_h > ((F1_0*3)/4) ) )
2303 Controls.pitch_time += fixmul((pitch- Last_angles_p)*VR_sense_range[VR_sensitivity],FrameTime);
2304 Controls.heading_time+= fixmul((yaw1 - Last_angles_h)*VR_sense_range[VR_sensitivity],FrameTime);
2305 Controls.bank_time += fixmul((roll - Last_angles_b)*VR_sense_range[VR_sensitivity],FrameTime);
2307 Last_angles_read = 1;
2308 Last_angles_p = pitch;
2309 Last_angles_h = yaw;
2310 Last_angles_b = roll;
2317 #ifndef __MSDOS__ // WINDOWS
2318 #define JOYSTICK_READ_TIME (F1_0/40) // Read joystick at 40 Hz.
2320 #define JOYSTICK_READ_TIME (F1_0/10) // Read joystick at 10 Hz.
2323 fix LastReadTime = 0;
2325 #ifdef USE_LINUX_JOY
2326 fix joy_axis[MAX_AXES];
2328 fix joy_axis[JOY_NUM_AXES];
2331 ubyte kc_use_external_control = 0;
2332 ubyte kc_enable_external_control = 0;
2333 ubyte kc_external_intno = 0;
2334 ext_control_info *kc_external_control = NULL;
2335 ubyte *kc_external_name = NULL;
2336 ubyte kc_external_version = 0;
2337 extern int Automap_active;
2339 void kconfig_init_external_controls(int intno, int address)
2342 kc_external_intno = intno;
2343 kc_external_control = (ext_control_info *)address;
2344 kc_use_external_control = 1;
2345 kc_enable_external_control = 1;
2347 i = FindArg ( "-xname" );
2349 kc_external_name = Args[i+1];
2351 kc_external_name = "External Controller";
2353 for (i=0;i<strlen (kc_external_name);i++)
2354 if (kc_external_name[i]=='_')
2355 kc_external_name[i]=' ';
2357 i = FindArg ( "-xver" );
2359 kc_external_version = atoi(Args[i+1]);
2361 printf( "%s int: 0x%x, data: 0x%p, ver:%d\n", kc_external_name, kc_external_intno, kc_external_control, kc_external_version );
2365 #if !defined(MACINTOSH)
2366 /*void kconfig_read_external_controls()
2370 if ( !kc_enable_external_control && !CybermouseActive)
2373 if ( kc_external_version == 0 )
2374 memset( kc_external_control, 0, sizeof(control_info) );
2375 else if ( kc_external_version > 0 ) {
2376 memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 );
2377 if ( kc_external_version > 1 ) {
2378 // Write ship pos and angles to external controls...
2379 ubyte *temp_ptr = (ubyte *)kc_external_control;
2380 vms_vector *ship_pos;
2381 vms_matrix *ship_orient;
2382 memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
2383 temp_ptr += sizeof(control_info)+sizeof(vms_angvec) + 64;
2384 ship_pos = (vms_vector *)temp_ptr;
2385 temp_ptr += sizeof(vms_vector);
2386 ship_orient = (vms_matrix *)temp_ptr;
2387 // Fill in ship postion...
2388 *ship_pos = Objects[Players[Player_num].objnum].pos;
2389 // Fill in ship orientation...
2390 *ship_orient = Objects[Players[Player_num].objnum].orient;
2394 if ( Automap_active ) // (If in automap...)
2395 kc_external_control->automap_state = 1;
2396 memset(&r,0,sizeof(r));
2400 if (!CybermouseActive)
2401 int386 ( kc_external_intno, &r, &r); // Read external info...
2403 // ReadOWL (kc_external_control);
2407 if ( Player_num > -1 ) {
2408 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL); // Turn off roll when turning
2409 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING); // Turn off leveling to nearest side.
2410 Auto_leveling_on = 0;
2412 if ( kc_external_version > 0 ) {
2413 vms_matrix tempm, ViewMatrix;
2414 vms_angvec * Kconfig_abs_movement;
2417 Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
2419 if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h ) {
2420 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
2421 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
2422 Objects[Players[Player_num].objnum].orient = ViewMatrix;
2424 oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
2425 if (oem_message[0] != '\0' )
2426 HUD_init_message( oem_message );
2430 Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);
2431 Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
2432 Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
2433 Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
2434 Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
2435 Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
2436 Controls.rear_view_down_count += kc_external_control->rear_view_down_count;
2437 Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;
2438 Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
2439 Controls.fire_primary_state |= kc_external_control->fire_primary_state;
2440 Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
2441 Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
2442 Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
2443 Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;
2444 Controls.automap_down_count += kc_external_control->automap_down_count;
2445 Controls.automap_state |= kc_external_control->automap_state;
2450 void controls_read_all_win()
2453 int slide_on, bank_on;
2457 int raw_joy_axis[7];
2459 fix k0, k1, k2, k3, kp;
2460 fix k4, k5, k6, k7, kh;
2461 ubyte channel_masks;
2462 int use_mouse, use_joystick;
2465 if (Game_turbo_mode)
2469 fix temp = Controls.heading_time;
2470 fix temp1 = Controls.pitch_time;
2471 memset( &Controls, 0, sizeof(control_info) );
2472 Controls.heading_time = temp;
2473 Controls.pitch_time = temp1;
2478 ctime = timer_get_fixed_seconds();
2480 // DO JOYSTICK (X,Y,Z R,U,V)
2481 // ----------------------------------------------------------------------------
2482 if ( (LastReadTime + JOYSTICK_READ_TIME) > ctime ) {
2483 if ((ctime < 0) && (LastReadTime > 0))
2484 LastReadTime = ctime;
2486 } else if ((Config_control_type==CONTROL_WINJOYSTICK)) {
2487 LastReadTime = ctime;
2488 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, raw_joy_axis );
2490 for (i=0; i<7; i++ ) {
2491 if (channel_masks&(1<<i)) {
2492 int joy_null_value = 28;
2494 // DO POV if joystick has a hat.
2495 // --------------------------------------------------------------------
2497 joydefsw_do_winjoybutton(raw_joy_axis);
2501 // --------------------------------------------------------------------
2502 // mprintf((0, "(%d)=%d,", i, raw_joy_axis[i]));
2503 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
2504 // mprintf((0, "%d ",raw_joy_axis[i]));
2505 // if (i%2) mprintf((0,"\n"));
2508 if (kc_superjoy[23].value==i) // If this is the throttle
2509 joy_null_value = 32; // Then use a larger dead-zone
2511 if (raw_joy_axis[i] > (joy_null_value-2))
2512 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
2513 else if (raw_joy_axis[i] < -(joy_null_value+2))
2514 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
2516 raw_joy_axis[i] = 0;
2517 joy_axis[i] = (raw_joy_axis[i]*FrameTime)/128;
2526 for (i=0; i<6; i++ )
2532 // ----------------------------------------------------------------------------
2533 if (Config_control_type==5) {
2534 mouse_get_delta( &dx, &dy );
2535 mouse_axis[0] = (dx*FrameTime)/35;
2536 mouse_axis[1] = (dy*FrameTime)/25;
2537 mouse_buttons = mouse_get_btns();
2538 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
2547 //------------- Read slide_on -------------
2550 if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
2551 if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
2553 if ((use_joystick)&&(kc_superjoy[5].value<255)) slide_on |= joy_get_button_state( kc_superjoy[5].value );
2555 if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
2557 //------------- Read bank_on ---------------
2560 if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
2561 if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
2563 if ( (use_joystick)&&(kc_superjoy[10].value < 255 )) bank_on |= joy_get_button_state( kc_superjoy[10].value );
2565 if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
2567 //------------ Read pitch_time -----------
2569 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2571 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2; // Divide by two since we want pitch to go slower
2572 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
2573 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
2574 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
2577 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
2578 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
2579 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
2580 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
2583 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2584 kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
2585 kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
2589 Controls.pitch_time = 0;
2591 if (Controls.pitch_time < 0)
2592 Controls.pitch_time = 0;
2594 if (Controls.pitch_time > 0)
2595 Controls.pitch_time = 0;
2596 Controls.pitch_time += kp;
2599 if ( (use_joystick)&&(kc_superjoy[13].value < 255 )) {
2600 if ( !kc_superjoy[14].value ) // If not inverted...
2601 Controls.pitch_time -= (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2603 Controls.pitch_time += (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2607 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
2608 if ( (use_mouse)&&(kc_mouse[13].value < 255) ) {
2609 if ( !kc_mouse[14].value ) // If not inverted...
2610 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2612 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2615 Controls.pitch_time = 0;
2619 //----------- Read vertical_thrust_time -----------------
2622 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
2623 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
2624 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
2625 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
2628 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
2629 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
2630 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
2631 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
2634 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2635 Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
2636 Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
2640 if ((use_joystick)&&( kc_superjoy[13].value < 255 )) {
2641 if ( !kc_superjoy[14].value ) // If not inverted...
2642 Controls.vertical_thrust_time += joy_axis[kc_superjoy[13].value];
2644 Controls.vertical_thrust_time -= joy_axis[kc_superjoy[13].value];
2648 if ( (use_mouse)&&(kc_mouse[13].value < 255 )) {
2649 if ( !kc_mouse[14].value ) // If not inverted...
2650 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
2652 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
2657 if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
2658 if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
2659 if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
2660 if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
2663 if ((use_joystick)&&( kc_superjoy[19].value < 255 )) {
2664 if ( !kc_superjoy[20].value ) // If not inverted...
2665 Controls.vertical_thrust_time += joy_axis[kc_superjoy[19].value];
2667 Controls.vertical_thrust_time -= joy_axis[kc_superjoy[19].value];
2670 // From joystick buttons
2671 if ( (use_joystick)&&(kc_superjoy[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_superjoy[8].value );
2672 if ( (use_joystick)&&(kc_superjoy[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_superjoy[9].value );
2674 // From mouse buttons
2675 if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
2676 if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
2679 if ( (use_mouse)&&(kc_mouse[19].value < 255 )) {
2680 if ( !kc_mouse[20].value ) // If not inverted...
2681 Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
2683 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
2687 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2688 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
2689 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
2692 //---------- Read heading_time -----------
2694 if (!slide_on && !bank_on) {
2695 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2697 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
2698 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
2699 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
2700 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
2703 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
2704 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
2705 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
2706 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
2709 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2710 kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
2711 kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
2715 Controls.heading_time = 0;
2717 if (Controls.heading_time < 0)
2718 Controls.heading_time = 0;
2720 if (Controls.heading_time > 0)
2721 Controls.heading_time = 0;
2722 Controls.heading_time += kh;
2725 if ( (use_joystick)&&(kc_superjoy[15].value < 255 )) {
2726 if ( !kc_superjoy[16].value ) // If not inverted...
2727 Controls.heading_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2729 Controls.heading_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2733 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
2734 if ( !kc_mouse[16].value ) // If not inverted...
2735 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2737 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2740 Controls.heading_time = 0;
2743 //----------- Read sideways_thrust_time -----------------
2746 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2747 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2748 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2749 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2752 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
2753 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
2754 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
2755 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
2758 if ( (use_joystick)&&(kc_superjoy[15].value < 255 )) {
2759 if ( !kc_superjoy[16].value ) // If not inverted...
2760 Controls.sideways_thrust_time += joy_axis[kc_superjoy[15].value];
2762 Controls.sideways_thrust_time -= joy_axis[kc_superjoy[15].value];
2766 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2767 Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
2768 Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
2772 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
2773 if ( !kc_mouse[16].value ) // If not inverted...
2774 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
2776 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
2781 if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
2782 if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
2783 if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
2784 if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
2787 if ( (use_joystick)&&(kc_superjoy[17].value < 255 )) {
2788 if ( !kc_superjoy[18].value ) // If not inverted...
2789 Controls.sideways_thrust_time -= joy_axis[kc_superjoy[17].value];
2791 Controls.sideways_thrust_time += joy_axis[kc_superjoy[17].value];
2794 // From joystick buttons
2795 if ( (use_joystick)&&(kc_superjoy[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_superjoy[6].value );
2796 if ( (use_joystick)&&(kc_superjoy[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_superjoy[7].value );
2798 // From mouse buttons
2799 if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
2800 if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
2803 if ( (use_mouse)&&(kc_mouse[17].value < 255 )) {
2804 if ( !kc_mouse[18].value ) // If not inverted...
2805 Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
2807 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
2810 //----------- Read bank_time -----------------
2813 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2814 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2815 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2816 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2819 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
2820 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
2821 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
2822 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
2825 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2826 Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
2827 Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
2831 if ( (use_joystick)&&(kc_superjoy[15].value < 255) ) {
2832 if ( !kc_superjoy[16].value ) // If not inverted...
2833 Controls.bank_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2835 Controls.bank_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2839 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
2840 if ( !kc_mouse[16].value ) // If not inverted...
2841 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2843 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2848 if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
2849 if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
2850 if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
2851 if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
2854 if ( (use_joystick)&&(kc_superjoy[21].value < 255) ) {
2855 if ( !kc_superjoy[22].value ) // If not inverted...
2856 Controls.bank_time -= joy_axis[kc_superjoy[21].value];
2858 Controls.bank_time += joy_axis[kc_superjoy[21].value];
2861 // From joystick buttons
2862 if ( (use_joystick)&&(kc_superjoy[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_superjoy[11].value );
2863 if ( (use_joystick)&&(kc_superjoy[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_superjoy[12].value );
2865 // From mouse buttons
2866 if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
2867 if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
2870 if ( (use_mouse)&&(kc_mouse[21].value < 255 )) {
2871 if ( !kc_mouse[22].value ) // If not inverted...
2872 Controls.bank_time += mouse_axis[kc_mouse[21].value];
2874 Controls.bank_time -= mouse_axis[kc_mouse[21].value];
2878 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2879 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
2880 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
2883 //----------- Read forward_thrust_time -------------
2886 if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
2887 if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
2888 if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
2889 if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
2892 if ( (use_joystick)&&(kc_superjoy[23].value < 255 )) {
2893 if ( !kc_superjoy[24].value ) // If not inverted...
2894 Controls.forward_thrust_time -= joy_axis[kc_superjoy[23].value];
2896 Controls.forward_thrust_time += joy_axis[kc_superjoy[23].value];
2899 // From joystick buttons
2900 if ( (use_joystick)&&(kc_superjoy[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_superjoy[2].value );
2901 if ( (use_joystick)&&(kc_superjoy[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_superjoy[3].value );
2904 if ( (use_mouse)&&(kc_mouse[23].value < 255 )) {
2905 if ( !kc_mouse[24].value ) // If not inverted...
2906 Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
2908 Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
2911 // From mouse buttons
2912 if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
2913 if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
2915 //----------- Read afterburner_state -------------
2918 if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
2919 if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
2921 if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
2923 if ( (use_joystick)&&(kc_superjoy[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_superjoy[27].value);
2925 //-------Read headlight key--------------------------
2926 if (kc_keyboard[52].value < 255 )
2927 Controls.headlight_count=key_down_count(kc_keyboard[52].value);
2928 if (kc_keyboard[53].value < 255 )
2929 Controls.headlight_count=key_down_count(kc_keyboard[53].value);
2930 if ((use_joystick)&&(kc_superjoy[30].value < 255 ))
2931 Controls.headlight_count=joy_get_button_down_cnt(kc_superjoy[30].value);
2933 //--------Read Cycle Primary Key------------------
2935 if (kc_keyboard[48].value<255)
2936 Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
2937 if (kc_keyboard[49].value<255)
2938 Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
2939 if ((use_joystick)&&(kc_superjoy[28].value < 255 ))
2940 Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_superjoy[28].value);
2942 //--------Read Cycle Secondary Key------------------
2944 if (kc_keyboard[50].value<255)
2945 Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
2946 if (kc_keyboard[51].value<255)
2947 Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
2948 if ((use_joystick)&&(kc_superjoy[29].value < 255 ))
2949 Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_superjoy[29].value);
2951 //--------Read Toggle Bomb key----------------------
2953 if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
2955 int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
2957 if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
2958 !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
2960 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2961 HUD_init_message ("No bombs available!");
2965 if (Players[Player_num].secondary_ammo[bomb]==0)
2967 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2968 HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
2972 Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
2973 digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
2978 //---------Read Energy->Shield key----------
2980 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
2981 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
2982 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
2983 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
2985 //----------- Read fire_primary_down_count
2986 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
2987 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
2988 if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_superjoy[0].value);
2989 if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
2991 //----------- Read fire_primary_state
2992 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
2993 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
2994 if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_superjoy[0].value);
2995 if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
2997 //----------- Read fire_secondary_down_count
2998 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
2999 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
3000 if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_superjoy[1].value);
3001 if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
3003 //----------- Read fire_secondary_state
3004 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
3005 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
3006 if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_superjoy[1].value);
3007 if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
3009 //----------- Read fire_flare_down_count
3010 if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
3011 if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
3012 if ((use_joystick)&&(kc_superjoy[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_superjoy[4].value);
3013 if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
3015 //----------- Read drop_bomb_down_count
3016 if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
3017 if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
3018 if ((use_joystick)&&(kc_superjoy[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_superjoy[26].value);
3019 if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
3021 //----------- Read rear_view_down_count
3022 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
3023 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
3024 if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_superjoy[25].value);
3025 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
3027 //----------- Read rear_view_down_state
3028 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3029 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3030 if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_superjoy[25].value);
3031 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3033 //----------- Read automap_down_count
3034 if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3035 if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3037 //----------- Read automap_state
3038 if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3039 if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3041 //----------- Read stupid-cruise-control-type of throttle.
3043 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3044 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3045 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3046 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3047 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3049 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3052 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3053 if (Cruise_speed < 0 ) Cruise_speed = 0;
3055 if (Controls.forward_thrust_time==0)
3056 Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3059 //read_head_tracker();
3061 // Read external controls
3062 if (kc_use_external_control || CybermouseActive)
3063 kconfig_read_external_controls();
3065 //----------- Clamp values between -FrameTime and FrameTime
3066 if (FrameTime > F1_0 )
3067 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3069 if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3070 if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3071 if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3072 if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3073 if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3074 if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3075 // if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3077 if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3078 if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3079 if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3080 if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3081 if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3082 if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3083 // if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3086 //--------- Don't do anything if in debug mode
3088 if ( keyd_pressed[KEY_DELETE] ) {
3089 memset( &Controls, 0, sizeof(control_info) );
3096 fix Next_toggle_time[3]={0,0,0};
3098 int allowed_to_toggle(int i)
3100 //used for keeping tabs of when its ok to toggle headlight,primary,and secondary
3102 if (Next_toggle_time[i] > GameTime)
3103 if (Next_toggle_time[i] < GameTime + (F1_0/8)) // In case time is bogus, never wait > 1 second.
3106 Next_toggle_time[i] = GameTime + (F1_0/8);
3113 //added on 2/7/99 by Victor Rachels for jostick state setting
3114 int d2x_joystick_ostate[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
3115 //end this section adition - VR
3119 void controls_read_all()
3122 int slide_on, bank_on;
3129 fix mouse_axis[3] = {0,0,0};
3130 #ifdef USE_LINUX_JOY
3131 int raw_joy_axis[MAX_AXES];
3133 int raw_joy_axis[JOY_NUM_AXES];
3136 fix k0, k1, k2, k3, kp;
3137 fix k4, k5, k6, k7, kh;
3138 ubyte channel_masks;
3139 int use_mouse, use_joystick;
3145 if (Game_turbo_mode)
3149 fix temp = Controls.heading_time;
3150 fix temp1 = Controls.pitch_time;
3151 memset( &Controls, 0, sizeof(control_info) );
3152 Controls.heading_time = temp;
3153 Controls.pitch_time = temp1;
3158 ctime = timer_get_fixed_seconds();
3160 //--------- Read Joystick -----------
3162 if ( (LastReadTime + JOYSTICK_READ_TIME > ctime) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) ) {
3164 if ((ctime < 0) && (LastReadTime >= 0))
3166 if ((ctime < 0) && (LastReadTime > 0))
3168 LastReadTime = ctime;
3170 } else if ((Config_control_type>0) && (Config_control_type<5) ) {
3171 LastReadTime = ctime;
3172 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3174 # ifdef USE_LINUX_JOY
3175 for (i = 0; i < j_num_axes; i++)
3177 for (i = 0; i < JOY_NUM_AXES; i++)
3181 if (channel_masks&(1<<i)) {
3183 int joy_null_value = 10;
3185 if ( (i==3) && (Config_control_type==CONTROL_THRUSTMASTER_FCS) ) {
3186 kconfig_read_fcs( raw_joy_axis[i] );
3188 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3190 if (kc_joystick[23].value==i) // If this is the throttle
3191 joy_null_value = 20; // Then use a larger dead-zone
3193 if (raw_joy_axis[i] > joy_null_value)
3194 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3195 else if (raw_joy_axis[i] < -joy_null_value)
3196 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3198 raw_joy_axis[i] = 0;
3199 joy_axis[i] = (raw_joy_axis[i]*FrameTime)/128;
3209 #ifdef USE_LINUX_JOY
3210 for (i = 0; i < j_num_axes; i++)
3212 for (i = 0; i < JOY_NUM_AXES; i++)
3218 //--------- Read Joystick -----------
3219 if ((Config_control_type>0) && (Config_control_type<5) ) {
3220 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3221 for (i=0; i<4; i++ ) {
3222 if (channel_masks&(1<<i)) {
3223 int joy_null_value = 10;
3225 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3227 if (kc_joystick[23].value==i) // If this is the throttle
3228 joy_null_value = 20; // Then use a larger dead-zone
3230 if (raw_joy_axis[i] > joy_null_value)
3231 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3232 else if (raw_joy_axis[i] < -joy_null_value)
3233 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3235 raw_joy_axis[i] = 0;
3236 joy_axis[i] = (raw_joy_axis[i]*FrameTime)/128;
3243 for (i=0; i<4; i++ )
3247 #endif // ifndef MACINTOSH
3249 if (Config_control_type==5 && !CybermouseActive) {
3250 //--------- Read Mouse -----------
3252 mouse_get_delta_z( &dx, &dy, &dz );
3254 mouse_get_delta( &dx, &dy );
3256 mouse_axis[0] = (dx*FrameTime)/35;
3257 mouse_axis[1] = (dy*FrameTime)/25;
3259 mouse_axis[2] = (dz*FrameTime);
3261 mouse_buttons = mouse_get_btns();
3262 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
3264 } else if (Config_control_type==6 && !CybermouseActive) {
3265 //--------- Read Cyberman -----------
3266 mouse_get_cyberman_pos(&idx,&idy );
3267 mouse_axis[0] = (idx*FrameTime)/128;
3268 mouse_axis[1] = (idy*FrameTime)/128;
3269 mouse_buttons = mouse_get_btns();
3271 } else if (CybermouseActive) {
3272 // ReadOWL (kc_external_control);
3273 // CybermouseAdjust();
3282 //added on 2/4/99 by Victor Rachels for d1x keys
3283 //--------- Read primary weapon select -------------
3284 //the following "if" added by WraithX to stop deadies from switchin weapons, 4/14/00
3285 if (!Player_is_dead)
3288 int d2x_joystick_state[10];
3291 d2x_joystick_state[i] = joy_get_button_state(kc_d2x[i*2+1].value);
3294 //----------------Weapon 1----------------
3295 if(key_down_count(kc_d2x[0].value) ||
3296 (joy_get_button_state(kc_d2x[1].value) &&
3297 (d2x_joystick_state[0]!=d2x_joystick_ostate[0]) ) )
3300 do_weapon_select(0,0);
3302 for(i=MAX_PRIMARY_WEAPONS;i<MAX_PRIMARY_WEAPONS+NEWPRIMS;i++)
3303 if(primary_order[i]>primary_order[valu]&&player_has_weapon(i,0))
3305 LaserPowSelected = valu;
3308 //----------------Weapon 2----------------
3309 if(key_down_count(kc_d2x[2].value) ||
3310 (joy_get_button_state(kc_d2x[3].value) &&
3311 (d2x_joystick_state[1]!=d2x_joystick_ostate[1]) ) )
3312 do_weapon_select(1,0);
3313 //----------------Weapon 3----------------
3314 if(key_down_count(kc_d2x[4].value) ||
3315 (joy_get_button_state(kc_d2x[5].value) &&
3316 (d2x_joystick_state[2]!=d2x_joystick_ostate[2]) ) )
3317 do_weapon_select(2,0);
3318 //----------------Weapon 4----------------
3319 if(key_down_count(kc_d2x[6].value) ||
3320 (joy_get_button_state(kc_d2x[7].value) &&
3321 (d2x_joystick_state[3]!=d2x_joystick_ostate[3]) ) )
3322 do_weapon_select(3,0);
3323 //----------------Weapon 5----------------
3324 if(key_down_count(kc_d2x[8].value) ||
3325 (joy_get_button_state(kc_d2x[9].value) &&
3326 (d2x_joystick_state[4]!=d2x_joystick_ostate[4]) ) )
3327 do_weapon_select(4,0);
3329 //--------- Read secondary weapon select ----------
3330 //----------------Weapon 6----------------
3331 if(key_down_count(kc_d2x[10].value) ||
3332 (joy_get_button_state(kc_d2x[11].value) &&
3333 (d2x_joystick_state[5]!=d2x_joystick_ostate[5]) ) )
3334 do_weapon_select(0,1);
3335 //----------------Weapon 7----------------
3336 if(key_down_count(kc_d2x[12].value) ||
3337 (joy_get_button_state(kc_d2x[13].value) &&
3338 (d2x_joystick_state[6]!=d2x_joystick_ostate[6]) ) )
3339 do_weapon_select(1,1);
3340 //----------------Weapon 8----------------
3341 if(key_down_count(kc_d2x[14].value) ||
3342 (joy_get_button_state(kc_d2x[15].value) &&
3343 (d2x_joystick_state[7]!=d2x_joystick_ostate[7]) ) )
3344 do_weapon_select(2,1);
3345 //----------------Weapon 9----------------
3346 if(key_down_count(kc_d2x[16].value) ||
3347 (joy_get_button_state(kc_d2x[17].value) &&
3348 (d2x_joystick_state[8]!=d2x_joystick_ostate[8]) ) )
3349 do_weapon_select(3,1);
3350 //----------------Weapon 0----------------
3351 if(key_down_count(kc_d2x[18].value) ||
3352 (joy_get_button_state(kc_d2x[19].value) &&
3353 (d2x_joystick_state[9]!=d2x_joystick_ostate[9]) ) )
3354 do_weapon_select(4,1);
3355 memcpy(d2x_joystick_ostate,d2x_joystick_state,10*sizeof(int));
3357 //end this section addition - VR
3360 }//end "if (!Player_is_dead)" - WraithX
3364 //------------- Read slide_on -------------
3367 if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
3368 if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
3370 if ((use_joystick)&&(kc_joystick[5].value<255)) slide_on |= joy_get_button_state( kc_joystick[5].value );
3372 if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
3374 //------------- Read bank_on ---------------
3377 if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
3378 if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
3380 if ( (use_joystick)&&(kc_joystick[10].value < 255 )) bank_on |= joy_get_button_state( kc_joystick[10].value );
3382 if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
3384 //------------ Read pitch_time -----------
3386 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3388 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2; // Divide by two since we want pitch to go slower
3389 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
3390 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
3391 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
3394 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
3395 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
3396 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
3397 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
3400 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3401 kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
3402 kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
3406 Controls.pitch_time = 0;
3408 if (Controls.pitch_time < 0)
3409 Controls.pitch_time = 0;
3411 if (Controls.pitch_time > 0)
3412 Controls.pitch_time = 0;
3413 Controls.pitch_time += kp;
3416 if ( (use_joystick)&&(kc_joystick[13].value < 255 )) {
3417 if ( !kc_joystick[14].value ) // If not inverted...
3418 Controls.pitch_time -= (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3420 Controls.pitch_time += (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3424 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
3425 if ( (use_mouse)&&(kc_mouse[13].value < 255) ) {
3426 if ( !kc_mouse[14].value ) // If not inverted...
3427 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3429 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3432 Controls.pitch_time = 0;
3436 //----------- Read vertical_thrust_time -----------------
3439 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
3440 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
3441 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
3442 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
3445 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
3446 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
3447 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
3448 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
3451 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3452 Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
3453 Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
3457 if ((use_joystick)&&( kc_joystick[13].value < 255 )) {
3458 if ( !kc_joystick[14].value ) // If not inverted...
3459 Controls.vertical_thrust_time += joy_axis[kc_joystick[13].value];
3461 Controls.vertical_thrust_time -= joy_axis[kc_joystick[13].value];
3465 if ( (use_mouse)&&(kc_mouse[13].value < 255 )) {
3466 if ( !kc_mouse[14].value ) // If not inverted...
3467 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
3469 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
3474 if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
3475 if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
3476 if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
3477 if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
3480 if ((use_joystick)&&( kc_joystick[19].value < 255 )) {
3481 if ( !kc_joystick[20].value ) // If not inverted...
3482 Controls.vertical_thrust_time += joy_axis[kc_joystick[19].value];
3484 Controls.vertical_thrust_time -= joy_axis[kc_joystick[19].value];
3487 // From joystick buttons
3488 if ( (use_joystick)&&(kc_joystick[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_joystick[8].value );
3489 if ( (use_joystick)&&(kc_joystick[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_joystick[9].value );
3491 // From mouse buttons
3492 if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
3493 if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
3496 if ( (use_mouse)&&(kc_mouse[19].value < 255 )) {
3497 if ( !kc_mouse[20].value ) // If not inverted...
3498 Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
3500 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
3504 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3505 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
3506 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
3509 //---------- Read heading_time -----------
3511 if (!slide_on && !bank_on) {
3512 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3514 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
3515 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
3516 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
3517 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
3520 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
3521 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
3522 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
3523 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
3526 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3527 kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
3528 kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
3532 Controls.heading_time = 0;
3534 if (Controls.heading_time < 0)
3535 Controls.heading_time = 0;
3537 if (Controls.heading_time > 0)
3538 Controls.heading_time = 0;
3539 Controls.heading_time += kh;
3542 if ( (use_joystick)&&(kc_joystick[15].value < 255 )) {
3543 if ( !kc_joystick[16].value ) // If not inverted...
3544 Controls.heading_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3546 Controls.heading_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3550 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
3551 if ( !kc_mouse[16].value ) // If not inverted...
3552 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3554 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3557 Controls.heading_time = 0;
3560 //----------- Read sideways_thrust_time -----------------
3563 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3564 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3565 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3566 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3569 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
3570 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
3571 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
3572 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
3575 if ( (use_joystick)&&(kc_joystick[15].value < 255 )) {
3576 if ( !kc_joystick[16].value ) // If not inverted...
3577 Controls.sideways_thrust_time += joy_axis[kc_joystick[15].value];
3579 Controls.sideways_thrust_time -= joy_axis[kc_joystick[15].value];
3583 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3584 Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
3585 Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
3589 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
3590 if ( !kc_mouse[16].value ) // If not inverted...
3591 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
3593 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
3598 if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
3599 if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
3600 if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
3601 if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
3604 if ( (use_joystick)&&(kc_joystick[17].value < 255 )) {
3605 if ( !kc_joystick[18].value ) // If not inverted...
3606 Controls.sideways_thrust_time -= joy_axis[kc_joystick[17].value];
3608 Controls.sideways_thrust_time += joy_axis[kc_joystick[17].value];
3611 // From joystick buttons
3612 if ( (use_joystick)&&(kc_joystick[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_joystick[6].value );
3613 if ( (use_joystick)&&(kc_joystick[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_joystick[7].value );
3615 // From mouse buttons
3616 if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
3617 if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
3620 if ( (use_mouse)&&(kc_mouse[17].value < 255 )) {
3621 if ( !kc_mouse[18].value ) // If not inverted...
3622 Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
3624 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
3627 //----------- Read bank_time -----------------
3630 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3631 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3632 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3633 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3636 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
3637 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
3638 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
3639 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
3642 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3643 Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
3644 Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
3648 if ( (use_joystick)&&(kc_joystick[15].value < 255) ) {
3649 if ( !kc_joystick[16].value ) // If not inverted...
3650 Controls.bank_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3652 Controls.bank_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3656 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
3657 if ( !kc_mouse[16].value ) // If not inverted...
3658 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3660 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3665 if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
3666 if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
3667 if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
3668 if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
3671 if ( (use_joystick)&&(kc_joystick[21].value < 255) ) {
3672 if ( !kc_joystick[22].value ) // If not inverted...
3673 Controls.bank_time -= joy_axis[kc_joystick[21].value];
3675 Controls.bank_time += joy_axis[kc_joystick[21].value];
3678 // From joystick buttons
3679 if ( (use_joystick)&&(kc_joystick[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_joystick[11].value );
3680 if ( (use_joystick)&&(kc_joystick[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_joystick[12].value );
3682 // From mouse buttons
3683 if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
3684 if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
3687 if ( (use_mouse)&&(kc_mouse[21].value < 255 )) {
3688 if ( !kc_mouse[22].value ) // If not inverted...
3689 Controls.bank_time += mouse_axis[kc_mouse[21].value];
3691 Controls.bank_time -= mouse_axis[kc_mouse[21].value];
3695 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3696 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
3697 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
3700 //----------- Read forward_thrust_time -------------
3703 if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
3704 if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
3705 if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
3706 if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
3709 if ( (use_joystick)&&(kc_joystick[23].value < 255 )) {
3710 if ( !kc_joystick[24].value ) // If not inverted...
3711 Controls.forward_thrust_time -= joy_axis[kc_joystick[23].value];
3713 Controls.forward_thrust_time += joy_axis[kc_joystick[23].value];
3716 // From joystick buttons
3717 if ( (use_joystick)&&(kc_joystick[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_joystick[2].value );
3718 if ( (use_joystick)&&(kc_joystick[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_joystick[3].value );
3721 if ( (use_mouse)&&(kc_mouse[23].value < 255 )) {
3722 if ( !kc_mouse[24].value ) // If not inverted...
3723 Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
3725 Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
3728 // From mouse buttons
3729 if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
3730 if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
3732 //----------- Read afterburner_state -------------
3735 if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
3736 if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
3738 if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
3740 if ( (use_joystick)&&(kc_joystick[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_joystick[27].value);
3742 //-------Read headlight key--------------------------
3744 if (kc_keyboard[52].value < 255 )
3745 Controls.headlight_count=key_down_count(kc_keyboard[52].value);
3746 if (kc_keyboard[53].value < 255 )
3747 Controls.headlight_count+=key_down_count(kc_keyboard[53].value);
3748 if ((use_joystick)&&(kc_joystick[30].value < 255 ))
3749 Controls.headlight_count+=joy_get_button_down_cnt(kc_joystick[30].value);
3751 //--------Read Cycle Primary Key------------------
3753 if (kc_keyboard[48].value<255)
3754 Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
3755 if (kc_keyboard[49].value<255)
3756 Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
3757 if ((use_joystick)&&(kc_joystick[28].value < 255 ))
3758 Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_joystick[28].value);
3761 //--------Read Cycle Secondary Key------------------
3763 if (kc_keyboard[50].value<255)
3764 Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
3765 if (kc_keyboard[51].value<255)
3766 Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
3767 if ((use_joystick)&&(kc_joystick[29].value < 255 ))
3768 Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_joystick[29].value);
3770 //--------Read Toggle Bomb key----------------------
3772 if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
3774 int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
3776 if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
3777 !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
3779 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3780 HUD_init_message ("No bombs available!");
3784 if (Players[Player_num].secondary_ammo[bomb]==0)
3786 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3787 HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
3791 Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
3792 digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
3797 //---------Read Energy->Shield key----------
3799 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
3800 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
3801 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
3802 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
3804 //----------- Read fire_primary_down_count
3805 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
3806 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
3807 if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_joystick[0].value);
3808 if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
3810 //----------- Read fire_primary_state
3811 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
3812 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
3813 if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_joystick[0].value);
3814 if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
3816 //----------- Read fire_secondary_down_count
3817 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
3818 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
3819 if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_joystick[1].value);
3820 if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
3822 //----------- Read fire_secondary_state
3823 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
3824 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
3825 if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_joystick[1].value);
3826 if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
3828 //----------- Read fire_flare_down_count
3829 if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
3830 if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
3831 if ((use_joystick)&&(kc_joystick[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_joystick[4].value);
3832 if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
3834 //----------- Read drop_bomb_down_count
3835 if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
3836 if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
3837 if ((use_joystick)&&(kc_joystick[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_joystick[26].value);
3838 if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
3840 //----------- Read rear_view_down_count
3841 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
3842 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
3843 if ((use_joystick)&&(kc_joystick[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_joystick[25].value);
3844 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
3846 //----------- Read rear_view_down_state
3847 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3848 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3849 if ((use_joystick)&&(kc_joystick[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_joystick[25].value);
3850 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3852 //----------- Read automap_down_count
3853 if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3854 if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3856 //----------- Read automap_state
3857 if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3858 if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3860 //----------- Read stupid-cruise-control-type of throttle.
3862 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3863 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3864 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3865 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3866 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3868 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3871 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3872 if (Cruise_speed < 0 ) Cruise_speed = 0;
3874 if (Controls.forward_thrust_time==0)
3875 Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3878 #if !defined(MACINTOSH)
3879 //read_head_tracker();
3881 // Read external controls
3882 // if (kc_use_external_control || CybermouseActive)
3883 // kconfig_read_external_controls();
3886 //----------- Clamp values between -FrameTime and FrameTime
3887 if (FrameTime > F1_0 )
3888 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3890 if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3891 if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3892 if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3893 if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3894 if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3895 if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3896 // if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3898 if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3899 if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3900 if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3901 if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3902 if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3903 if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3904 // if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3907 //--------- Don't do anything if in debug mode
3909 if ( keyd_pressed[KEY_DELETE] ) {
3910 memset( &Controls, 0, sizeof(control_info) );
3916 void reset_cruise(void)
3922 void kc_set_controls()
3926 for (i=0; i<NUM_KEY_CONTROLS; i++ )
3927 kc_keyboard[i].value = kconfig_settings[0][i];
3929 if ( (Config_control_type>0) && (Config_control_type<5)) {
3930 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3931 kc_joystick[i].value = kconfig_settings[Config_control_type][i];
3932 if (kc_joystick[i].type == BT_INVERT ) {
3933 if (kc_joystick[i].value!=1)
3934 kc_joystick[i].value = 0;
3935 kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
3938 } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
3939 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3940 kc_mouse[i].value = kconfig_settings[Config_control_type][i];
3941 if (kc_mouse[i].type == BT_INVERT ) {
3942 if (kc_mouse[i].value!=1)
3943 kc_mouse[i].value = 0;
3944 kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
3947 } else if (Config_control_type == CONTROL_WINJOYSTICK) {
3948 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3949 kc_superjoy[i].value = kconfig_settings[Config_control_type][i];
3950 if (kc_superjoy[i].type == BT_INVERT ) {
3951 if (kc_superjoy[i].value!=1)
3952 kc_superjoy[i].value = 0;
3953 kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
3959 for (i=0; i<NUM_D2X_CONTROLS; i++ )
3960 kc_d2x[i].value = kconfig_d2x_settings[i];
3964 #if 0 //ndef MACINTOSH // no mac support for vr headset
3966 void kconfig_center_headset()
3970 vfx_center_headset();
3972 // } else if (iglasses_headset_installed) {
3973 // } else if (Victor_headset_installed) {
3979 #endif // end of #ifndef MACINTOSH for kconfig_center_headset
3981 void CybermouseAdjust ()
3983 /* if ( Player_num > -1 ) {
3984 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL); // Turn off roll when turning
3985 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING); // Turn off leveling to nearest side.
3986 Auto_leveling_on = 0;
3988 if ( kc_external_version > 0 ) {
3989 vms_matrix tempm, ViewMatrix;
3990 vms_angvec * Kconfig_abs_movement;
3993 Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
3995 if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h ) {
3996 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
3997 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
3998 Objects[Players[Player_num].objnum].orient = ViewMatrix;
4000 oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
4001 if (oem_message[0] != '\0' )
4002 HUD_init_message( oem_message );
4006 Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);
4007 Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
4008 Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
4009 Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
4010 Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
4011 Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
4012 // Controls.rear_view_down_count += kc_external_control->rear_view_down_count;
4013 // Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;
4014 Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
4015 Controls.fire_primary_state |= kc_external_control->fire_primary_state;
4016 Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
4017 Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
4018 Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
4019 Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;
4020 // Controls.automap_down_count += kc_external_control->automap_down_count;
4021 // Controls.automap_state |= kc_external_control->automap_state;
4024 char GetKeyValue (char key)
4026 mprintf ((0,"Returning %c!\n",kc_keyboard[(int)key].value));
4027 return (kc_keyboard[(int)key].value);
4030 #if !defined(MACINTOSH)
4033 extern object *obj_find_first_of_type (int);
4034 void kconfig_read_external_controls()
4039 if ( !kc_enable_external_control ) return;
4041 if ( kc_external_version == 0 )
4042 memset( kc_external_control, 0, sizeof(ext_control_info));
4043 else if ( kc_external_version > 0 ) {
4045 if (kc_external_version>=4)
4046 memset( kc_external_control, 0, sizeof(advanced_ext_control_info));
4047 else if (kc_external_version>0)
4048 memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 );
4049 else if (kc_external_version>2)
4050 memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector) + sizeof(vms_matrix) +4 );
4052 if ( kc_external_version > 1 ) {
4053 // Write ship pos and angles to external controls...
4054 ubyte *temp_ptr = (ubyte *)kc_external_control;
4055 vms_vector *ship_pos;
4056 vms_matrix *ship_orient;
4057 memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
4058 temp_ptr += sizeof(ext_control_info) + sizeof(vms_angvec) + 64;
4059 ship_pos = (vms_vector *)temp_ptr;
4060 temp_ptr += sizeof(vms_vector);
4061 ship_orient = (vms_matrix *)temp_ptr;
4062 // Fill in ship postion...
4063 *ship_pos = Objects[Players[Player_num].objnum].pos;
4064 // Fill in ship orientation...
4065 *ship_orient = Objects[Players[Player_num].objnum].orient;
4067 if (kc_external_version>=4)
4069 advanced_ext_control_info *temp_ptr=(advanced_ext_control_info *)kc_external_control;
4071 temp_ptr->headlight_state=(Players[Player_num].flags & PLAYER_FLAGS_HEADLIGHT_ON);
4072 temp_ptr->primary_weapon_flags=Players[Player_num].primary_weapon_flags;
4073 temp_ptr->secondary_weapon_flags=Players[Player_num].secondary_weapon_flags;
4074 temp_ptr->current_primary_weapon=Primary_weapon;
4075 temp_ptr->current_secondary_weapon=Secondary_weapon;
4077 temp_ptr->current_guidebot_command=Escort_goal_object;
4079 temp_ptr->force_vector=ExtForceVec;
4080 temp_ptr->force_matrix=ExtApplyForceMatrix;
4082 temp_ptr->joltinfo[i]=ExtJoltInfo[i];
4084 temp_ptr->x_vibrate_info[i]=ExtXVibrateInfo[i];
4085 temp_ptr->x_vibrate_clear=ExtXVibrateClear;
4086 temp_ptr->game_status=ExtGameStatus;
4088 memset ((void *)&ExtForceVec,0,sizeof(vms_vector));
4089 memset ((void *)&ExtApplyForceMatrix,0,sizeof(vms_matrix));
4094 ExtXVibrateInfo[i]=0;
4099 if ( Automap_active ) // (If in automap...)
4100 kc_external_control->automap_state = 1;
4101 //memset(&r,0,sizeof(r));
4105 int386 ( kc_external_intno, &r, &r); // Read external info...
4109 if ( Player_num > -1 ) {
4110 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL); // Turn off roll when turning
4111 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING); // Turn off leveling to nearest side.
4112 Auto_leveling_on = 0;
4114 if ( kc_external_version > 0 ) {
4115 vms_matrix tempm, ViewMatrix;
4116 vms_angvec * Kconfig_abs_movement;
4119 Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(ext_control_info));
4121 if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h ) {
4122 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
4123 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
4124 Objects[Players[Player_num].objnum].orient = ViewMatrix;
4126 oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
4127 if (oem_message[0] != '\0' )
4128 HUD_init_message( oem_message );
4132 Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);
4133 Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
4134 Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
4135 Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
4136 Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
4137 Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
4138 Controls.rear_view_down_count += kc_external_control->rear_view_down_count;
4139 Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;
4140 Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
4141 Controls.fire_primary_state |= kc_external_control->fire_primary_state;
4142 Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
4143 Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
4144 Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
4145 Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;
4146 Controls.automap_down_count += kc_external_control->automap_down_count;
4147 Controls.automap_state |= kc_external_control->automap_state;
4149 if (kc_external_version>=3)
4151 ubyte *temp_ptr = (ubyte *)kc_external_control;
4152 temp_ptr += (sizeof(ext_control_info) + sizeof(vms_angvec) + 64 + sizeof(vms_vector) + sizeof (vms_matrix));
4155 Controls.cycle_primary_count=(*(temp_ptr));
4157 Controls.cycle_secondary_count=(*(temp_ptr+1));
4160 Controls.afterburner_state=(*(temp_ptr+2));
4162 Controls.headlight_count=(*(temp_ptr+3));
4164 if (kc_external_version>=4)
4167 advanced_ext_control_info *temp_ptr=(advanced_ext_control_info *)kc_external_control;
4170 if (temp_ptr->keyboard[i])
4173 if (temp_ptr->Reactor_blown)
4175 if (Game_mode & GM_MULTI)
4176 net_destroy_controlcen (obj_find_first_of_type (OBJ_CNTRLCEN));
4178 do_controlcen_destroyed_stuff(obj_find_first_of_type (OBJ_CNTRLCEN));