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