1 /* $Id: kconfig.c,v 1.24 2003-10-08 19:18:46 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.24 2003-10-08 19:18:46 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 };
432 int joybutton_text[28] =
433 { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
437 TNUM_HAT_L, TNUM_HAT_R, TNUM_HAT_U, TNUM_HAT_D,
441 int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
443 int joybutton_text[28] =
444 { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
445 -1, TNUM_TRIG, TNUM_LEFT, TNUM_HAT_L,
446 TNUM_RIGHT, -1, TNUM_HAT2_D, TNUM_HAT_R,
447 TNUM_MID, -1, TNUM_HAT2_R, TNUM_HAT_U,
448 TNUM_HAT2_L, -1, TNUM_HAT2_U, TNUM_HAT_D,
449 TNUM_TRIG, TNUM_LEFT, TNUM_RIGHT, -1,
450 TNUM_UP, TNUM_DOWN, TNUM_LEFT, TNUM_RIGHT };
452 int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
453 // int joyaxis_text[4] = { TNUM_X1, TNUM_Y1, TNUM_X2, TNUM_Y2 };
456 int mouseaxis_text[3] = { TNUM_L_R, TNUM_F_B, TNUM_Z1 };
458 int mousebutton_text[3] = { TNUM_LEFT, TNUM_RIGHT, TNUM_MID };
459 char * mousebutton_textra[13] = { "M4", "M5", "M6", "M7", "M8", "M9", "M10","M11","M12","M13","M14","M15","M16" };//text for buttons above 3. -MPM
461 char *mousebutton_text[3] = { "Btn", "", "" }; // only one silly mouse button on the mac
465 char * key_text[256] = {
466 "","S","D","F","H","G","Z","X","C","V","","B","Q", "W", "E", "R",
467 "Y","T","1","2","3","4","6","5","=","9","7","-", "8", "0", "]", "O",
468 "U","[","I","P","RET","L","J","'","K", ";", "\\", ",", "/", "N", "M", ".",
469 "TAB","SPC","`","DEL","","ESC","","APL","SHIFT","CAPSL","OPTN","CTRL","","","","A",
470 "","PAD.","","PAD*","","PAD+","","NMLCK","","","","PAD/","ENTER","","PAD-","",
471 "","PAD=","PAD0","PAD1","PAD2","PAD3","PAD4","PAD5","PAD6","PAD7","","PAD8","PAD9","","","",
472 "F5","F6","F7","","F8","F9","","F11","","F13","","F14","","F10","","F12",
473 "","PAUSE","HELP","HOME","PGUP","DEL","","END","F2","","F1","LARW","RARW","DARW","UARW","",
474 "","","","","","","","","","","","","","","","",
475 "","","","","","","","","","","","","","","","",
476 "","","","","","","","","","","","","","","","",
477 "","","","","","","","","","","","","","","","",
478 "","","","","","","","","","","","","","","","",
479 "","","","","","","","","","","","","","","","",
480 "","","","","","","","","","","","","","","","",
481 "","","","","","","","","","","","","","","",""};
483 #if !defined OGL && !defined SDL_INPUT
484 char * key_text[256] = { \
485 "","ESC","1","2","3","4","5","6","7","8","9","0","-", \
486 "=","BSPC","TAB","Q","W","E","R","T","Y","U","I","O", \
487 "P","[","]","
\83","LCTRL","A","S","D","F", \
488 "G","H","J","K","L",";","'","`", \
489 "LSHFT","\\","Z","X","C","V","B","N","M",",", \
490 ".","/","RSHFT","PAD*","LALT","SPC", \
491 "CPSLK","F1","F2","F3","F4","F5","F6","F7","F8","F9", \
492 "F10","NMLCK","SCLK","PAD7","PAD8","PAD9","PAD-", \
493 "PAD4","PAD5","PAD6","PAD+","PAD1","PAD2","PAD3","PAD0", \
494 "PAD.","","","","F11","F12","","","","","","","","","", \
495 "","","","","","","","","","","","","","","","","","","","", \
496 "","","","","","","","","","","","","","","","","","","","", \
497 "","","","","","","","","","","","","","","","","","", \
498 "PAD
\83","RCTRL","","","","","","","","","","","","","", \
499 "","","","","","","","","","","PAD/","","","RALT","", \
500 "","","","","","","","","","","","","","HOME","
\82","PGUP", \
501 "","
\81","","
\7f","","END","
\80","PGDN","INS", \
502 "DEL","","","","","","","","","","","","","","","","","", \
503 "","","","","","","","","","","","","","","","","","","","", \
504 "","","","","","","" };
509 //added/removed by Victor Rachels for adding rebindable keys for these
510 // KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0
511 ubyte system_keys[] = { KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_MINUS, KEY_EQUAL, KEY_PRINT_SCREEN };
513 ubyte system_keys[] = { KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_PRINT_SCREEN };
516 //extern void GameLoop(int, int );
518 extern void transfer_energy_to_shield(fix);
519 extern void CyclePrimary(),CycleSecondary(),InitMarkerInput();
520 extern ubyte DefiningMarkerMessage;
521 extern char CybermouseActive;
524 extern int joydefsw_do_button();
525 extern int joydefsw_do_winjoybutton(int *axis);
526 extern joydefsw_win_joyselect(char *title);
529 control_info Controls;
533 // macros for drawing lo/hi res kconfig screens (see scores.c as well)
535 #define LHX(x) ((x)*(MenuHires?2:1))
536 #define LHY(y) ((y)*(MenuHires?2.4:1))
540 #define BT_MOUSE_BUTTON 1
541 #define BT_MOUSE_AXIS 2
542 #define BT_JOY_BUTTON 3
543 #define BT_JOY_AXIS 4
546 char *btype_text[] = { "BT_KEY", "BT_MOUSE_BUTTON", "BT_MOUSE_AXIS", "BT_JOY_BUTTON", "BT_JOY_AXIS", "BT_INVERT" };
550 typedef struct kc_item {
551 short id; // The id of this item
559 ubyte value; // what key,button,etc
565 ubyte kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS];
567 //added on 2/4/99 by Victor Rachels to add d1x new keys
568 ubyte kconfig_d2x_settings[MAX_D2X_CONTROLS];
569 //end this section addition - VR
571 //----------- WARNING!!!!!!! -------------------------------------------
572 // THESE NEXT FOUR BLOCKS OF DATA ARE GENERATED BY PRESSING DEL+F12 WHEN
573 // IN THE KEYBOARD CONFIG SCREEN. BASICALLY, THAT PROCEDURE MODIFIES THE
574 // U,D,L,R FIELDS OF THE ARRAYS AND DUMPS THE NEW ARRAYS INTO KCONFIG.COD
575 //-------------------------------------------------------------------------
576 /*ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
577 {0xc8,0x48,0xd0,0x50,0xcb,0x4b,0xcd,0x4d,0x38,0xff,0xff,0x4f,0xff,0x51,0xff,0x4a,0xff,0x4e,0xff,0xff,0x10,0x47,0x12,0x49,0x1d,0x9d,0x39,0xff,0x21,0xff,0x1e,0xff,0x2c,0xff,0x30,0xff,0x13,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xff,0x1f,0xff,0x33,0xff,0x34,0xff,0x23,0xff,0x14,0xff,0xff,0xff,0x0,0x0},
578 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
579 {0x5,0xc,0xff,0xff,0xff,0xff,0x7,0xf,0x13,0xb,0xff,0x6,0x8,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
580 {0x0,0x1,0xff,0xff,0x2,0xff,0x7,0xf,0x13,0xb,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0x3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
581 {0x3,0x0,0x1,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
582 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
583 {0x0,0x1,0xff,0xff,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},
587 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
588 {0xc8,0x48,0xd0,0x50,0xcb,0x4b,0xcd,0x4d,0x38,0xff,0xff,0x4f,0xff,0x51,0xff,0x4a,0xff,0x4e,0xff,0xff,0x10,0x47,0x12,0x49,0x1d,0x9d,0x39,0xff,0x21,0xff,0x1e,0xff,0x2c,0xff,0x30,0xff,0x13,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf,0xff,0x1f,0xff,0x33,0xff,0x34,0xff,0x23,0xff,0x14,0xff,0xff,0xff,0x0,0x0},
589 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
590 {0x5,0xc,0xff,0xff,0xff,0xff,0x7,0xf,0x13,0xb,0xff,0x6,0x8,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0},
591 {0x0,0x1,0xff,0xff,0x2,0xff,0x7,0xf,0x13,0xb,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
592 {0x3,0x0,0x1,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
593 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
594 {0x0,0x1,0xff,0xff,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
596 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
602 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
603 { 0, 15, 49, 71, 26, 55, 2, 55, 1,"Pitch forward", BT_KEY, 255 },
604 { 1, 15, 49,100, 26, 50, 3, 0, 24,"Pitch forward", BT_KEY, 255 },
605 { 2, 15, 57, 71, 26, 0, 4, 25, 3,"Pitch backward", BT_KEY, 255 },
606 { 3, 15, 57,100, 26, 1, 5, 2, 26,"Pitch backward", BT_KEY, 255 },
607 { 4, 15, 65, 71, 26, 2, 6, 27, 5,"Turn left", BT_KEY, 255 },
608 { 5, 15, 65,100, 26, 3, 7, 4, 28,"Turn left", BT_KEY, 255 },
609 { 6, 15, 73, 71, 26, 4, 8, 29, 7,"Turn right", BT_KEY, 255 },
610 { 7, 15, 73,100, 26, 5, 9, 6, 34,"Turn right", BT_KEY, 255 },
611 { 8, 15, 85, 71, 26, 6, 10, 35, 9,"Slide on", BT_KEY, 255 },
612 { 9, 15, 85,100, 26, 7, 11, 8, 36,"Slide on", BT_KEY, 255 },
613 { 10, 15, 93, 71, 26, 8, 12, 37, 11,"Slide left", BT_KEY, 255 },
614 { 11, 15, 93,100, 26, 9, 13, 10, 44,"Slide left", BT_KEY, 255 },
615 { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
616 { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
617 { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
618 { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
619 { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
620 { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
621 { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
622 { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
623 { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
624 { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
625 { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
626 { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
627 { 24,158, 49, 83, 26, 51, 26, 1, 25,"Fire primary", BT_KEY, 255 },
628 { 25,158, 49,112, 26, 54, 27, 24, 2,"Fire primary", BT_KEY, 255 },
629 { 26,158, 57, 83, 26, 24, 28, 3, 27,"Fire secondary", BT_KEY, 255 },
630 { 27,158, 57,112, 26, 25, 29, 26, 4,"Fire secondary", BT_KEY, 255 },
631 { 28,158, 65, 83, 26, 26, 34, 5, 29,"Fire flare", BT_KEY, 255 },
632 { 29,158, 65,112, 26, 27, 35, 28, 6,"Fire flare", BT_KEY, 255 },
633 { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
634 { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
635 { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
636 { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
637 { 34,158, 73, 83, 26, 28, 36, 7, 35,"Drop Bomb", BT_KEY, 255 },
638 { 35,158, 73,112, 26, 29, 37, 34, 8,"Drop Bomb", BT_KEY, 255 },
639 { 36,158, 85, 83, 26, 34, 44, 9, 37,"REAR VIEW", BT_KEY, 255 },
640 { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
641 { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
642 { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
643 { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
644 { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
645 { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
646 { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
647 { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
648 { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
649 { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
650 { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
651 { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
652 { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
653 { 50, 15,169, 71, 26, 48, 1, 53, 51,"Cycle Second", BT_KEY, 255 },
654 { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
655 { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
656 { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
657 { 54,158,171, 83, 26, 52, 56, 51, 55,"Energy->Shield", BT_KEY, 255 },
658 { 55,158,171,112, 26, 53, 0, 54, 0,"Energy->Shield", BT_KEY, 255 },
659 { 56,158,179,83, 26, 54, 0, 0, 0, "Toggle Bomb", BT_KEY,255},
661 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
662 { 0, 25, 46, 85, 26, 15, 1, 24, 5,"Fire primary", BT_JOY_BUTTON, 255 },
663 { 1, 25, 54, 85, 26, 0, 4, 5, 6,"Fire secondary", BT_JOY_BUTTON, 255 },
664 { 2, 25, 85, 85, 26, 26, 3, 9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
665 { 3, 25, 93, 85, 26, 2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
666 { 4, 25, 62, 85, 26, 1, 26, 6, 7,"Fire flare", BT_JOY_BUTTON, 255 },
667 { 5,180, 46, 79, 26, 23, 6, 0, 1,"Slide on", BT_JOY_BUTTON, 255 },
668 { 6,180, 54, 79, 26, 5, 7, 1, 4,"Slide left", BT_JOY_BUTTON, 255 },
669 { 7,180, 62, 79, 26, 6, 8, 4, 26,"Slide right", BT_JOY_BUTTON, 255 },
670 { 8,180, 70, 79, 26, 7, 9, 26, 9,"Slide up", BT_JOY_BUTTON, 255 },
671 { 9,180, 78, 79, 26, 8, 10, 8, 2,"Slide down", BT_JOY_BUTTON, 255 },
672 { 10,180, 90, 79, 26, 9, 11, 2, 3,"Bank on", BT_JOY_BUTTON, 255 },
673 { 11,180, 98, 79, 26, 10, 12, 3, 12,"Bank left", BT_JOY_BUTTON, 255 },
674 { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
675 { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
676 { 14, 22,154, 99, 8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
677 { 15, 22,162, 51, 26, 13, 0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
678 { 16, 22,162, 99, 8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
679 { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
680 { 18,164,154,106, 8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
681 { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
682 { 20,164,162,106, 8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
683 { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
684 { 22,164,172,106, 8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
685 { 23,164,180, 58, 26, 21, 5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
686 { 24,164,180,106, 8, 22, 13, 23, 0,"throttle", BT_INVERT, 255 },
687 { 25, 25,109, 85, 26, 3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
688 { 26, 25, 70, 85, 26, 4, 2, 7, 8,"Drop Bomb", BT_JOY_BUTTON, 255 },
689 { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
690 { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
691 { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
692 { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
694 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
695 { 0, 25, 46, 85, 26, 15, 1, 24, 5,"Fire primary", BT_JOY_BUTTON, 255 },
696 { 1, 25, 54, 85, 26, 0, 4, 5, 6,"Fire secondary", BT_JOY_BUTTON, 255 },
697 { 2, 25, 85, 85, 26, 26, 3, 9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
698 { 3, 25, 93, 85, 26, 2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
699 { 4, 25, 62, 85, 26, 1, 26, 6, 7,"Fire flare", BT_JOY_BUTTON, 255 },
700 { 5,180, 46, 79, 26, 23, 6, 0, 1,"Slide on", BT_JOY_BUTTON, 255 },
701 { 6,180, 54, 79, 26, 5, 7, 1, 4,"Slide left", BT_JOY_BUTTON, 255 },
702 { 7,180, 62, 79, 26, 6, 8, 4, 26,"Slide right", BT_JOY_BUTTON, 255 },
703 { 8,180, 70, 79, 26, 7, 9, 26, 9,"Slide up", BT_JOY_BUTTON, 255 },
704 { 9,180, 78, 79, 26, 8, 10, 8, 2,"Slide down", BT_JOY_BUTTON, 255 },
705 { 10,180, 90, 79, 26, 9, 11, 2, 3,"Bank on", BT_JOY_BUTTON, 255 },
706 { 11,180, 98, 79, 26, 10, 12, 3, 12,"Bank left", BT_JOY_BUTTON, 255 },
707 { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
708 { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
709 { 14, 22,154, 99, 8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
710 { 15, 22,162, 51, 26, 13, 0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
711 { 16, 22,162, 99, 8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
712 { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
713 { 18,164,154,106, 8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
714 { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
715 { 20,164,162,106, 8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
716 { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
717 { 22,164,172,106, 8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
718 { 23,164,180, 58, 26, 21, 5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
719 { 24,164,180,106, 8, 22, 13, 23, 0,"throttle", BT_INVERT, 255 },
720 { 25, 25,109, 85, 26, 3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
721 { 26, 25, 70, 85, 26, 4, 2, 7, 8,"Drop Bomb", BT_JOY_BUTTON, 255 },
722 { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
723 { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
724 { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
725 { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
728 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
729 { 0, 25, 46, 85, 26, 12, 1, 24, 5,"Fire primary", BT_MOUSE_BUTTON, 255 },
730 { 1, 25, 54, 85, 26, 0, 4, 5, 6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
731 { 2, 25, 85, 85, 26, 26, 3, 9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
732 { 3, 25, 93, 85, 26, 2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
733 { 4, 25, 62, 85, 26, 1, 26, 6, 7,"Fire flare", BT_MOUSE_BUTTON, 255 },
734 { 5,180, 46, 59, 26, 24, 6, 0, 1,"Slide on", BT_MOUSE_BUTTON, 255 },
735 { 6,180, 54, 59, 26, 5, 7, 1, 4,"Slide left", BT_MOUSE_BUTTON, 255 },
736 { 7,180, 62, 59, 26, 6, 8, 4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
737 { 8,180, 70, 59, 26, 7, 9, 26, 9,"Slide up", BT_MOUSE_BUTTON, 255 },
738 { 9,180, 78, 59, 26, 8, 10, 8, 2,"Slide down", BT_MOUSE_BUTTON, 255 },
739 { 10,180, 90, 59, 26, 9, 11, 2, 3,"Bank on", BT_MOUSE_BUTTON, 255 },
740 { 11,180, 98, 59, 26, 10, 12, 3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
741 { 12,180,106, 59, 26, 11, 0, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
742 { 13,103,138, 58, 26, 27, 15, 25, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
743 { 14,103,138,106, 8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
744 { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
745 { 16,103,146,106, 8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
746 { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
747 { 18,103,154,106, 8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
748 { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
749 { 20,103,162,106, 8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
750 { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
751 { 22,103,170,106, 8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
752 { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
753 { 24,103,182,106, 8, 22, 5, 23, 0,"throttle", BT_INVERT, 255 },
754 { 25, 25,109, 85, 26, 3, 27, 12, 13,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
755 { 26, 25, 70, 85, 26, 4, 2, 7, 8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
756 { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
760 //added on 2/4/99 by Victor Rachels to add d1x new keys
761 kc_item kc_d2x[NUM_D2X_CONTROLS] = {
762 // id,x,y,w1,w2,u,d,l,r,text_num1,type,value
763 { 0, 15, 49, 71, 26, 27, 2, 27, 1, "WEAPON 1", BT_KEY, 255},
764 { 1, 15, 49,100, 26, 26, 3, 0, 2, "WEAPON 1", BT_JOY_BUTTON, 255},
765 { 2, 15, 57, 71, 26, 0, 4, 1, 3, "WEAPON 2", BT_KEY, 255},
766 { 3, 15, 57,100, 26, 1, 5, 2, 4, "WEAPON 2", BT_JOY_BUTTON, 255},
767 { 4, 15, 65, 71, 26, 2, 6, 3, 5, "WEAPON 3", BT_KEY, 255},
768 { 5, 15, 65,100, 26, 3, 7, 4, 6, "WEAPON 3", BT_JOY_BUTTON, 255},
769 { 6, 15, 73, 71, 26, 4, 8, 5, 7, "WEAPON 4", BT_KEY, 255},
770 { 7, 15, 73,100, 26, 5, 9, 6, 8, "WEAPON 4", BT_JOY_BUTTON, 255},
771 { 8, 15, 81, 71, 26, 6, 10, 7, 9, "WEAPON 5", BT_KEY, 255},
772 { 9, 15, 81,100, 26, 7, 11, 8, 10, "WEAPON 5", BT_JOY_BUTTON, 255},
774 { 10, 15, 89, 71, 26, 8, 12, 9, 11, "WEAPON 6", BT_KEY, 255},
775 { 11, 15, 89,100, 26, 9, 13, 10, 12, "WEAPON 6", BT_JOY_BUTTON, 255},
776 { 12, 15, 97, 71, 26, 10, 14, 11, 13, "WEAPON 7", BT_KEY, 255},
777 { 13, 15, 97,100, 26, 11, 15, 12, 14, "WEAPON 7", BT_JOY_BUTTON, 255},
778 { 14, 15,105, 71, 26, 12, 16, 13, 15, "WEAPON 8", BT_KEY, 255},
779 { 15, 15,105,100, 26, 13, 17, 14, 16, "WEAPON 8", BT_JOY_BUTTON, 255},
780 { 16, 15,113, 71, 26, 14, 18, 15, 17, "WEAPON 9", BT_KEY, 255},
781 { 17, 15,113,100, 26, 15, 19, 16, 18, "WEAPON 9", BT_JOY_BUTTON, 255},
782 { 18, 15,121, 71, 26, 16, 20, 17, 19, "WEAPON 0", BT_KEY, 255},
783 { 19, 15,121,100, 26, 17, 21, 18, 20, "WEAPON 0", BT_JOY_BUTTON, 255},
785 //{ 20, 15,131, 71, 26, 18, 22, 19, 21, "CYC PRIMARY", BT_KEY, 255},
786 //{ 21, 15,131,100, 26, 19, 23, 20, 22, "CYC PRIMARY", BT_JOY_BUTTON, 255},
787 //{ 22, 15,139, 71, 26, 20, 24, 21, 23, "CYC SECONDARY", BT_KEY, 255},
788 //{ 23, 15,139,100, 26, 21, 25, 22, 24, "CYC SECONDARY", BT_JOY_BUTTON, 255},
789 //{ 24, 8,147, 78, 26, 22, 26, 23, 25, "TOGGLE_PRIM AUTO", BT_KEY, 255},
790 //{ 25, 8,147,107, 26, 23, 27, 24, 26, "TOGGLE_PRIM_AUTO", BT_JOY_BUTTON, 255},
791 //{ 26, 8,155, 78, 26, 24, 1, 25, 27, "TOGGLE SEC AUTO", BT_KEY, 255},
792 //{ 27, 8,155,107, 26, 25, 0, 26, 0, "TOGGLE SEC AUTO", BT_JOY_BUTTON, 255},
794 //end this section addition - VR
797 #else // ifndef MACINTOSH (following are macintosh controls)
799 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
800 {0x5b,0x7e,0x54,0x7d,0x56,0x7b,0x58,0x7c,0x3a,0xff,0xff,0x53,0xff,0x55,0xff,0x4e,0xff,0x45,0xff,0xff,0xc,0x59,0xe,0x5c,0x3b,0x24,0x31,0xff,0x3,0xff,0x3f,0xff,0x6,0xff,0xb,0xff,0xf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0xff,0x1,0xff,0x2b,0xff,0x2f,0xff,0x4,0xff,0x11,0xff,0xff,0xff,0x0,0x0},
801 {0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
802 {0x0,0x3,0xff,0xff,0xff,0xff,0xb,0xc,0x9,0xa,0xff,0x1,0x2,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0},
803 {0x5,0x4,0xff,0xff,0x6,0xff,0x3,0x2,0x0,0x1,0xff,0x8,0xa,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0x3,0x1,0xb,0x7,0xd,0xe,0xf,0xc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
804 {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
805 {0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0},
806 {0x0,0x1,0xff,0xff,0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0},
809 ubyte default_firebird_settings[MAX_CONTROLS] =
810 {0x0,0x1,0xff,0xff,0x2,0xff,0x4,0x6,0x5,0x7,0xff,0xb,0xc,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0x03,0x0,0xff,0x3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0};
812 ubyte default_mousestick_settings[MAX_CONTROLS] =
813 {0x2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3,0x4,0x1,0x0,0x0,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0x0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0};
815 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
816 { 0, 15, 49, 71, 26, 55, 2, 55, 1,"Pitch forward", BT_KEY, 255 },
817 { 1, 15, 49,100, 26, 50, 3, 0, 24,"Pitch forward", BT_KEY, 255 },
818 { 2, 15, 57, 71, 26, 0, 4, 25, 3,"Pitch backward", BT_KEY, 255 },
819 { 3, 15, 57,100, 26, 1, 5, 2, 26,"Pitch backward", BT_KEY, 255 },
820 { 4, 15, 65, 71, 26, 2, 6, 27, 5,"Turn left", BT_KEY, 255 },
821 { 5, 15, 65,100, 26, 3, 7, 4, 28,"Turn left", BT_KEY, 255 },
822 { 6, 15, 73, 71, 26, 4, 8, 29, 7,"Turn right", BT_KEY, 255 },
823 { 7, 15, 73,100, 26, 5, 9, 6, 34,"Turn right", BT_KEY, 255 },
824 { 8, 15, 85, 71, 26, 6, 10, 35, 9,"Slide on", BT_KEY, 255 },
825 { 9, 15, 85,100, 26, 7, 11, 8, 36,"Slide on", BT_KEY, 255 },
826 { 10, 15, 93, 71, 26, 8, 12, 37, 11,"Slide left", BT_KEY, 255 },
827 { 11, 15, 93,100, 26, 9, 13, 10, 44,"Slide left", BT_KEY, 255 },
828 { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
829 { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
830 { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
831 { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
832 { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
833 { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
834 { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
835 { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
836 { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
837 { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
838 { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
839 { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
840 { 24,158, 49, 83, 26, 51, 26, 1, 25,"Fire primary", BT_KEY, 255 },
841 { 25,158, 49,112, 26, 54, 27, 24, 2,"Fire primary", BT_KEY, 255 },
842 { 26,158, 57, 83, 26, 24, 28, 3, 27,"Fire secondary", BT_KEY, 255 },
843 { 27,158, 57,112, 26, 25, 29, 26, 4,"Fire secondary", BT_KEY, 255 },
844 { 28,158, 65, 83, 26, 26, 34, 5, 29,"Fire flare", BT_KEY, 255 },
845 { 29,158, 65,112, 26, 27, 35, 28, 6,"Fire flare", BT_KEY, 255 },
846 { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
847 { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
848 { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
849 { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
850 { 34,158, 73, 83, 26, 28, 36, 7, 35,"Drop Bomb", BT_KEY, 255 },
851 { 35,158, 73,112, 26, 29, 37, 34, 8,"Drop Bomb", BT_KEY, 255 },
852 { 36,158, 85, 83, 26, 34, 44, 9, 37,"REAR VIEW", BT_KEY, 255 },
853 { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
854 { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
855 { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
856 { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
857 { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
858 { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
859 { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
860 { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
861 { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
862 { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
863 { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
864 { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
865 { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
866 { 50, 15,169, 71, 26, 48, 1, 53, 51,"Cycle Second", BT_KEY, 255 },
867 { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
868 { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
869 { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
870 { 54,158,171, 83, 26, 52, 25, 51, 55,"Energy->Shield", BT_KEY, 255 },
871 { 55,158,171,112, 26, 53, 0, 54, 0,"Energy->Shield", BT_KEY, 255 },
873 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
874 { 0, 25, 46, 85, 28, 15, 1, 24, 5,"Fire primary", BT_JOY_BUTTON, 255 },
875 { 1, 25, 54, 85, 28, 0, 4, 5, 6,"Fire secondary", BT_JOY_BUTTON, 255 },
876 { 2, 25, 85, 85, 28, 26, 3, 9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
877 { 3, 25, 93, 85, 28, 2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
878 { 4, 25, 62, 85, 28, 1, 26, 6, 7,"Fire flare", BT_JOY_BUTTON, 255 },
879 { 5,180, 46, 79, 28, 23, 6, 0, 1,"Slide on", BT_JOY_BUTTON, 255 },
880 { 6,180, 54, 79, 28, 5, 7, 1, 4,"Slide left", BT_JOY_BUTTON, 255 },
881 { 7,180, 62, 79, 28, 6, 8, 4, 26,"Slide right", BT_JOY_BUTTON, 255 },
882 { 8,180, 70, 79, 28, 7, 9, 26, 9,"Slide up", BT_JOY_BUTTON, 255 },
883 { 9,180, 78, 79, 28, 8, 10, 8, 2,"Slide down", BT_JOY_BUTTON, 255 },
884 { 10,180, 90, 79, 28, 9, 11, 2, 3,"Bank on", BT_JOY_BUTTON, 255 },
885 { 11,180, 98, 79, 28, 10, 12, 3, 12,"Bank left", BT_JOY_BUTTON, 255 },
886 { 12,180,106, 79, 28, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
887 { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
888 { 14, 22,154, 99, 8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
889 { 15, 22,162, 51, 26, 13, 0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
890 { 16, 22,162, 99, 8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
891 { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
892 { 18,164,154,106, 8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
893 { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
894 { 20,164,162,106, 8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
895 { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
896 { 22,164,172,106, 8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
897 { 23,164,180, 58, 26, 21, 5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
898 { 24,164,180,106, 8, 22, 13, 23, 0,"throttle", BT_INVERT, 255 },
899 { 25, 25,109, 85, 28, 3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
900 { 26, 25, 70, 85, 28, 4, 2, 7, 8,"Drop Bomb", BT_JOY_BUTTON, 255 },
901 { 27, 25,117, 85, 28, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
902 { 28,180,114, 79, 28, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
903 { 29,180,122, 79, 28, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
904 { 30, 25,125, 85, 28, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
906 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
907 { 0, 25, 46, 85, 26, 15, 1, 24, 5,"Fire primary", BT_JOY_BUTTON, 255 },
908 { 1, 25, 54, 85, 26, 0, 4, 5, 6,"Fire secondary", BT_JOY_BUTTON, 255 },
909 { 2, 25, 85, 85, 26, 26, 3, 9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
910 { 3, 25, 93, 85, 26, 2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
911 { 4, 25, 62, 85, 26, 1, 26, 6, 7,"Fire flare", BT_JOY_BUTTON, 255 },
912 { 5,180, 46, 79, 26, 23, 6, 0, 1,"Slide on", BT_JOY_BUTTON, 255 },
913 { 6,180, 54, 79, 26, 5, 7, 1, 4,"Slide left", BT_JOY_BUTTON, 255 },
914 { 7,180, 62, 79, 26, 6, 8, 4, 26,"Slide right", BT_JOY_BUTTON, 255 },
915 { 8,180, 70, 79, 26, 7, 9, 26, 9,"Slide up", BT_JOY_BUTTON, 255 },
916 { 9,180, 78, 79, 26, 8, 10, 8, 2,"Slide down", BT_JOY_BUTTON, 255 },
917 { 10,180, 90, 79, 26, 9, 11, 2, 3,"Bank on", BT_JOY_BUTTON, 255 },
918 { 11,180, 98, 79, 26, 10, 12, 3, 12,"Bank left", BT_JOY_BUTTON, 255 },
919 { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
920 { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
921 { 14, 22,154, 99, 8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
922 { 15, 22,162, 51, 26, 13, 0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
923 { 16, 22,162, 99, 8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
924 { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
925 { 18,164,154,106, 8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
926 { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
927 { 20,164,162,106, 8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
928 { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
929 { 22,164,172,106, 8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
930 { 23,164,180, 58, 26, 21, 5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
931 { 24,164,180,106, 8, 22, 13, 23, 0,"throttle", BT_INVERT, 255 },
932 { 25, 25,109, 85, 26, 3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
933 { 26, 25, 70, 85, 26, 4, 2, 7, 8,"Drop Bomb", BT_JOY_BUTTON, 255 },
934 { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
935 { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
936 { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
937 { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
940 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
941 { 0, 25, 46, 85, 26, 28, 1, 28, 5,"Fire primary", BT_MOUSE_BUTTON, 255 },
942 { 1, 25, 54, 85, 26, 0, 4, 5, 6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
943 { 2, 25, 85, 85, 26, 26, 3, 9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
944 { 3, 25, 93, 85, 26, 2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
945 { 4, 25, 62, 85, 26, 1, 26, 6, 7,"Fire flare", BT_MOUSE_BUTTON, 255 },
946 { 5,180, 46, 59, 26, 24, 6, 0, 1,"Slide on", BT_MOUSE_BUTTON, 255 },
947 { 6,180, 54, 59, 26, 5, 7, 1, 4,"Slide left", BT_MOUSE_BUTTON, 255 },
948 { 7,180, 62, 59, 26, 6, 8, 4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
949 { 8,180, 70, 59, 26, 7, 9, 26, 9,"Slide up", BT_MOUSE_BUTTON, 255 },
950 { 9,180, 78, 59, 26, 8, 10, 8, 2,"Slide down", BT_MOUSE_BUTTON, 255 },
951 { 10,180, 90, 59, 26, 9, 11, 2, 3,"Bank on", BT_MOUSE_BUTTON, 255 },
952 { 11,180, 98, 59, 26, 10, 12, 3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
953 { 12,180,106, 59, 26, 11, 28, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
954 { 13,103,138, 58, 26, 27, 15, 27, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
955 { 14,103,138,106, 8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
956 { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
957 { 16,103,146,106, 8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
958 { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
959 { 18,103,154,106, 8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
960 { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
961 { 20,103,162,106, 8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
962 { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
963 { 22,103,170,106, 8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
964 { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
965 { 24,103,182,106, 8, 22, 5, 23, 28,"throttle", BT_INVERT, 255 },
966 { 25, 25,109, 85, 26, 3, 27, 12, 27,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
967 { 26, 25, 70, 85, 26, 4, 2, 7, 8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
968 { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
973 //added on 2/4/99 by Victor Rachels to add new keys system
974 ubyte default_kconfig_d2x_settings[MAX_D2X_CONTROLS] = {
975 0x2 ,0xff,0x3 ,0xff,0x4 ,0xff,0x5 ,0xff,0x6 ,0xff,0x7 ,0xff,0x8 ,0xff,0x9 ,
976 0xff,0xa ,0xff,0xb ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
977 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
978 //end this section addition - VR
980 void kc_drawitem( kc_item *item, int is_current );
981 void kc_change_key( kc_item * item );
982 void kc_change_joybutton( kc_item * item );
983 void kc_change_mousebutton( kc_item * item );
984 void kc_change_joyaxis( kc_item * item );
985 void kc_change_mouseaxis( kc_item * item );
986 void kc_change_invert( kc_item * item );
987 void kconfig_read_fcs( int raw_axis );
988 void kconfig_set_fcs_button( int btn, int button );
989 void kconfig_read_external_controls( void );
991 int kconfig_is_axes_used(int axis)
994 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
995 if (( kc_joystick[i].type == BT_JOY_AXIS ) && (kc_joystick[i].value == axis ))
1001 #ifdef TABLE_CREATION
1002 int find_item_at( kc_item * items, int nitems, int x, int y )
1006 for (i=0; i<nitems; i++ ) {
1007 if ( ((items[i].x+items[i].w1)==x) && (items[i].y==y))
1013 int find_next_item_up( kc_item * items, int nitems, int citem )
1018 x = items[citem].x+items[citem].w1;
1023 y = grd_curcanv->cv_bitmap.bm_h-1;
1026 x = grd_curcanv->cv_bitmap.bm_w-1;
1029 i = find_item_at( items, nitems, x, y );
1035 int find_next_item_down( kc_item * items, int nitems, int citem )
1040 x = items[citem].x+items[citem].w1;
1044 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1047 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1051 i = find_item_at( items, nitems, x, y );
1057 int find_next_item_right( kc_item * items, int nitems, int citem )
1062 x = items[citem].x+items[citem].w1;
1066 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
1069 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
1073 i = find_item_at( items, nitems, x, y );
1079 int find_next_item_left( kc_item * items, int nitems, int citem )
1084 x = items[citem].x+items[citem].w1;
1089 x = grd_curcanv->cv_bitmap.bm_w-1;
1092 y = grd_curcanv->cv_bitmap.bm_h-1;
1095 i = find_item_at( items, nitems, x, y );
1102 #if defined(MACINTOSH) || defined(WINDOWS)
1103 int get_item_height(kc_item *item)
1108 if (item->value==255) {
1109 sprintf( btext, "" );
1111 switch( item->type ) {
1113 strncpy( btext, key_text[item->value], 10 ); break;
1114 case BT_MOUSE_BUTTON:
1116 strncpy( btext, Text_string[mousebutton_text[item->value]], 10); break;
1118 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1121 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1123 if ( joybutton_text[item->value] !=-1 )
1124 strncpy( btext, Text_string[ joybutton_text[item->value] ], 10 );
1126 sprintf( btext, "BTN%d", item->value );
1129 strncpy( btext, Text_string[joyaxis_text[item->value]], 10 ); break;
1131 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1134 gr_get_string_size(btext, &w, &h, &aw );
1140 void kconfig_sub(kc_item * items,int nitems, char * title)
1143 dd_grs_canvas * save_canvas,
1144 grs_canvas * save_canvas
1146 grs_font * save_font;
1147 int old_keyd_repeat;
1148 #if defined(MACINTOSH) || defined(WINDOWS)
1149 int mouse_state, omouse_state, mx, my, x1, x2, y1, y2;
1150 int close_x, close_y, close_size;
1153 int i,k,ocitem,citem;
1154 int time_stopped = 0;
1155 WIN(char *old_bg_pcx);
1157 WIN(old_bg_pcx = _SCRContext.bkg_filename);
1158 WIN(DEFINE_SCREEN(NULL));
1163 if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) )
1169 // if (Config_control_type == CONTROL_WINJOYSTICK) {
1171 // joydefsw_win_joyselect(title2); title = title2,
1173 // ); // Get Samir...
1177 save_canvas = dd_grd_curcanv,
1178 save_canvas = grd_curcanv
1183 dd_gr_set_current_canvas(NULL),
1184 gr_set_current_canvas(NULL)
1186 save_font = grd_curcanv->cv_font;
1191 game_flush_inputs();
1192 old_keyd_repeat = keyd_repeat;
1195 //gr_clear_canvas( BM_XRGB(0,0,0) );
1197 nm_draw_background(0, 0, grd_curcanv->cv_bitmap.bm_w - 1, grd_curcanv->cv_bitmap.bm_h - 1);
1198 gr_palette_load (gr_palette);
1200 grd_curcanv->cv_font = MEDIUM3_FONT;
1202 WIN(DDGRLOCK(dd_grd_curcanv));
1205 p = strchr( title, '\n' );
1207 gr_string( 0x8000, LHY(8), title );
1212 // if ( items == kc_keyboard ) {
1213 // gr_string( 0x8000, 8, "Keyboard" );
1214 // } else if ( items == kc_joystick ) {
1215 // gr_string( 0x8000, 8, "Joysticks" );
1216 // } else if ( items == kc_mouse ) {
1217 // gr_string( 0x8000, 8, "Mouse" );
1220 #if defined(MACINTOSH) || defined(WINDOWS)
1221 close_x = close_y = 15;
1223 gr_setcolor( BM_XRGB(0, 0, 0) );
1224 gr_rect(close_x, close_y, close_x + close_size, close_y + close_size);
1225 gr_setcolor( BM_XRGB(21, 21, 21) );
1226 gr_rect( close_x + 2, close_y + 2, close_x + close_size - 2, close_y + close_size -2 );
1229 grd_curcanv->cv_font = GAME_FONT;
1230 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1233 gr_string( 0x8000, LHY(20), TXT_KCONFIG_STRING_1 );
1235 gr_string( 0x8000, LHY(20), "Enter changes, ctrl-d deletes, ctrl-r resets defaults, ESC exits");
1237 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1238 if ( items == kc_keyboard ) {
1239 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1240 gr_setcolor( BM_XRGB(31,27,6) );
1242 gr_scanline( LHX(98), LHX(106), LHY(42) );
1243 gr_scanline( LHX(120), LHX(128), LHY(42) );
1244 gr_pixel( LHX(98), LHY(43) );
1245 gr_pixel( LHX(98), LHY(44) );
1246 gr_pixel( LHX(128), LHY(43) );
1247 gr_pixel( LHX(128), LHY(44) );
1249 gr_string( LHX(109), LHY(40), "OR" );
1251 gr_scanline( LHX(253), LHX(261), LHY(42) );
1252 gr_scanline( LHX(274), LHX(283), LHY(42) );
1253 gr_pixel( LHX(253), LHY(43) );
1254 gr_pixel( LHX(253), LHY(44) );
1255 gr_pixel( LHX(283), LHY(43) );
1256 gr_pixel( LHX(283), LHY(44) );
1258 gr_string( LHX(264), LHY(40), "OR" );
1260 } if ( items == kc_joystick ) {
1261 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1262 gr_setcolor( BM_XRGB(31,27,6) );
1263 gr_scanline( LHX(18), LHX(135), LHY(37) );
1264 gr_scanline( LHX(181), LHX(294), LHY(37) );
1265 gr_scanline( LHX(18), LHX(144), LHY(119+18) );
1266 gr_scanline( LHX(174), LHX(294), LHY(119+18) );
1267 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1268 gr_string( 0x8000,LHY(117+18), TXT_AXES );
1269 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1270 gr_string( LHX(81), LHY(137+8), TXT_AXIS );
1271 gr_string( LHX(111), LHY(137+8), TXT_INVERT );
1272 gr_string( LHX(222), LHY(137+8), TXT_AXIS );
1273 gr_string( LHX(252), LHY(137+8), TXT_INVERT );
1274 } else if ( items == kc_mouse ) {
1275 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1276 gr_setcolor( BM_XRGB(31,27,6) );
1277 gr_scanline( LHX(18), LHX(135), LHY(37) );
1278 gr_scanline( LHX(181), LHX(294), LHY(37) );
1279 gr_scanline( LHX(18), LHX(144), LHY(119+5) );
1280 gr_scanline( LHX(174), LHX(294), LHY(119+5) );
1281 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1282 gr_string( 0x8000,LHY(117+5), TXT_AXES );
1283 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1284 gr_string( LHX(169), LHY(129), TXT_AXIS );
1285 gr_string( LHX(199), LHY(129), TXT_INVERT );
1288 else if ( items == kc_d2x )
1290 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1291 gr_setcolor( BM_XRGB(31,27,6) );
1293 gr_string(LHX( 94), LHY(40), "KB");
1294 gr_string(LHX(121), LHY(40), "JOY");
1298 WIN(DDGRUNLOCK(dd_grd_curcanv));
1300 for (i=0; i<nitems; i++ ) {
1301 kc_drawitem( &items[i], 0 );
1305 kc_drawitem( &items[citem], 1 );
1310 #if defined(MACINTOSH) || defined(WINDOWS)
1311 mouse_state = omouse_state = 0;
1315 // Windows addendum to allow for kconfig input.
1320 DoMessageStuff(&msg);
1322 if (_RedrawScreen) {
1323 _RedrawScreen = FALSE;
1325 dd_gr_set_current_canvas(NULL);
1335 //see if redbook song needs to be restarted
1336 songs_check_redbook_repeat();
1340 #if defined(MACINTOSH) || defined(WINDOWS)
1341 omouse_state = mouse_state;
1342 mouse_state = mouse_button_state(0);
1345 if ( !time_stopped ) {
1347 if (multi_menu_poll() == -1)
1356 MAC(case KEY_COMMAND+KEY_SHIFTED+KEY_3:)
1357 case KEY_PRINT_SCREEN:
1358 save_screen_shot(0);
1360 case KEY_CTRLED+KEY_D:
1361 items[citem].value = 255;
1362 kc_drawitem( &items[citem], 1 );
1364 case KEY_CTRLED+KEY_R:
1365 if ( items==kc_keyboard ) {
1366 for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
1367 items[i].value=default_kconfig_settings[0][i];
1368 kc_drawitem( &items[i], 0 );
1371 } else if ( items==kc_d2x ) {
1372 for(i=0;i<NUM_D2X_CONTROLS;i++)
1374 items[i].value=default_kconfig_d2x_settings[i];
1375 kc_drawitem( &items[i], 0 );
1380 // hack for firebire and mousestick default controls since I made
1381 // them the same control type -- dumb dumb dumb
1382 if (joy_have_firebird())
1383 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1384 items[i].value = default_firebird_settings[i];
1385 kc_drawitem( &items[i], 0 );
1387 else if (joy_have_mousestick())
1388 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1389 items[i].value = default_mousestick_settings[i];
1390 kc_drawitem( &items[i], 0 );
1393 #endif // note link to above else
1394 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1395 items[i].value = default_kconfig_settings[Config_control_type][i];
1396 kc_drawitem( &items[i], 0 );
1399 kc_drawitem( &items[citem], 1 );
1402 items[citem].value=255;
1403 kc_drawitem( &items[citem], 1 );
1407 #ifdef TABLE_CREATION
1408 if (items[citem].u==-1) items[citem].u=find_next_item_up( items,nitems, citem);
1410 citem = items[citem].u;
1415 #ifdef TABLE_CREATION
1416 if (items[citem].d==-1) items[citem].d=find_next_item_down( items,nitems, citem);
1418 citem = items[citem].d;
1422 #ifdef TABLE_CREATION
1423 if (items[citem].l==-1) items[citem].l=find_next_item_left( items,nitems, citem);
1425 citem = items[citem].l;
1429 #ifdef TABLE_CREATION
1430 if (items[citem].r==-1) items[citem].r=find_next_item_right( items,nitems, citem);
1432 citem = items[citem].r;
1436 switch( items[citem].type ) {
1437 case BT_KEY: kc_change_key( &items[citem] ); break;
1438 case BT_MOUSE_BUTTON: kc_change_mousebutton( &items[citem] ); break;
1439 case BT_MOUSE_AXIS: kc_change_mouseaxis( &items[citem] ); break;
1440 case BT_JOY_BUTTON: kc_change_joybutton( &items[citem] ); break;
1441 case BT_JOY_AXIS: kc_change_joyaxis( &items[citem] ); break;
1442 case BT_INVERT: kc_change_invert( &items[citem] ); break;
1447 grd_curcanv->cv_font = save_font;
1449 WIN(DEFINE_SCREEN(old_bg_pcx));
1452 dd_gr_set_current_canvas(save_canvas),
1453 gr_set_current_canvas( save_canvas )
1455 keyd_repeat = old_keyd_repeat;
1456 game_flush_inputs();
1457 WIN( HideCursorW());
1458 MAC( hide_cursor(); )
1462 #ifdef TABLE_CREATION
1463 case KEY_DEBUGGED+KEY_F12: {
1465 for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
1466 kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i);
1467 kc_keyboard[i].d = find_next_item_down( kc_keyboard,NUM_KEY_CONTROLS, i);
1468 kc_keyboard[i].l = find_next_item_left( kc_keyboard,NUM_KEY_CONTROLS, i);
1469 kc_keyboard[i].r = find_next_item_right( kc_keyboard,NUM_KEY_CONTROLS, i);
1471 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1472 kc_joystick[i].u = find_next_item_up( kc_joystick,NUM_OTHER_CONTROLS, i);
1473 kc_joystick[i].d = find_next_item_down( kc_joystick,NUM_OTHER_CONTROLS, i);
1474 kc_joystick[i].l = find_next_item_left( kc_joystick,NUM_OTHER_CONTROLS, i);
1475 kc_joystick[i].r = find_next_item_right( kc_joystick,NUM_OTHER_CONTROLS, i);
1477 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1478 kc_mouse[i].u = find_next_item_up( kc_mouse,NUM_OTHER_CONTROLS, i);
1479 kc_mouse[i].d = find_next_item_down( kc_mouse,NUM_OTHER_CONTROLS, i);
1480 kc_mouse[i].l = find_next_item_left( kc_mouse,NUM_OTHER_CONTROLS, i);
1481 kc_mouse[i].r = find_next_item_right( kc_mouse,NUM_OTHER_CONTROLS, i);
1483 fp = fopen( "kconfig.cod", "wt" );
1485 fprintf( fp, "ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {\n" );
1486 for (i=0; i<CONTROL_MAX_TYPES; i++ ) {
1488 fprintf( fp, "{0x%x", kconfig_settings[i][0] );
1489 for (j=1; j<MAX_CONTROLS; j++ )
1490 fprintf( fp, ",0x%x", kconfig_settings[i][j] );
1491 fprintf( fp, "},\n" );
1493 fprintf( fp, "};\n" );
1495 fprintf( fp, "\nkc_item kc_keyboard[NUM_KEY_CONTROLS] = {\n" );
1496 for (i=0; i<NUM_KEY_CONTROLS; i++ ) {
1497 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1498 kc_keyboard[i].id, kc_keyboard[i].x, kc_keyboard[i].y, kc_keyboard[i].w1, kc_keyboard[i].w2,
1499 kc_keyboard[i].u, kc_keyboard[i].d, kc_keyboard[i].l, kc_keyboard[i].r,
1500 34, kc_keyboard[i].text, 34, btype_text[kc_keyboard[i].type] );
1502 fprintf( fp, "};" );
1504 fprintf( fp, "\nkc_item kc_joystick[NUM_OTHER_CONTROLS] = {\n" );
1505 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1506 if (kc_joystick[i].type == BT_JOY_BUTTON)
1507 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1508 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1509 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1510 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1512 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1513 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1514 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1515 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1517 fprintf( fp, "};" );
1519 fprintf( fp, "\nkc_item kc_mouse[NUM_OTHER_CONTROLS] = {\n" );
1520 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
1521 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n",
1522 kc_mouse[i].id, kc_mouse[i].x, kc_mouse[i].y, kc_mouse[i].w1, kc_mouse[i].w2,
1523 kc_mouse[i].u, kc_mouse[i].d, kc_mouse[i].l, kc_mouse[i].r,
1524 34, kc_mouse[i].text, 34, btype_text[kc_mouse[i].type] );
1526 fprintf( fp, "};" );
1535 #if defined (MACINTOSH) || defined(WINDOWS)
1536 if ( (mouse_state && !omouse_state) || (mouse_state && omouse_state) ) {
1539 mouse_get_pos(&mx, &my);
1540 for (i=0; i<nitems; i++ ) {
1541 item_height = get_item_height( &items[i] );
1542 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[i].x) + LHX(items[i].w1);
1543 x2 = x1 + LHX(items[i].w2);
1544 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[i].y);
1545 y2 = y1 + LHX(item_height);
1546 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1552 else if ( !mouse_state && omouse_state ) {
1555 mouse_get_pos(&mx, &my);
1556 item_height = get_item_height( &items[citem] );
1557 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[citem].x) + LHX(items[citem].w1);
1558 x2 = x1 + LHX(items[citem].w2);
1559 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[citem].y);
1560 y2 = y1 + LHY(item_height);
1561 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1564 switch( items[citem].type ) {
1565 case BT_KEY: kc_change_key( &items[citem] ); break;
1566 case BT_MOUSE_BUTTON: kc_change_mousebutton( &items[citem] ); break;
1567 case BT_MOUSE_AXIS: kc_change_mouseaxis( &items[citem] ); break;
1568 case BT_JOY_BUTTON: kc_change_joybutton( &items[citem] ); break;
1569 case BT_JOY_AXIS: kc_change_joyaxis( &items[citem] ); break;
1570 case BT_INVERT: kc_change_invert( &items[citem] ); break;
1575 x1 = grd_curcanv->cv_bitmap.bm_x + close_x + 2;
1576 x2 = x1 + close_size - 2;
1577 y1 = grd_curcanv->cv_bitmap.bm_y + close_y + 2;
1578 y2 = y1 + close_size - 2;
1579 if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
1580 grd_curcanv->cv_font = save_font;
1581 WINDOS(dd_gr_set_current_canvas( save_canvas ),
1582 gr_set_current_canvas( save_canvas ));
1583 keyd_repeat = old_keyd_repeat;
1584 game_flush_inputs();
1594 #endif // MACINTOSH WINDOWS
1596 if (ocitem!=citem) {
1599 kc_drawitem( &items[ocitem], 0 );
1600 kc_drawitem( &items[citem], 1 );
1608 void kc_drawitem( kc_item *item, int is_current )
1612 // PA_DFX (pa_set_frontbuffer_current());
1613 WIN(DDGRLOCK(dd_grd_curcanv));
1616 gr_set_fontcolor( BM_XRGB(20,20,29), -1 );
1618 gr_set_fontcolor( BM_XRGB(15,15,24), -1 );
1619 gr_string( LHX(item->x), LHY(item->y), item->text );
1620 WIN(DDGRUNLOCK(dd_grd_curcanv));
1622 if (item->value==255) {
1623 strcpy( btext, "" );
1625 switch( item->type ) {
1627 strncpy( btext, key_text[item->value], 10 ); break;
1628 case BT_MOUSE_BUTTON:
1630 //strncpy( btext, Text_string[mousebutton_text[item->value]], 10 ); break;
1631 strncpy( btext, (item->value <= 3)?Text_string[mousebutton_text[item->value]]:mousebutton_textra[item->value-3], 10 ); break;
1633 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1636 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1640 if (joybutton_text[item->value] != -1)
1641 strncpy( btext, Text_string[ joybutton_text[item->value] ], 10 );
1643 sprintf( btext, "BTN%2d", item->value+1 );
1645 if ( joybutton_text[item->value] !=-1 )
1646 strncpy( btext, Text_string[ joybutton_text[item->value] ], 10 );
1648 sprintf( btext, "BTN%d", item->value );
1651 strncpy( btext, joy_btn_name( item->value ), 10);
1653 sprintf( btext, "BTN%d", item->value );
1657 strncpy( btext, Text_string[joyaxis_text[item->value]], 10 ); break;
1659 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1663 WIN(DDGRLOCK(dd_grd_curcanv));
1664 gr_get_string_size(btext, &w, &h, &aw );
1667 gr_setcolor( BM_XRGB(21,0,24) );
1669 gr_setcolor( BM_XRGB(16,0,19) );
1670 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1672 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1674 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1676 gr_string( x, LHY(item->y), btext );
1677 // PA_DFX (pa_set_backbuffer_current());
1679 WIN(DDGRUNLOCK(dd_grd_curcanv));
1684 static int looper=0;
1686 void kc_drawquestion( kc_item *item )
1690 WIN(DDGRLOCK(dd_grd_curcanv));
1691 // PA_DFX (pa_set_frontbuffer_current());
1693 gr_get_string_size("?", &w, &h, &aw );
1695 c = BM_XRGB(21,0,24);
1697 //@@gr_setcolor( gr_fade_table[fades[looper]*256+c] );
1698 gr_setcolor(BM_XRGB(21*fades[looper]/31,0,24*fades[looper]/31));
1700 if (looper>63) looper=0;
1702 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1704 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1706 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1708 gr_string( x, LHY(item->y), "?" );
1709 // PA_DFX (pa_set_backbuffer_current());
1710 WIN(DDGRUNLOCK(dd_grd_curcanv));
1714 void kc_change_key( kc_item * item )
1719 WIN(DDGRLOCK(dd_grd_curcanv));
1720 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1722 gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_KEY );
1723 WIN(DDGRUNLOCK(dd_grd_curcanv));
1725 game_flush_inputs();
1729 while( (k!=KEY_ESC) && (keycode==255) )
1735 DoMessageStuff(&msg);
1742 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1745 // if ( Game_mode & GM_MULTI )
1746 // GameLoop( 0, 0 ); // Continue
1748 timer_delay(f0_1/10);
1749 kc_drawquestion( item );
1751 for (i=0; i<256; i++ ) {
1752 if (keyd_pressed[i] && (strlen(key_text[i])>0)) {
1754 for (n=0; n<sizeof(system_keys); n++ )
1755 if ( system_keys[n] == i )
1764 for (i=0; i<Num_items; i++ ) {
1765 n = item - All_items;
1766 if ( (i!=n) && (All_items[i].type==BT_KEY) && (All_items[i].value==keycode) ) {
1767 All_items[i].value = 255;
1768 kc_drawitem( &All_items[i], 0 );
1771 item->value = keycode;
1773 kc_drawitem( item, 1 );
1775 WIN(DDGRLOCK(dd_grd_curcanv));
1776 gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) );
1777 WIN(DDGRUNLOCK(dd_grd_curcanv));
1779 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1781 game_flush_inputs();
1785 void kc_change_joybutton( kc_item * item )
1790 WIN(DDGRLOCK(dd_grd_curcanv));
1791 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1793 gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_JBUTTON );
1794 WIN(DDGRUNLOCK(dd_grd_curcanv));
1796 game_flush_inputs();
1800 while( (k!=KEY_ESC) && (code==255))
1805 DoMessageStuff(&msg);
1811 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1814 // if ( Game_mode & GM_MULTI )
1815 // GameLoop( 0, 0 ); // Continue
1817 timer_delay(f0_1/10);
1819 if (k == KEY_PRINT_SCREEN)
1820 save_screen_shot(0);
1822 kc_drawquestion( item );
1824 WIN(code = joydefsw_do_button());
1827 code = joy_do_buttons();
1830 #if !defined(WINDOWS) && !defined(MACINTOSH)
1831 if (Config_control_type==CONTROL_THRUSTMASTER_FCS) {
1833 joystick_read_raw_axis( JOY_ALL_AXIS, axis );
1834 kconfig_read_fcs( axis[3] );
1835 if ( joy_get_button_state(7) ) code = 7;
1836 if ( joy_get_button_state(11) ) code = 11;
1837 if ( joy_get_button_state(15) ) code = 15;
1838 if ( joy_get_button_state(19) ) code = 19;
1839 for (i=0; i<4; i++ ) {
1840 if ( joy_get_button_state(i) )
1843 } else if (Config_control_type==CONTROL_FLIGHTSTICK_PRO) {
1844 for (i=4; i<20; i++ ) {
1845 if ( joy_get_button_state(i) ) {
1847 mprintf(( 0, "JB: %d\n", code ));
1851 for (i=0; i<MAX_BUTTONS; i++ ) {
1852 if ( joy_get_button_state(i) )
1859 for (i=0; i<Num_items; i++ ) {
1860 n = item - All_items;
1861 if ( (i!=n) && (All_items[i].type==BT_JOY_BUTTON) && (All_items[i].value==code) ) {
1862 All_items[i].value = 255;
1863 kc_drawitem( &All_items[i], 0 );
1868 kc_drawitem( item, 1 );
1869 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1870 game_flush_inputs();
1873 void kc_change_mousebutton( kc_item * item )
1878 WIN(DDGRLOCK(dd_grd_curcanv));
1879 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1881 gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_MBUTTON );
1882 WIN(DDGRUNLOCK(dd_grd_curcanv));
1885 game_flush_inputs();
1889 while( (k!=KEY_ESC) && (code==255))
1894 DoMessageStuff(&msg);
1900 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1903 // if ( Game_mode & GM_MULTI )
1904 // GameLoop( 0, 0 ); // Continue
1906 timer_delay(f0_1/10);
1908 if (k == KEY_PRINT_SCREEN)
1909 save_screen_shot(0);
1911 kc_drawquestion( item );
1913 b = mouse_get_btns();
1914 for (i = 0; i < 16; i++ ) {
1920 for (i=0; i<Num_items; i++ ) {
1921 n = item - All_items;
1922 if ( (i!=n) && (All_items[i].type==BT_MOUSE_BUTTON) && (All_items[i].value==code) ) {
1923 All_items[i].value = 255;
1924 kc_drawitem( &All_items[i], 0 );
1929 kc_drawitem( item, 1 );
1930 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1931 game_flush_inputs();
1935 void kc_change_joyaxis( kc_item * item )
1939 int old_axis[MAX_AXES];
1941 int axis[JOY_NUM_AXES];
1942 int old_axis[JOY_NUM_AXES];
1951 WIN(DDGRLOCK(dd_grd_curcanv));
1952 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1954 gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS );
1955 WIN(DDGRUNLOCK(dd_grd_curcanv));
1957 game_flush_inputs();
1962 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, old_axis ),
1963 joystick_read_raw_axis( JOY_ALL_AXIS, old_axis )
1966 while( (k!=KEY_ESC) && (code==255))
1971 DoMessageStuff(&msg);
1977 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1980 // if ( Game_mode & GM_MULTI )
1981 // GameLoop( 0, 0 ); // Continue
1983 timer_delay(f0_1/10);
1985 if (k == KEY_PRINT_SCREEN)
1986 save_screen_shot(0);
1988 kc_drawquestion( item );
1991 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, axis ),
1992 joystick_read_raw_axis( JOY_ALL_AXIS, axis )
1995 for (i=0; i<numaxis; i++ ) {
1996 #if defined (MACINTOSH)
1997 if ( abs(axis[i]-old_axis[i])>100 ) {
1998 #elif defined(WINDOWS)
1999 if ( abs(axis[i]-old_axis[i])>1024 ) {
2001 if ( abs(axis[i]-old_axis[i])>200 ) {
2004 con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i);
2006 //old_axis[i] = axis[i];
2008 for (i=0; i<Num_items; i++ )
2010 n = item - All_items;
2011 if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) )
2017 for (i=0; i<Num_items; i++ ) {
2018 n = item - All_items;
2019 if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) {
2020 All_items[i].value = 255;
2021 kc_drawitem( &All_items[i], 0 );
2027 kc_drawitem( item, 1 );
2028 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2029 game_flush_inputs();
2033 void kc_change_mouseaxis( kc_item * item )
2042 WIN(DDGRLOCK(dd_grd_curcanv));
2043 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
2045 gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS );
2046 WIN(DDGRUNLOCK(dd_grd_curcanv));
2048 game_flush_inputs();
2052 mouse_get_delta( &dx, &dy );
2054 while( (k!=KEY_ESC) && (code==255))
2059 DoMessageStuff(&msg);
2065 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
2068 // if ( Game_mode & GM_MULTI )
2069 // GameLoop( 0, 0 ); // Continue
2071 timer_delay(f0_1/10);
2073 if (k == KEY_PRINT_SCREEN)
2074 save_screen_shot(0);
2076 kc_drawquestion( item );
2079 mouse_get_delta_z( &dx, &dy, &dz );
2081 mouse_get_delta( &dx, &dy );
2083 if ( abs(dx)>20 ) code = 0;
2084 if ( abs(dy)>20 ) code = 1;
2086 if ( abs(dz)>20 ) code = 2;
2090 for (i=0; i<Num_items; i++ ) {
2091 n = item - All_items;
2092 if ( (i!=n) && (All_items[i].type==BT_MOUSE_AXIS) && (All_items[i].value==code) ) {
2093 All_items[i].value = 255;
2094 kc_drawitem( &All_items[i], 0 );
2099 kc_drawitem( item, 1 );
2100 nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
2101 game_flush_inputs();
2106 void kc_change_invert( kc_item * item )
2108 game_flush_inputs();
2115 kc_drawitem( item, 1 );
2119 #include "screens.h"
2121 void kconfig(int n, char * title)
2124 grs_bitmap *save_bm;
2126 set_screen_mode( SCREEN_MENU );
2131 WIN(mouse_set_mode(0));
2132 WIN(dd_gr_set_current_canvas(NULL));
2134 #if defined(POLY_ACC)
2135 save_bm = gr_create_bitmap2( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h, grd_curcanv->cv_bitmap.bm_type, NULL );
2137 save_bm = gr_create_bitmap( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
2139 Assert( save_bm != NULL );
2141 WIN(DDGRLOCK(dd_grd_curcanv));
2142 gr_bm_bitblt(grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_w,
2143 0, 0, 0, 0, &grd_curcanv->cv_bitmap, save_bm );
2144 WIN(DDGRUNLOCK(dd_grd_curcanv));
2147 case 0:kconfig_sub( kc_keyboard, NUM_KEY_CONTROLS, title );break;
2148 case 1:kconfig_sub( kc_joystick, NUM_OTHER_CONTROLS, title );break;
2149 case 2:kconfig_sub( kc_mouse, NUM_OTHER_CONTROLS, title ); break;
2150 case 3:kconfig_sub( kc_superjoy, NUM_OTHER_CONTROLS, title); break;
2152 //added on 2/4/99 by Victor Rachels for new keys menu
2153 case 4:kconfig_sub( kc_d2x, NUM_D2X_CONTROLS, title ); break;
2154 //end this section addition - VR
2162 WIN(mouse_set_mode(1));
2163 WIN(dd_gr_set_current_canvas(NULL));
2164 WIN(DDGRLOCK(dd_grd_curcanv));
2165 gr_bitmap(0, 0, save_bm);
2166 WIN(DDGRUNLOCK(dd_grd_curcanv));
2167 gr_free_bitmap(save_bm);
2169 reset_cockpit(); //force cockpit redraw next time
2171 // Update save values...
2173 for (i=0; i<NUM_KEY_CONTROLS; i++ )
2174 kconfig_settings[0][i] = kc_keyboard[i].value;
2176 if ( (Config_control_type>0) && (Config_control_type<5)) {
2177 for (i=0; i<NUM_OTHER_CONTROLS; i++ )
2178 kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
2179 } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
2180 for (i=0; i<NUM_OTHER_CONTROLS; i++ )
2181 kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
2183 else if (Config_control_type == CONTROL_WINJOYSTICK) {
2184 for (i=0; i<NUM_OTHER_CONTROLS; i++ )
2185 kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
2189 for (i=0; i<NUM_D2X_CONTROLS; i++)
2190 kconfig_d2x_settings[i] = kc_d2x[i].value;
2195 void kconfig_read_fcs( int raw_axis )
2197 int raw_button, button, axis_min[4], axis_center[4], axis_max[4];
2199 if (Config_control_type!=CONTROL_THRUSTMASTER_FCS) return;
2201 joy_get_cal_vals(axis_min, axis_center, axis_max);
2203 if ( axis_max[3] > 1 )
2204 raw_button = (raw_axis*100)/axis_max[3];
2208 if ( raw_button > 88 )
2210 else if ( raw_button > 63 )
2212 else if ( raw_button > 39 )
2214 else if ( raw_button > 15 )
2219 kconfig_set_fcs_button( 19, button );
2220 kconfig_set_fcs_button( 15, button );
2221 kconfig_set_fcs_button( 11, button );
2222 kconfig_set_fcs_button( 7, button );
2226 void kconfig_set_fcs_button( int btn, int button )
2228 int state,time_down,upcount,downcount;
2229 state = time_down = upcount = downcount = 0;
2231 if ( joy_get_button_state(btn) ) {
2232 if ( btn==button ) {
2234 time_down = FrameTime;
2239 if ( btn==button ) {
2241 time_down = FrameTime;
2248 joy_set_btn_values( btn, state, time_down, downcount, upcount );
2254 fix Last_angles_p = 0;
2255 fix Last_angles_b = 0;
2256 fix Last_angles_h = 0;
2257 ubyte Last_angles_read = 0;
2259 extern int VR_sensitivity;
2261 int VR_sense_range[3] = { 25, 50, 75 };
2263 #if 0 //ndef MACINTOSH
2268 fix yaw, pitch, roll;
2271 //------ read vfx1 helmet --------
2272 if (vfx1_installed) {
2273 vfx_get_data(&yaw,&pitch,&roll,&buttons);
2274 } else if (iglasses_headset_installed) {
2275 iglasses_read_headset( &yaw, &pitch, &roll );
2276 } else if (Victor_headset_installed) {
2277 victor_read_headset_filtered( &yaw, &pitch, &roll );
2282 Use_player_head_angles = 0;
2283 if ( Last_angles_read ) {
2287 if ( (Last_angles_h < (F1_0/4) ) && (yaw > ((F1_0*3)/4) ) )
2289 else if ( (yaw < (F1_0/4) ) && (Last_angles_h > ((F1_0*3)/4) ) )
2292 Controls.pitch_time += fixmul((pitch- Last_angles_p)*VR_sense_range[VR_sensitivity],FrameTime);
2293 Controls.heading_time+= fixmul((yaw1 - Last_angles_h)*VR_sense_range[VR_sensitivity],FrameTime);
2294 Controls.bank_time += fixmul((roll - Last_angles_b)*VR_sense_range[VR_sensitivity],FrameTime);
2296 Last_angles_read = 1;
2297 Last_angles_p = pitch;
2298 Last_angles_h = yaw;
2299 Last_angles_b = roll;
2307 #define JOYSTICK_READ_TIME (F1_0/40) // Read joystick at 40 Hz.
2309 #define JOYSTICK_READ_TIME (F1_0/10) // Read joystick at 10 Hz.
2312 fix LastReadTime = 0;
2316 ubyte kc_use_external_control = 0;
2317 ubyte kc_enable_external_control = 0;
2318 ubyte kc_external_intno = 0;
2319 ext_control_info *kc_external_control = NULL;
2320 ubyte *kc_external_name = NULL;
2321 ubyte kc_external_version = 0;
2322 extern int Automap_active;
2324 void kconfig_init_external_controls(int intno, int address)
2327 kc_external_intno = intno;
2328 kc_external_control = (ext_control_info *)address;
2329 kc_use_external_control = 1;
2330 kc_enable_external_control = 1;
2332 i = FindArg ( "-xname" );
2334 kc_external_name = Args[i+1];
2336 kc_external_name = "External Controller";
2338 for (i=0;i<strlen (kc_external_name);i++)
2339 if (kc_external_name[i]=='_')
2340 kc_external_name[i]=' ';
2342 i = FindArg ( "-xver" );
2344 kc_external_version = atoi(Args[i+1]);
2346 printf( "%s int: 0x%x, data: 0x%p, ver:%d\n", kc_external_name, kc_external_intno, kc_external_control, kc_external_version );
2350 #if !defined(MACINTOSH)
2351 /*void kconfig_read_external_controls()
2355 if ( !kc_enable_external_control && !CybermouseActive)
2358 if ( kc_external_version == 0 )
2359 memset( kc_external_control, 0, sizeof(control_info) );
2360 else if ( kc_external_version > 0 ) {
2361 memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 );
2362 if ( kc_external_version > 1 ) {
2363 // Write ship pos and angles to external controls...
2364 ubyte *temp_ptr = (ubyte *)kc_external_control;
2365 vms_vector *ship_pos;
2366 vms_matrix *ship_orient;
2367 memset( kc_external_control, 0, sizeof(control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
2368 temp_ptr += sizeof(control_info)+sizeof(vms_angvec) + 64;
2369 ship_pos = (vms_vector *)temp_ptr;
2370 temp_ptr += sizeof(vms_vector);
2371 ship_orient = (vms_matrix *)temp_ptr;
2372 // Fill in ship postion...
2373 *ship_pos = Objects[Players[Player_num].objnum].pos;
2374 // Fill in ship orientation...
2375 *ship_orient = Objects[Players[Player_num].objnum].orient;
2379 if ( Automap_active ) // (If in automap...)
2380 kc_external_control->automap_state = 1;
2381 memset(&r,0,sizeof(r));
2385 if (!CybermouseActive)
2386 int386 ( kc_external_intno, &r, &r); // Read external info...
2388 // ReadOWL (kc_external_control);
2392 if ( Player_num > -1 ) {
2393 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL); // Turn off roll when turning
2394 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING); // Turn off leveling to nearest side.
2395 Auto_leveling_on = 0;
2397 if ( kc_external_version > 0 ) {
2398 vms_matrix tempm, ViewMatrix;
2399 vms_angvec * Kconfig_abs_movement;
2402 Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
2404 if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h ) {
2405 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
2406 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
2407 Objects[Players[Player_num].objnum].orient = ViewMatrix;
2409 oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
2410 if (oem_message[0] != '\0' )
2411 HUD_init_message( oem_message );
2415 Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);
2416 Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
2417 Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
2418 Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
2419 Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
2420 Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
2421 Controls.rear_view_down_count += kc_external_control->rear_view_down_count;
2422 Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;
2423 Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
2424 Controls.fire_primary_state |= kc_external_control->fire_primary_state;
2425 Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
2426 Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
2427 Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
2428 Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;
2429 Controls.automap_down_count += kc_external_control->automap_down_count;
2430 Controls.automap_state |= kc_external_control->automap_state;
2435 void controls_read_all_win()
2438 int slide_on, bank_on;
2442 int raw_joy_axis[7];
2444 fix k0, k1, k2, k3, kp;
2445 fix k4, k5, k6, k7, kh;
2446 ubyte channel_masks;
2447 int use_mouse, use_joystick;
2450 if (Game_turbo_mode)
2454 fix temp = Controls.heading_time;
2455 fix temp1 = Controls.pitch_time;
2456 memset( &Controls, 0, sizeof(control_info) );
2457 Controls.heading_time = temp;
2458 Controls.pitch_time = temp1;
2463 ctime = timer_get_fixed_seconds();
2465 // DO JOYSTICK (X,Y,Z R,U,V)
2466 // ----------------------------------------------------------------------------
2467 if ( (LastReadTime + JOYSTICK_READ_TIME) > ctime ) {
2468 if ((ctime < 0) && (LastReadTime > 0))
2469 LastReadTime = ctime;
2471 } else if ((Config_control_type==CONTROL_WINJOYSTICK)) {
2472 LastReadTime = ctime;
2473 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, raw_joy_axis );
2475 for (i=0; i<7; i++ ) {
2476 if (channel_masks&(1<<i)) {
2477 int joy_null_value = 28;
2479 // DO POV if joystick has a hat.
2480 // --------------------------------------------------------------------
2482 joydefsw_do_winjoybutton(raw_joy_axis);
2486 // --------------------------------------------------------------------
2487 // mprintf((0, "(%d)=%d,", i, raw_joy_axis[i]));
2488 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
2489 // mprintf((0, "%d ",raw_joy_axis[i]));
2490 // if (i%2) mprintf((0,"\n"));
2493 if (kc_superjoy[23].value==i) // If this is the throttle
2494 joy_null_value = 32; // Then use a larger dead-zone
2496 if (raw_joy_axis[i] > (joy_null_value-2))
2497 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
2498 else if (raw_joy_axis[i] < -(joy_null_value+2))
2499 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
2501 raw_joy_axis[i] = 0;
2502 joy_axis[i] = (raw_joy_axis[i]*FrameTime)/128;
2511 for (i=0; i<6; i++ )
2517 // ----------------------------------------------------------------------------
2518 if (Config_control_type==5) {
2519 mouse_get_delta( &dx, &dy );
2520 mouse_axis[0] = (dx*FrameTime)/35;
2521 mouse_axis[1] = (dy*FrameTime)/25;
2522 mouse_buttons = mouse_get_btns();
2523 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
2532 //------------- Read slide_on -------------
2535 if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
2536 if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
2538 if ((use_joystick)&&(kc_superjoy[5].value<255)) slide_on |= joy_get_button_state( kc_superjoy[5].value );
2540 if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
2542 //------------- Read bank_on ---------------
2545 if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
2546 if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
2548 if ( (use_joystick)&&(kc_superjoy[10].value < 255 )) bank_on |= joy_get_button_state( kc_superjoy[10].value );
2550 if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
2552 //------------ Read pitch_time -----------
2554 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2556 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2; // Divide by two since we want pitch to go slower
2557 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
2558 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
2559 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
2562 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
2563 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
2564 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
2565 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
2568 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2569 kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
2570 kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
2574 Controls.pitch_time = 0;
2576 if (Controls.pitch_time < 0)
2577 Controls.pitch_time = 0;
2579 if (Controls.pitch_time > 0)
2580 Controls.pitch_time = 0;
2581 Controls.pitch_time += kp;
2584 if ( (use_joystick)&&(kc_superjoy[13].value < 255 )) {
2585 if ( !kc_superjoy[14].value ) // If not inverted...
2586 Controls.pitch_time -= (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2588 Controls.pitch_time += (joy_axis[kc_superjoy[13].value]*Config_joystick_sensitivity)/8;
2592 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
2593 if ( (use_mouse)&&(kc_mouse[13].value < 255) ) {
2594 if ( !kc_mouse[14].value ) // If not inverted...
2595 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2597 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
2600 Controls.pitch_time = 0;
2604 //----------- Read vertical_thrust_time -----------------
2607 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
2608 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
2609 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
2610 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
2613 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
2614 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
2615 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
2616 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
2619 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2620 Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
2621 Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
2625 if ((use_joystick)&&( kc_superjoy[13].value < 255 )) {
2626 if ( !kc_superjoy[14].value ) // If not inverted...
2627 Controls.vertical_thrust_time += joy_axis[kc_superjoy[13].value];
2629 Controls.vertical_thrust_time -= joy_axis[kc_superjoy[13].value];
2633 if ( (use_mouse)&&(kc_mouse[13].value < 255 )) {
2634 if ( !kc_mouse[14].value ) // If not inverted...
2635 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
2637 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
2642 if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
2643 if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
2644 if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
2645 if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
2648 if ((use_joystick)&&( kc_superjoy[19].value < 255 )) {
2649 if ( !kc_superjoy[20].value ) // If not inverted...
2650 Controls.vertical_thrust_time += joy_axis[kc_superjoy[19].value];
2652 Controls.vertical_thrust_time -= joy_axis[kc_superjoy[19].value];
2655 // From joystick buttons
2656 if ( (use_joystick)&&(kc_superjoy[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_superjoy[8].value );
2657 if ( (use_joystick)&&(kc_superjoy[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_superjoy[9].value );
2659 // From mouse buttons
2660 if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
2661 if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
2664 if ( (use_mouse)&&(kc_mouse[19].value < 255 )) {
2665 if ( !kc_mouse[20].value ) // If not inverted...
2666 Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
2668 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
2672 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2673 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
2674 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
2677 //---------- Read heading_time -----------
2679 if (!slide_on && !bank_on) {
2680 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
2682 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
2683 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
2684 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
2685 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
2688 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
2689 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
2690 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
2691 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
2694 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2695 kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
2696 kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
2700 Controls.heading_time = 0;
2702 if (Controls.heading_time < 0)
2703 Controls.heading_time = 0;
2705 if (Controls.heading_time > 0)
2706 Controls.heading_time = 0;
2707 Controls.heading_time += kh;
2710 if ( (use_joystick)&&(kc_superjoy[15].value < 255 )) {
2711 if ( !kc_superjoy[16].value ) // If not inverted...
2712 Controls.heading_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2714 Controls.heading_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2718 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
2719 if ( !kc_mouse[16].value ) // If not inverted...
2720 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2722 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2725 Controls.heading_time = 0;
2728 //----------- Read sideways_thrust_time -----------------
2731 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2732 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2733 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2734 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2737 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
2738 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
2739 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
2740 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
2743 if ( (use_joystick)&&(kc_superjoy[15].value < 255 )) {
2744 if ( !kc_superjoy[16].value ) // If not inverted...
2745 Controls.sideways_thrust_time += joy_axis[kc_superjoy[15].value];
2747 Controls.sideways_thrust_time -= joy_axis[kc_superjoy[15].value];
2751 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2752 Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
2753 Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
2757 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
2758 if ( !kc_mouse[16].value ) // If not inverted...
2759 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
2761 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
2766 if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
2767 if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
2768 if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
2769 if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
2772 if ( (use_joystick)&&(kc_superjoy[17].value < 255 )) {
2773 if ( !kc_superjoy[18].value ) // If not inverted...
2774 Controls.sideways_thrust_time -= joy_axis[kc_superjoy[17].value];
2776 Controls.sideways_thrust_time += joy_axis[kc_superjoy[17].value];
2779 // From joystick buttons
2780 if ( (use_joystick)&&(kc_superjoy[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_superjoy[6].value );
2781 if ( (use_joystick)&&(kc_superjoy[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_superjoy[7].value );
2783 // From mouse buttons
2784 if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
2785 if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
2788 if ( (use_mouse)&&(kc_mouse[17].value < 255 )) {
2789 if ( !kc_mouse[18].value ) // If not inverted...
2790 Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
2792 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
2795 //----------- Read bank_time -----------------
2798 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
2799 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
2800 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
2801 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
2804 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
2805 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
2806 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
2807 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
2810 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2811 Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
2812 Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
2816 if ( (use_joystick)&&(kc_superjoy[15].value < 255) ) {
2817 if ( !kc_superjoy[16].value ) // If not inverted...
2818 Controls.bank_time -= (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2820 Controls.bank_time += (joy_axis[kc_superjoy[15].value]*Config_joystick_sensitivity)/8;
2824 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
2825 if ( !kc_mouse[16].value ) // If not inverted...
2826 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2828 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
2833 if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
2834 if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
2835 if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
2836 if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
2839 if ( (use_joystick)&&(kc_superjoy[21].value < 255) ) {
2840 if ( !kc_superjoy[22].value ) // If not inverted...
2841 Controls.bank_time -= joy_axis[kc_superjoy[21].value];
2843 Controls.bank_time += joy_axis[kc_superjoy[21].value];
2846 // From joystick buttons
2847 if ( (use_joystick)&&(kc_superjoy[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_superjoy[11].value );
2848 if ( (use_joystick)&&(kc_superjoy[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_superjoy[12].value );
2850 // From mouse buttons
2851 if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
2852 if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
2855 if ( (use_mouse)&&(kc_mouse[21].value < 255 )) {
2856 if ( !kc_mouse[22].value ) // If not inverted...
2857 Controls.bank_time += mouse_axis[kc_mouse[21].value];
2859 Controls.bank_time -= mouse_axis[kc_mouse[21].value];
2863 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
2864 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
2865 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
2868 //----------- Read forward_thrust_time -------------
2871 if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
2872 if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
2873 if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
2874 if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
2877 if ( (use_joystick)&&(kc_superjoy[23].value < 255 )) {
2878 if ( !kc_superjoy[24].value ) // If not inverted...
2879 Controls.forward_thrust_time -= joy_axis[kc_superjoy[23].value];
2881 Controls.forward_thrust_time += joy_axis[kc_superjoy[23].value];
2884 // From joystick buttons
2885 if ( (use_joystick)&&(kc_superjoy[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_superjoy[2].value );
2886 if ( (use_joystick)&&(kc_superjoy[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_superjoy[3].value );
2889 if ( (use_mouse)&&(kc_mouse[23].value < 255 )) {
2890 if ( !kc_mouse[24].value ) // If not inverted...
2891 Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
2893 Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
2896 // From mouse buttons
2897 if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
2898 if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
2900 //----------- Read afterburner_state -------------
2903 if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
2904 if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
2906 if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
2908 if ( (use_joystick)&&(kc_superjoy[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_superjoy[27].value);
2910 //-------Read headlight key--------------------------
2911 if (kc_keyboard[52].value < 255 )
2912 Controls.headlight_count=key_down_count(kc_keyboard[52].value);
2913 if (kc_keyboard[53].value < 255 )
2914 Controls.headlight_count=key_down_count(kc_keyboard[53].value);
2915 if ((use_joystick)&&(kc_superjoy[30].value < 255 ))
2916 Controls.headlight_count=joy_get_button_down_cnt(kc_superjoy[30].value);
2918 //--------Read Cycle Primary Key------------------
2920 if (kc_keyboard[48].value<255)
2921 Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
2922 if (kc_keyboard[49].value<255)
2923 Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
2924 if ((use_joystick)&&(kc_superjoy[28].value < 255 ))
2925 Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_superjoy[28].value);
2927 //--------Read Cycle Secondary Key------------------
2929 if (kc_keyboard[50].value<255)
2930 Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
2931 if (kc_keyboard[51].value<255)
2932 Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
2933 if ((use_joystick)&&(kc_superjoy[29].value < 255 ))
2934 Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_superjoy[29].value);
2936 //--------Read Toggle Bomb key----------------------
2938 if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
2940 int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
2942 if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
2943 !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
2945 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2946 HUD_init_message ("No bombs available!");
2950 if (Players[Player_num].secondary_ammo[bomb]==0)
2952 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
2953 HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
2957 Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
2958 digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
2963 //---------Read Energy->Shield key----------
2965 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
2966 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
2967 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
2968 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
2970 //----------- Read fire_primary_down_count
2971 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
2972 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
2973 if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_superjoy[0].value);
2974 if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
2976 //----------- Read fire_primary_state
2977 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
2978 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
2979 if ((use_joystick)&&(kc_superjoy[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_superjoy[0].value);
2980 if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
2982 //----------- Read fire_secondary_down_count
2983 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
2984 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
2985 if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_superjoy[1].value);
2986 if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
2988 //----------- Read fire_secondary_state
2989 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
2990 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
2991 if ((use_joystick)&&(kc_superjoy[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_superjoy[1].value);
2992 if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
2994 //----------- Read fire_flare_down_count
2995 if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
2996 if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
2997 if ((use_joystick)&&(kc_superjoy[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_superjoy[4].value);
2998 if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
3000 //----------- Read drop_bomb_down_count
3001 if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
3002 if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
3003 if ((use_joystick)&&(kc_superjoy[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_superjoy[26].value);
3004 if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
3006 //----------- Read rear_view_down_count
3007 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
3008 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
3009 if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_superjoy[25].value);
3010 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
3012 //----------- Read rear_view_down_state
3013 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3014 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3015 if ((use_joystick)&&(kc_superjoy[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_superjoy[25].value);
3016 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3018 //----------- Read automap_down_count
3019 if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3020 if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3022 //----------- Read automap_state
3023 if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3024 if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3026 //----------- Read stupid-cruise-control-type of throttle.
3028 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3029 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3030 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3031 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3032 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3034 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3037 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3038 if (Cruise_speed < 0 ) Cruise_speed = 0;
3040 if (Controls.forward_thrust_time==0)
3041 Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3044 //read_head_tracker();
3046 // Read external controls
3047 if (kc_use_external_control || CybermouseActive)
3048 kconfig_read_external_controls();
3050 //----------- Clamp values between -FrameTime and FrameTime
3051 if (FrameTime > F1_0 )
3052 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3054 if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3055 if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3056 if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3057 if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3058 if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3059 if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3060 // if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3062 if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3063 if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3064 if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3065 if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3066 if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3067 if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3068 // if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3071 //--------- Don't do anything if in debug mode
3073 if ( keyd_pressed[KEY_DELETE] ) {
3074 memset( &Controls, 0, sizeof(control_info) );
3081 fix Next_toggle_time[3]={0,0,0};
3083 int allowed_to_toggle(int i)
3085 //used for keeping tabs of when its ok to toggle headlight,primary,and secondary
3087 if (Next_toggle_time[i] > GameTime)
3088 if (Next_toggle_time[i] < GameTime + (F1_0/8)) // In case time is bogus, never wait > 1 second.
3091 Next_toggle_time[i] = GameTime + (F1_0/8);
3098 //added on 2/7/99 by Victor Rachels for jostick state setting
3099 int d2x_joystick_ostate[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
3100 //end this section adition - VR
3104 void controls_read_all()
3107 int slide_on, bank_on;
3114 fix mouse_axis[3] = {0,0,0};
3116 int raw_joy_axis[MAX_AXES];
3118 int raw_joy_axis[JOY_NUM_AXES];
3121 fix k0, k1, k2, k3, kp;
3122 fix k4, k5, k6, k7, kh;
3123 ubyte channel_masks;
3124 int use_mouse, use_joystick;
3130 if (Game_turbo_mode)
3134 fix temp = Controls.heading_time;
3135 fix temp1 = Controls.pitch_time;
3136 memset( &Controls, 0, sizeof(control_info) );
3137 Controls.heading_time = temp;
3138 Controls.pitch_time = temp1;
3143 ctime = timer_get_fixed_seconds();
3145 //--------- Read Joystick -----------
3147 if ( (LastReadTime + JOYSTICK_READ_TIME > ctime) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) ) {
3148 if ((ctime < 0) && (LastReadTime > 0))
3149 LastReadTime = ctime;
3151 } else if ((Config_control_type>0) && (Config_control_type<5) ) {
3152 LastReadTime = ctime;
3153 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3155 for (i=0; i<6; i++ ) {
3157 if (channel_masks&(1<<i)) {
3159 int joy_null_value = 10;
3161 if ( (i==3) && (Config_control_type==CONTROL_THRUSTMASTER_FCS) ) {
3162 kconfig_read_fcs( raw_joy_axis[i] );
3164 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3166 if (kc_joystick[23].value==i) // If this is the throttle
3167 joy_null_value = 20; // Then use a larger dead-zone
3169 if (raw_joy_axis[i] > joy_null_value)
3170 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3171 else if (raw_joy_axis[i] < -joy_null_value)
3172 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3174 raw_joy_axis[i] = 0;
3175 joy_axis[i] = (raw_joy_axis[i]*FrameTime)/128;
3185 for (i=0; i<4; i++ )
3190 //--------- Read Joystick -----------
3191 if ((Config_control_type>0) && (Config_control_type<5) ) {
3192 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
3193 for (i=0; i<4; i++ ) {
3194 if (channel_masks&(1<<i)) {
3195 int joy_null_value = 10;
3197 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
3199 if (kc_joystick[23].value==i) // If this is the throttle
3200 joy_null_value = 20; // Then use a larger dead-zone
3202 if (raw_joy_axis[i] > joy_null_value)
3203 raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3204 else if (raw_joy_axis[i] < -joy_null_value)
3205 raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3207 raw_joy_axis[i] = 0;
3208 joy_axis[i] = (raw_joy_axis[i]*FrameTime)/128;
3215 for (i=0; i<4; i++ )
3219 #endif // ifndef MACINTOSH
3221 if (Config_control_type==5 && !CybermouseActive) {
3222 //--------- Read Mouse -----------
3224 mouse_get_delta_z( &dx, &dy, &dz );
3226 mouse_get_delta( &dx, &dy );
3228 mouse_axis[0] = (dx*FrameTime)/35;
3229 mouse_axis[1] = (dy*FrameTime)/25;
3231 mouse_axis[2] = (dz*FrameTime);
3233 mouse_buttons = mouse_get_btns();
3234 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
3236 } else if (Config_control_type==6 && !CybermouseActive) {
3237 //--------- Read Cyberman -----------
3238 mouse_get_cyberman_pos(&idx,&idy );
3239 mouse_axis[0] = (idx*FrameTime)/128;
3240 mouse_axis[1] = (idy*FrameTime)/128;
3241 mouse_buttons = mouse_get_btns();
3243 } else if (CybermouseActive) {
3244 // ReadOWL (kc_external_control);
3245 // CybermouseAdjust();
3254 //added on 2/4/99 by Victor Rachels for d1x keys
3255 //--------- Read primary weapon select -------------
3256 //the following "if" added by WraithX to stop deadies from switchin weapons, 4/14/00
3257 if (!Player_is_dead)
3260 int d2x_joystick_state[10];
3263 d2x_joystick_state[i] = joy_get_button_state(kc_d2x[i*2+1].value);
3266 //----------------Weapon 1----------------
3267 if(key_down_count(kc_d2x[0].value) ||
3268 (joy_get_button_state(kc_d2x[1].value) &&
3269 (d2x_joystick_state[0]!=d2x_joystick_ostate[0]) ) )
3272 do_weapon_select(0,0);
3274 for(i=MAX_PRIMARY_WEAPONS;i<MAX_PRIMARY_WEAPONS+NEWPRIMS;i++)
3275 if(primary_order[i]>primary_order[valu]&&player_has_weapon(i,0))
3277 LaserPowSelected = valu;
3280 //----------------Weapon 2----------------
3281 if(key_down_count(kc_d2x[2].value) ||
3282 (joy_get_button_state(kc_d2x[3].value) &&
3283 (d2x_joystick_state[1]!=d2x_joystick_ostate[1]) ) )
3284 do_weapon_select(1,0);
3285 //----------------Weapon 3----------------
3286 if(key_down_count(kc_d2x[4].value) ||
3287 (joy_get_button_state(kc_d2x[5].value) &&
3288 (d2x_joystick_state[2]!=d2x_joystick_ostate[2]) ) )
3289 do_weapon_select(2,0);
3290 //----------------Weapon 4----------------
3291 if(key_down_count(kc_d2x[6].value) ||
3292 (joy_get_button_state(kc_d2x[7].value) &&
3293 (d2x_joystick_state[3]!=d2x_joystick_ostate[3]) ) )
3294 do_weapon_select(3,0);
3295 //----------------Weapon 5----------------
3296 if(key_down_count(kc_d2x[8].value) ||
3297 (joy_get_button_state(kc_d2x[9].value) &&
3298 (d2x_joystick_state[4]!=d2x_joystick_ostate[4]) ) )
3299 do_weapon_select(4,0);
3301 //--------- Read secondary weapon select ----------
3302 //----------------Weapon 6----------------
3303 if(key_down_count(kc_d2x[10].value) ||
3304 (joy_get_button_state(kc_d2x[11].value) &&
3305 (d2x_joystick_state[5]!=d2x_joystick_ostate[5]) ) )
3306 do_weapon_select(0,1);
3307 //----------------Weapon 7----------------
3308 if(key_down_count(kc_d2x[12].value) ||
3309 (joy_get_button_state(kc_d2x[13].value) &&
3310 (d2x_joystick_state[6]!=d2x_joystick_ostate[6]) ) )
3311 do_weapon_select(1,1);
3312 //----------------Weapon 8----------------
3313 if(key_down_count(kc_d2x[14].value) ||
3314 (joy_get_button_state(kc_d2x[15].value) &&
3315 (d2x_joystick_state[7]!=d2x_joystick_ostate[7]) ) )
3316 do_weapon_select(2,1);
3317 //----------------Weapon 9----------------
3318 if(key_down_count(kc_d2x[16].value) ||
3319 (joy_get_button_state(kc_d2x[17].value) &&
3320 (d2x_joystick_state[8]!=d2x_joystick_ostate[8]) ) )
3321 do_weapon_select(3,1);
3322 //----------------Weapon 0----------------
3323 if(key_down_count(kc_d2x[18].value) ||
3324 (joy_get_button_state(kc_d2x[19].value) &&
3325 (d2x_joystick_state[9]!=d2x_joystick_ostate[9]) ) )
3326 do_weapon_select(4,1);
3327 memcpy(d2x_joystick_ostate,d2x_joystick_state,10*sizeof(int));
3329 //end this section addition - VR
3332 }//end "if (!Player_is_dead)" - WraithX
3336 //------------- Read slide_on -------------
3339 if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
3340 if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
3342 if ((use_joystick)&&(kc_joystick[5].value<255)) slide_on |= joy_get_button_state( kc_joystick[5].value );
3344 if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
3346 //------------- Read bank_on ---------------
3349 if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
3350 if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
3352 if ( (use_joystick)&&(kc_joystick[10].value < 255 )) bank_on |= joy_get_button_state( kc_joystick[10].value );
3354 if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
3356 //------------ Read pitch_time -----------
3358 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3360 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2; // Divide by two since we want pitch to go slower
3361 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
3362 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
3363 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
3366 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
3367 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
3368 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
3369 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
3372 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3373 kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
3374 kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
3378 Controls.pitch_time = 0;
3380 if (Controls.pitch_time < 0)
3381 Controls.pitch_time = 0;
3383 if (Controls.pitch_time > 0)
3384 Controls.pitch_time = 0;
3385 Controls.pitch_time += kp;
3388 if ( (use_joystick)&&(kc_joystick[13].value < 255 )) {
3389 if ( !kc_joystick[14].value ) // If not inverted...
3390 Controls.pitch_time -= (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3392 Controls.pitch_time += (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3396 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
3397 if ( (use_mouse)&&(kc_mouse[13].value < 255) ) {
3398 if ( !kc_mouse[14].value ) // If not inverted...
3399 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3401 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3404 Controls.pitch_time = 0;
3408 //----------- Read vertical_thrust_time -----------------
3411 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
3412 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
3413 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
3414 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
3417 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
3418 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
3419 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
3420 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
3423 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3424 Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
3425 Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
3429 if ((use_joystick)&&( kc_joystick[13].value < 255 )) {
3430 if ( !kc_joystick[14].value ) // If not inverted...
3431 Controls.vertical_thrust_time += joy_axis[kc_joystick[13].value];
3433 Controls.vertical_thrust_time -= joy_axis[kc_joystick[13].value];
3437 if ( (use_mouse)&&(kc_mouse[13].value < 255 )) {
3438 if ( !kc_mouse[14].value ) // If not inverted...
3439 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
3441 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
3446 if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
3447 if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
3448 if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
3449 if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
3452 if ((use_joystick)&&( kc_joystick[19].value < 255 )) {
3453 if ( !kc_joystick[20].value ) // If not inverted...
3454 Controls.vertical_thrust_time += joy_axis[kc_joystick[19].value];
3456 Controls.vertical_thrust_time -= joy_axis[kc_joystick[19].value];
3459 // From joystick buttons
3460 if ( (use_joystick)&&(kc_joystick[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_joystick[8].value );
3461 if ( (use_joystick)&&(kc_joystick[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_joystick[9].value );
3463 // From mouse buttons
3464 if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
3465 if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
3468 if ( (use_mouse)&&(kc_mouse[19].value < 255 )) {
3469 if ( !kc_mouse[20].value ) // If not inverted...
3470 Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
3472 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
3476 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3477 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
3478 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
3481 //---------- Read heading_time -----------
3483 if (!slide_on && !bank_on) {
3484 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3486 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
3487 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
3488 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
3489 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
3492 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
3493 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
3494 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
3495 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
3498 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3499 kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
3500 kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
3504 Controls.heading_time = 0;
3506 if (Controls.heading_time < 0)
3507 Controls.heading_time = 0;
3509 if (Controls.heading_time > 0)
3510 Controls.heading_time = 0;
3511 Controls.heading_time += kh;
3514 if ( (use_joystick)&&(kc_joystick[15].value < 255 )) {
3515 if ( !kc_joystick[16].value ) // If not inverted...
3516 Controls.heading_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3518 Controls.heading_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3522 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
3523 if ( !kc_mouse[16].value ) // If not inverted...
3524 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3526 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3529 Controls.heading_time = 0;
3532 //----------- Read sideways_thrust_time -----------------
3535 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3536 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3537 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3538 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3541 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
3542 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
3543 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
3544 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
3547 if ( (use_joystick)&&(kc_joystick[15].value < 255 )) {
3548 if ( !kc_joystick[16].value ) // If not inverted...
3549 Controls.sideways_thrust_time += joy_axis[kc_joystick[15].value];
3551 Controls.sideways_thrust_time -= joy_axis[kc_joystick[15].value];
3555 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3556 Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
3557 Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
3561 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
3562 if ( !kc_mouse[16].value ) // If not inverted...
3563 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
3565 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
3570 if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
3571 if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
3572 if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
3573 if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
3576 if ( (use_joystick)&&(kc_joystick[17].value < 255 )) {
3577 if ( !kc_joystick[18].value ) // If not inverted...
3578 Controls.sideways_thrust_time -= joy_axis[kc_joystick[17].value];
3580 Controls.sideways_thrust_time += joy_axis[kc_joystick[17].value];
3583 // From joystick buttons
3584 if ( (use_joystick)&&(kc_joystick[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_joystick[6].value );
3585 if ( (use_joystick)&&(kc_joystick[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_joystick[7].value );
3587 // From mouse buttons
3588 if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
3589 if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
3592 if ( (use_mouse)&&(kc_mouse[17].value < 255 )) {
3593 if ( !kc_mouse[18].value ) // If not inverted...
3594 Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
3596 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
3599 //----------- Read bank_time -----------------
3602 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3603 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3604 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3605 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3608 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
3609 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
3610 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
3611 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
3614 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3615 Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
3616 Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
3620 if ( (use_joystick)&&(kc_joystick[15].value < 255) ) {
3621 if ( !kc_joystick[16].value ) // If not inverted...
3622 Controls.bank_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3624 Controls.bank_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3628 if ( (use_mouse)&&(kc_mouse[15].value < 255 )) {
3629 if ( !kc_mouse[16].value ) // If not inverted...
3630 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3632 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3637 if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
3638 if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
3639 if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
3640 if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
3643 if ( (use_joystick)&&(kc_joystick[21].value < 255) ) {
3644 if ( !kc_joystick[22].value ) // If not inverted...
3645 Controls.bank_time -= joy_axis[kc_joystick[21].value];
3647 Controls.bank_time += joy_axis[kc_joystick[21].value];
3650 // From joystick buttons
3651 if ( (use_joystick)&&(kc_joystick[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_joystick[11].value );
3652 if ( (use_joystick)&&(kc_joystick[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_joystick[12].value );
3654 // From mouse buttons
3655 if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
3656 if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
3659 if ( (use_mouse)&&(kc_mouse[21].value < 255 )) {
3660 if ( !kc_mouse[22].value ) // If not inverted...
3661 Controls.bank_time += mouse_axis[kc_mouse[21].value];
3663 Controls.bank_time -= mouse_axis[kc_mouse[21].value];
3667 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN)) {
3668 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
3669 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
3672 //----------- Read forward_thrust_time -------------
3675 if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
3676 if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
3677 if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
3678 if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
3681 if ( (use_joystick)&&(kc_joystick[23].value < 255 )) {
3682 if ( !kc_joystick[24].value ) // If not inverted...
3683 Controls.forward_thrust_time -= joy_axis[kc_joystick[23].value];
3685 Controls.forward_thrust_time += joy_axis[kc_joystick[23].value];
3688 // From joystick buttons
3689 if ( (use_joystick)&&(kc_joystick[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_joystick[2].value );
3690 if ( (use_joystick)&&(kc_joystick[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_joystick[3].value );
3693 if ( (use_mouse)&&(kc_mouse[23].value < 255 )) {
3694 if ( !kc_mouse[24].value ) // If not inverted...
3695 Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
3697 Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
3700 // From mouse buttons
3701 if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
3702 if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
3704 //----------- Read afterburner_state -------------
3707 if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
3708 if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
3710 if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
3712 if ( (use_joystick)&&(kc_joystick[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_joystick[27].value);
3714 //-------Read headlight key--------------------------
3716 if (kc_keyboard[52].value < 255 )
3717 Controls.headlight_count=key_down_count(kc_keyboard[52].value);
3718 if (kc_keyboard[53].value < 255 )
3719 Controls.headlight_count+=key_down_count(kc_keyboard[53].value);
3720 if ((use_joystick)&&(kc_joystick[30].value < 255 ))
3721 Controls.headlight_count+=joy_get_button_down_cnt(kc_joystick[30].value);
3723 //--------Read Cycle Primary Key------------------
3725 if (kc_keyboard[48].value<255)
3726 Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
3727 if (kc_keyboard[49].value<255)
3728 Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
3729 if ((use_joystick)&&(kc_joystick[28].value < 255 ))
3730 Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_joystick[28].value);
3733 //--------Read Cycle Secondary Key------------------
3735 if (kc_keyboard[50].value<255)
3736 Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
3737 if (kc_keyboard[51].value<255)
3738 Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
3739 if ((use_joystick)&&(kc_joystick[29].value < 255 ))
3740 Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_joystick[29].value);
3742 //--------Read Toggle Bomb key----------------------
3744 if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
3746 int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
3748 if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
3749 !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
3751 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3752 HUD_init_message ("No bombs available!");
3756 if (Players[Player_num].secondary_ammo[bomb]==0)
3758 digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3759 HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
3763 Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
3764 digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
3769 //---------Read Energy->Shield key----------
3771 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
3772 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
3773 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
3774 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
3776 //----------- Read fire_primary_down_count
3777 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
3778 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
3779 if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_joystick[0].value);
3780 if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
3782 //----------- Read fire_primary_state
3783 if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
3784 if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
3785 if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_joystick[0].value);
3786 if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
3788 //----------- Read fire_secondary_down_count
3789 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
3790 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
3791 if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_joystick[1].value);
3792 if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
3794 //----------- Read fire_secondary_state
3795 if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
3796 if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
3797 if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_joystick[1].value);
3798 if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
3800 //----------- Read fire_flare_down_count
3801 if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
3802 if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
3803 if ((use_joystick)&&(kc_joystick[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_joystick[4].value);
3804 if ((use_mouse)&&(kc_mouse[4].value < 255 )) Controls.fire_flare_down_count += mouse_button_down_count(kc_mouse[4].value);
3806 //----------- Read drop_bomb_down_count
3807 if (kc_keyboard[34].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[34].value);
3808 if (kc_keyboard[35].value < 255 ) Controls.drop_bomb_down_count += key_down_count(kc_keyboard[35].value);
3809 if ((use_joystick)&&(kc_joystick[26].value < 255 )) Controls.drop_bomb_down_count += joy_get_button_down_cnt(kc_joystick[26].value);
3810 if ((use_mouse)&&(kc_mouse[26].value < 255 )) Controls.drop_bomb_down_count += mouse_button_down_count(kc_mouse[26].value);
3812 //----------- Read rear_view_down_count
3813 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[36].value);
3814 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_count += key_down_count(kc_keyboard[37].value);
3815 if ((use_joystick)&&(kc_joystick[25].value < 255 )) Controls.rear_view_down_count += joy_get_button_down_cnt(kc_joystick[25].value);
3816 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_count += mouse_button_down_count(kc_mouse[25].value);
3818 //----------- Read rear_view_down_state
3819 if (kc_keyboard[36].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[36].value];
3820 if (kc_keyboard[37].value < 255 ) Controls.rear_view_down_state |= keyd_pressed[kc_keyboard[37].value];
3821 if ((use_joystick)&&(kc_joystick[25].value < 255 )) Controls.rear_view_down_state |= joy_get_button_state(kc_joystick[25].value);
3822 if ((use_mouse)&&(kc_mouse[25].value < 255 )) Controls.rear_view_down_state |= mouse_button_state(kc_mouse[25].value);
3824 //----------- Read automap_down_count
3825 if (kc_keyboard[44].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[44].value);
3826 if (kc_keyboard[45].value < 255 ) Controls.automap_down_count += key_down_count(kc_keyboard[45].value);
3828 //----------- Read automap_state
3829 if (kc_keyboard[44].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[44].value];
3830 if (kc_keyboard[45].value < 255 ) Controls.automap_state |= keyd_pressed[kc_keyboard[45].value];
3832 //----------- Read stupid-cruise-control-type of throttle.
3834 if ( kc_keyboard[38].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[38].value)*5,FrameTime);
3835 if ( kc_keyboard[39].value < 255 ) Cruise_speed += fixdiv(speed_factor*key_down_time(kc_keyboard[39].value)*5,FrameTime);
3836 if ( kc_keyboard[40].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[40].value)*5,FrameTime);
3837 if ( kc_keyboard[41].value < 255 ) Cruise_speed -= fixdiv(speed_factor*key_down_time(kc_keyboard[41].value)*5,FrameTime);
3838 if ( (kc_keyboard[42].value < 255) && (key_down_count(kc_keyboard[42].value)) )
3840 if ( (kc_keyboard[43].value < 255) && (key_down_count(kc_keyboard[43].value)) )
3843 if (Cruise_speed > i2f(100) ) Cruise_speed = i2f(100);
3844 if (Cruise_speed < 0 ) Cruise_speed = 0;
3846 if (Controls.forward_thrust_time==0)
3847 Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime)/100;
3850 #if !defined(MACINTOSH)
3851 //read_head_tracker();
3853 // Read external controls
3854 // if (kc_use_external_control || CybermouseActive)
3855 // kconfig_read_external_controls();
3858 //----------- Clamp values between -FrameTime and FrameTime
3859 if (FrameTime > F1_0 )
3860 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
3862 if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
3863 if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
3864 if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
3865 if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
3866 if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
3867 if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
3868 // if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
3870 if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
3871 if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
3872 if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
3873 if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
3874 if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
3875 if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
3876 // if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
3879 //--------- Don't do anything if in debug mode
3881 if ( keyd_pressed[KEY_DELETE] ) {
3882 memset( &Controls, 0, sizeof(control_info) );
3888 void reset_cruise(void)
3894 void kc_set_controls()
3898 for (i=0; i<NUM_KEY_CONTROLS; i++ )
3899 kc_keyboard[i].value = kconfig_settings[0][i];
3901 if ( (Config_control_type>0) && (Config_control_type<5)) {
3902 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3903 kc_joystick[i].value = kconfig_settings[Config_control_type][i];
3904 if (kc_joystick[i].type == BT_INVERT ) {
3905 if (kc_joystick[i].value!=1)
3906 kc_joystick[i].value = 0;
3907 kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
3910 } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
3911 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3912 kc_mouse[i].value = kconfig_settings[Config_control_type][i];
3913 if (kc_mouse[i].type == BT_INVERT ) {
3914 if (kc_mouse[i].value!=1)
3915 kc_mouse[i].value = 0;
3916 kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
3919 } else if (Config_control_type == CONTROL_WINJOYSTICK) {
3920 for (i=0; i<NUM_OTHER_CONTROLS; i++ ) {
3921 kc_superjoy[i].value = kconfig_settings[Config_control_type][i];
3922 if (kc_superjoy[i].type == BT_INVERT ) {
3923 if (kc_superjoy[i].value!=1)
3924 kc_superjoy[i].value = 0;
3925 kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
3931 for (i=0; i<NUM_D2X_CONTROLS; i++ )
3932 kc_d2x[i].value = kconfig_d2x_settings[i];
3936 #if 0 //ndef MACINTOSH // no mac support for vr headset
3938 void kconfig_center_headset()
3942 vfx_center_headset();
3944 // } else if (iglasses_headset_installed) {
3945 // } else if (Victor_headset_installed) {
3951 #endif // end of #ifndef MACINTOSH for kconfig_center_headset
3953 void CybermouseAdjust ()
3955 /* if ( Player_num > -1 ) {
3956 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL); // Turn off roll when turning
3957 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING); // Turn off leveling to nearest side.
3958 Auto_leveling_on = 0;
3960 if ( kc_external_version > 0 ) {
3961 vms_matrix tempm, ViewMatrix;
3962 vms_angvec * Kconfig_abs_movement;
3965 Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(control_info));
3967 if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h ) {
3968 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
3969 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
3970 Objects[Players[Player_num].objnum].orient = ViewMatrix;
3972 oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
3973 if (oem_message[0] != '\0' )
3974 HUD_init_message( oem_message );
3978 Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);
3979 Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
3980 Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
3981 Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
3982 Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
3983 Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
3984 // Controls.rear_view_down_count += kc_external_control->rear_view_down_count;
3985 // Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;
3986 Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
3987 Controls.fire_primary_state |= kc_external_control->fire_primary_state;
3988 Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
3989 Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
3990 Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
3991 Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;
3992 // Controls.automap_down_count += kc_external_control->automap_down_count;
3993 // Controls.automap_state |= kc_external_control->automap_state;
3996 char GetKeyValue (char key)
3998 mprintf ((0,"Returning %c!\n",kc_keyboard[(int)key].value));
3999 return (kc_keyboard[(int)key].value);
4002 #if !defined(MACINTOSH)
4005 extern object *obj_find_first_of_type (int);
4006 void kconfig_read_external_controls()
4011 if ( !kc_enable_external_control ) return;
4013 if ( kc_external_version == 0 )
4014 memset( kc_external_control, 0, sizeof(ext_control_info));
4015 else if ( kc_external_version > 0 ) {
4017 if (kc_external_version>=4)
4018 memset( kc_external_control, 0, sizeof(advanced_ext_control_info));
4019 else if (kc_external_version>0)
4020 memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 );
4021 else if (kc_external_version>2)
4022 memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector) + sizeof(vms_matrix) +4 );
4024 if ( kc_external_version > 1 ) {
4025 // Write ship pos and angles to external controls...
4026 ubyte *temp_ptr = (ubyte *)kc_external_control;
4027 vms_vector *ship_pos;
4028 vms_matrix *ship_orient;
4029 memset( kc_external_control, 0, sizeof(ext_control_info)+sizeof(vms_angvec) + 64 + sizeof(vms_vector)+sizeof(vms_matrix) );
4030 temp_ptr += sizeof(ext_control_info) + sizeof(vms_angvec) + 64;
4031 ship_pos = (vms_vector *)temp_ptr;
4032 temp_ptr += sizeof(vms_vector);
4033 ship_orient = (vms_matrix *)temp_ptr;
4034 // Fill in ship postion...
4035 *ship_pos = Objects[Players[Player_num].objnum].pos;
4036 // Fill in ship orientation...
4037 *ship_orient = Objects[Players[Player_num].objnum].orient;
4039 if (kc_external_version>=4)
4041 advanced_ext_control_info *temp_ptr=(advanced_ext_control_info *)kc_external_control;
4043 temp_ptr->headlight_state=(Players[Player_num].flags & PLAYER_FLAGS_HEADLIGHT_ON);
4044 temp_ptr->primary_weapon_flags=Players[Player_num].primary_weapon_flags;
4045 temp_ptr->secondary_weapon_flags=Players[Player_num].secondary_weapon_flags;
4046 temp_ptr->current_primary_weapon=Primary_weapon;
4047 temp_ptr->current_secondary_weapon=Secondary_weapon;
4049 temp_ptr->current_guidebot_command=Escort_goal_object;
4051 temp_ptr->force_vector=ExtForceVec;
4052 temp_ptr->force_matrix=ExtApplyForceMatrix;
4054 temp_ptr->joltinfo[i]=ExtJoltInfo[i];
4056 temp_ptr->x_vibrate_info[i]=ExtXVibrateInfo[i];
4057 temp_ptr->x_vibrate_clear=ExtXVibrateClear;
4058 temp_ptr->game_status=ExtGameStatus;
4060 memset ((void *)&ExtForceVec,0,sizeof(vms_vector));
4061 memset ((void *)&ExtApplyForceMatrix,0,sizeof(vms_matrix));
4066 ExtXVibrateInfo[i]=0;
4071 if ( Automap_active ) // (If in automap...)
4072 kc_external_control->automap_state = 1;
4073 //memset(&r,0,sizeof(r));
4077 int386 ( kc_external_intno, &r, &r); // Read external info...
4081 if ( Player_num > -1 ) {
4082 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_TURNROLL); // Turn off roll when turning
4083 Objects[Players[Player_num].objnum].mtype.phys_info.flags &= (~PF_LEVELLING); // Turn off leveling to nearest side.
4084 Auto_leveling_on = 0;
4086 if ( kc_external_version > 0 ) {
4087 vms_matrix tempm, ViewMatrix;
4088 vms_angvec * Kconfig_abs_movement;
4091 Kconfig_abs_movement = (vms_angvec *)((uint)kc_external_control + sizeof(ext_control_info));
4093 if ( Kconfig_abs_movement->p || Kconfig_abs_movement->b || Kconfig_abs_movement->h ) {
4094 vm_angles_2_matrix(&tempm,Kconfig_abs_movement);
4095 vm_matrix_x_matrix(&ViewMatrix,&Objects[Players[Player_num].objnum].orient,&tempm);
4096 Objects[Players[Player_num].objnum].orient = ViewMatrix;
4098 oem_message = (char *)((uint)Kconfig_abs_movement + sizeof(vms_angvec));
4099 if (oem_message[0] != '\0' )
4100 HUD_init_message( oem_message );
4104 Controls.pitch_time += fixmul(kc_external_control->pitch_time,FrameTime);
4105 Controls.vertical_thrust_time += fixmul(kc_external_control->vertical_thrust_time,FrameTime);
4106 Controls.heading_time += fixmul(kc_external_control->heading_time,FrameTime);
4107 Controls.sideways_thrust_time += fixmul(kc_external_control->sideways_thrust_time ,FrameTime);
4108 Controls.bank_time += fixmul(kc_external_control->bank_time ,FrameTime);
4109 Controls.forward_thrust_time += fixmul(kc_external_control->forward_thrust_time ,FrameTime);
4110 Controls.rear_view_down_count += kc_external_control->rear_view_down_count;
4111 Controls.rear_view_down_state |= kc_external_control->rear_view_down_state;
4112 Controls.fire_primary_down_count += kc_external_control->fire_primary_down_count;
4113 Controls.fire_primary_state |= kc_external_control->fire_primary_state;
4114 Controls.fire_secondary_state |= kc_external_control->fire_secondary_state;
4115 Controls.fire_secondary_down_count += kc_external_control->fire_secondary_down_count;
4116 Controls.fire_flare_down_count += kc_external_control->fire_flare_down_count;
4117 Controls.drop_bomb_down_count += kc_external_control->drop_bomb_down_count;
4118 Controls.automap_down_count += kc_external_control->automap_down_count;
4119 Controls.automap_state |= kc_external_control->automap_state;
4121 if (kc_external_version>=3)
4123 ubyte *temp_ptr = (ubyte *)kc_external_control;
4124 temp_ptr += (sizeof(ext_control_info) + sizeof(vms_angvec) + 64 + sizeof(vms_vector) + sizeof (vms_matrix));
4127 Controls.cycle_primary_count=(*(temp_ptr));
4129 Controls.cycle_secondary_count=(*(temp_ptr+1));
4132 Controls.afterburner_state=(*(temp_ptr+2));
4134 Controls.headlight_count=(*(temp_ptr+3));
4136 if (kc_external_version>=4)
4139 advanced_ext_control_info *temp_ptr=(advanced_ext_control_info *)kc_external_control;
4142 if (temp_ptr->keyboard[i])
4145 if (temp_ptr->Reactor_blown)
4147 if (Game_mode & GM_MULTI)
4148 net_destroy_controlcen (obj_find_first_of_type (OBJ_CNTRLCEN));
4150 do_controlcen_destroyed_stuff(obj_find_first_of_type (OBJ_CNTRLCEN));