21539a5c053e1a60545cb19214f4e17d6e0c1292
[btb/d2x.git] / main / kconfig.c
1 /* $Id: kconfig.c,v 1.36 2005-04-04 09:18:08 btb Exp $ */
2 /*
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
13 */
14
15 /*
16  *
17  * Routines to configure keyboard, joystick, etc..
18  *
19  */
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.36 2005-04-04 09:18:08 btb 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 #elif defined(SDL_INPUT)
121 char *joybutton_text[JOY_MAX_BUTTONS];
122 char *joyaxis_text[JOY_MAX_AXES];
123 #else
124         int joybutton_text[28] = 
125         { TNUM_BTN_1, TNUM_BTN_2, TNUM_BTN_3, TNUM_BTN_4,
126           -1, TNUM_TRIG, TNUM_LEFT, TNUM_HAT_L,
127          TNUM_RIGHT, -1, TNUM_HAT2_D, TNUM_HAT_R,
128          TNUM_MID, -1, TNUM_HAT2_R, TNUM_HAT_U,
129          TNUM_HAT2_L, -1, TNUM_HAT2_U, TNUM_HAT_D,
130          TNUM_TRIG, TNUM_LEFT, TNUM_RIGHT, -1, 
131          TNUM_UP, TNUM_DOWN, TNUM_LEFT, TNUM_RIGHT };
132
133         int joyaxis_text[7] = { TNUM_X1, TNUM_Y1, TNUM_Z1, TNUM_UN, TNUM_P1,TNUM_R1,TNUM_YA1 };
134 //      int joyaxis_text[4] = { TNUM_X1, TNUM_Y1, TNUM_X2, TNUM_Y2 };
135 #endif
136 #endif
137
138 int mouseaxis_text[3] = { TNUM_L_R, TNUM_F_B, TNUM_Z1 };
139 #ifndef MACINTOSH
140 int mousebutton_text[3] = { TNUM_LEFT, TNUM_RIGHT, TNUM_MID };
141 char * mousebutton_textra[13] = { "M4", "M5", "M6", "M7", "M8", "M9", "M10","M11","M12","M13","M14","M15","M16" };//text for buttons above 3. -MPM
142 #else
143 char *mousebutton_text[3] = { "Btn", "", "" };          // only one silly mouse button on the mac
144 #endif
145
146 #ifdef MACINTOSH
147 char * key_text[256] = {         
148 "","S","D","F","H","G","Z","X","C","V","","B","Q", "W", "E", "R",
149 "Y","T","1","2","3","4","6","5","=","9","7","-", "8", "0", "]", "O",
150 "U","[","I","P","RET","L","J","'","K", ";", "\\", ",", "/", "N", "M", ".",
151 "TAB","SPC","`","DEL","","ESC","","APL","SHIFT","CAPSL","OPTN","CTRL","","","","A",
152 "","PAD.","","PAD*","","PAD+","","NMLCK","","","","PAD/","ENTER","","PAD-","",
153 "","PAD=","PAD0","PAD1","PAD2","PAD3","PAD4","PAD5","PAD6","PAD7","","PAD8","PAD9","","","",
154 "F5","F6","F7","","F8","F9","","F11","","F13","","F14","","F10","","F12",
155 "","PAUSE","HELP","HOME","PGUP","DEL","","END","F2","","F1","LARW","RARW","DARW","UARW","",
156 "","","","","","","","","","","","","","","","",
157 "","","","","","","","","","","","","","","","",
158 "","","","","","","","","","","","","","","","",
159 "","","","","","","","","","","","","","","","",
160 "","","","","","","","","","","","","","","","",
161 "","","","","","","","","","","","","","","","",
162 "","","","","","","","","","","","","","","","",
163 "","","","","","","","","","","","","","","",""};
164 #else
165 #if !defined OGL && !defined SDL_INPUT
166 char * key_text[256] = {         \
167 "","ESC","1","2","3","4","5","6","7","8","9","0","-",                   \
168 "=","BSPC","TAB","Q","W","E","R","T","Y","U","I","O",                           \
169 "P","[","]","\83","LCTRL","A","S","D","F",        \
170 "G","H","J","K","L",";","'","`",        \
171 "LSHFT","\\","Z","X","C","V","B","N","M",",",      \
172 ".","/","RSHFT","PAD*","LALT","SPC",      \
173 "CPSLK","F1","F2","F3","F4","F5","F6","F7","F8","F9",        \
174 "F10","NMLCK","SCLK","PAD7","PAD8","PAD9","PAD-",   \
175 "PAD4","PAD5","PAD6","PAD+","PAD1","PAD2","PAD3","PAD0", \
176 "PAD.","","","","F11","F12","","","","","","","","","",         \
177 "","","","","","","","","","","","","","","","","","","","",     \
178 "","","","","","","","","","","","","","","","","","","","",     \
179 "","","","","","","","","","","","","","","","","","",           \
180 "PAD\83","RCTRL","","","","","","","","","","","","","", \
181 "","","","","","","","","","","PAD/","","","RALT","",      \
182 "","","","","","","","","","","","","","HOME","\82","PGUP",     \
183 "","\81","","\7f","","END","\80","PGDN","INS",       \
184 "DEL","","","","","","","","","","","","","","","","","",     \
185 "","","","","","","","","","","","","","","","","","","","",     \
186 "","","","","","","" };
187 #endif /* OGL */
188 #endif
189
190 #ifdef D2X_KEYS
191 //added/removed by Victor Rachels for adding rebindable keys for these
192 // KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0
193 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 };
194 #else
195 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 };
196 #endif
197
198 //extern void GameLoop(int, int );
199
200 extern void transfer_energy_to_shield(fix);
201 extern void CyclePrimary(),CycleSecondary(),InitMarkerInput();
202 extern ubyte DefiningMarkerMessage;
203 extern char CybermouseActive;
204
205 #ifdef WINDOWS
206 extern int joydefsw_do_button();
207 extern int joydefsw_do_winjoybutton(int *axis);
208 extern joydefsw_win_joyselect(char *title);
209 #endif
210
211 control_info Controls;
212
213 fix Cruise_speed=0;
214
215 // macros for drawing lo/hi res kconfig screens (see scores.c as well)
216
217 #define LHX(x)          ((x)*(MenuHires?2:1))
218 #define LHY(y)          ((y)*(MenuHires?2.4:1))
219
220
221 #define BT_KEY                          0
222 #define BT_MOUSE_BUTTON         1
223 #define BT_MOUSE_AXIS           2
224 #define BT_JOY_BUTTON           3
225 #define BT_JOY_AXIS                     4
226 #define BT_INVERT                               5
227
228 char *btype_text[] = { "BT_KEY", "BT_MOUSE_BUTTON", "BT_MOUSE_AXIS", "BT_JOY_BUTTON", "BT_JOY_AXIS", "BT_INVERT" };
229
230 #define INFO_Y 28
231
232 typedef struct kc_item {
233         short id;                               // The id of this item
234         short x, y;                             
235         short w1;
236         short w2;
237         short u,d,l,r;
238         //short text_num1;
239         char *text;
240         ubyte type;
241         ubyte value;            // what key,button,etc
242 } kc_item;
243
244 int Num_items=28;
245 kc_item *All_items;
246
247 ubyte kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS];
248
249 //added on 2/4/99 by Victor Rachels to add d1x new keys
250 ubyte kconfig_d2x_settings[MAX_D2X_CONTROLS];
251 //end this section addition - VR
252
253 //----------- WARNING!!!!!!! -------------------------------------------
254 // THESE NEXT FOUR BLOCKS OF DATA ARE GENERATED BY PRESSING DEL+F12 WHEN
255 // IN THE KEYBOARD CONFIG SCREEN.  BASICALLY, THAT PROCEDURE MODIFIES THE
256 // U,D,L,R FIELDS OF THE ARRAYS AND DUMPS THE NEW ARRAYS INTO KCONFIG.COD
257 //-------------------------------------------------------------------------
258 /*ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
259 {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},
260 {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},
261 {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},
262 {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},
263 {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},
264 {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},
265 {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},
266 };*/                                                                              
267
268 #ifndef MACINTOSH
269 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
270 {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},
271 {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},
272 {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},
273 {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},
274 {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},
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,0x0,0x0,0x0,0x0,0x0},
276 {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},
277 #ifdef WINDOWS
278 {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},
279 #endif
280 };
281
282
283
284 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
285         {  0, 15, 49, 71, 26, 55,  2, 55,  1,"Pitch forward", BT_KEY, 255 },
286         {  1, 15, 49,100, 26, 50,  3,  0, 24,"Pitch forward", BT_KEY, 255 },
287         {  2, 15, 57, 71, 26,  0,  4, 25,  3,"Pitch backward", BT_KEY, 255 },
288         {  3, 15, 57,100, 26,  1,  5,  2, 26,"Pitch backward", BT_KEY, 255 },
289         {  4, 15, 65, 71, 26,  2,  6, 27,  5,"Turn left", BT_KEY, 255 },
290         {  5, 15, 65,100, 26,  3,  7,  4, 28,"Turn left", BT_KEY, 255 },
291         {  6, 15, 73, 71, 26,  4,  8, 29,  7,"Turn right", BT_KEY, 255 },
292         {  7, 15, 73,100, 26,  5,  9,  6, 34,"Turn right", BT_KEY, 255 },
293         {  8, 15, 85, 71, 26,  6, 10, 35,  9,"Slide on", BT_KEY, 255 },
294         {  9, 15, 85,100, 26,  7, 11,  8, 36,"Slide on", BT_KEY, 255 },
295         { 10, 15, 93, 71, 26,  8, 12, 37, 11,"Slide left", BT_KEY, 255 },
296         { 11, 15, 93,100, 26,  9, 13, 10, 44,"Slide left", BT_KEY, 255 },
297         { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
298         { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
299         { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
300         { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
301         { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
302         { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
303         { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
304         { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
305         { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
306         { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
307         { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
308         { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
309         { 24,158, 49, 83, 26, 51, 26,  1, 25,"Fire primary", BT_KEY, 255 },
310         { 25,158, 49,112, 26, 54, 27, 24,  2,"Fire primary", BT_KEY, 255 },
311         { 26,158, 57, 83, 26, 24, 28,  3, 27,"Fire secondary", BT_KEY, 255 },
312         { 27,158, 57,112, 26, 25, 29, 26,  4,"Fire secondary", BT_KEY, 255 },
313         { 28,158, 65, 83, 26, 26, 34,  5, 29,"Fire flare", BT_KEY, 255 },
314         { 29,158, 65,112, 26, 27, 35, 28,  6,"Fire flare", BT_KEY, 255 },
315         { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
316         { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
317         { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
318         { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
319         { 34,158, 73, 83, 26, 28, 36,  7, 35,"Drop Bomb", BT_KEY, 255 },
320         { 35,158, 73,112, 26, 29, 37, 34,  8,"Drop Bomb", BT_KEY, 255 },
321         { 36,158, 85, 83, 26, 34, 44,  9, 37,"REAR VIEW", BT_KEY, 255 },
322         { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
323         { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
324         { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
325         { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
326         { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
327         { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
328         { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
329         { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
330         { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
331         { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
332         { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
333         { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
334         { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
335         { 50, 15,169, 71, 26, 48,  1, 53, 51,"Cycle Second", BT_KEY, 255 },
336         { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
337         { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
338         { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
339         { 54,158,171, 83, 26, 52, 56, 51, 55,"Energy->Shield", BT_KEY, 255 },
340         { 55,158,171,112, 26, 53,  0, 54,  0,"Energy->Shield", BT_KEY, 255 },
341    { 56,158,179,83,  26, 54,  0, 0,  0, "Toggle Bomb",  BT_KEY,255},
342 };
343 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
344         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
345         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
346         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
347         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
348         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
349         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
350         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
351         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
352         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
353         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
354         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
355         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
356         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
357         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
358         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
359         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
360         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
361         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
362         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
363         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
364         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
365         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
366         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
367         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
368         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
369         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
370         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
371         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
372         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
373         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
374         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
375 };
376 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
377         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
378         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
379         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
380         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
381         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
382         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
383         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
384         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
385         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
386         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
387         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
388         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
389         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
390         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
391         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
392         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
393         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
394         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
395         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
396         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
397         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
398         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
399         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
400         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
401         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
402         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
403         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
404         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
405         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
406         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
407         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
408 };
409
410 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
411         {  0, 25, 46, 85, 26, 12,  1, 24,  5,"Fire primary", BT_MOUSE_BUTTON, 255 },
412         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
413         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
414         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
415         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_MOUSE_BUTTON, 255 },
416         {  5,180, 46, 59, 26, 24,  6,  0,  1,"Slide on", BT_MOUSE_BUTTON, 255 },
417         {  6,180, 54, 59, 26,  5,  7,  1,  4,"Slide left", BT_MOUSE_BUTTON, 255 },
418         {  7,180, 62, 59, 26,  6,  8,  4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
419         {  8,180, 70, 59, 26,  7,  9, 26,  9,"Slide up", BT_MOUSE_BUTTON, 255 },
420         {  9,180, 78, 59, 26,  8, 10,  8,  2,"Slide down", BT_MOUSE_BUTTON, 255 },
421         { 10,180, 90, 59, 26,  9, 11,  2,  3,"Bank on", BT_MOUSE_BUTTON, 255 },
422         { 11,180, 98, 59, 26, 10, 12,  3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
423         { 12,180,106, 59, 26, 11,  0, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
424         { 13,103,138, 58, 26, 27, 15, 25, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
425         { 14,103,138,106,  8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
426         { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
427         { 16,103,146,106,  8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
428         { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
429         { 18,103,154,106,  8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
430         { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
431         { 20,103,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
432         { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
433         { 22,103,170,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
434         { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
435         { 24,103,182,106,  8, 22,  5, 23,  0,"throttle", BT_INVERT, 255 },
436         { 25, 25,109, 85, 26,  3, 27, 12, 13,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
437         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
438         { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
439 };
440
441 #ifdef D2X_KEYS
442 //added on 2/4/99 by Victor Rachels to add d1x new keys
443 kc_item kc_d2x[NUM_D2X_CONTROLS] = {
444 //        id,x,y,w1,w2,u,d,l,r,text_num1,type,value
445         {  0, 15, 49, 71, 26, 27,  2, 27,  1, "WEAPON 1", BT_KEY, 255},
446         {  1, 15, 49,100, 26, 26,  3,  0,  2, "WEAPON 1", BT_JOY_BUTTON, 255},
447         {  2, 15, 57, 71, 26,  0,  4,  1,  3, "WEAPON 2", BT_KEY, 255},
448         {  3, 15, 57,100, 26,  1,  5,  2,  4, "WEAPON 2", BT_JOY_BUTTON, 255},
449         {  4, 15, 65, 71, 26,  2,  6,  3,  5, "WEAPON 3", BT_KEY, 255},
450         {  5, 15, 65,100, 26,  3,  7,  4,  6, "WEAPON 3", BT_JOY_BUTTON, 255},
451         {  6, 15, 73, 71, 26,  4,  8,  5,  7, "WEAPON 4", BT_KEY, 255},
452         {  7, 15, 73,100, 26,  5,  9,  6,  8, "WEAPON 4", BT_JOY_BUTTON, 255},
453         {  8, 15, 81, 71, 26,  6, 10,  7,  9, "WEAPON 5", BT_KEY, 255},
454         {  9, 15, 81,100, 26,  7, 11,  8, 10, "WEAPON 5", BT_JOY_BUTTON, 255},
455
456         { 10, 15, 89, 71, 26,  8, 12,  9, 11, "WEAPON 6", BT_KEY, 255},
457         { 11, 15, 89,100, 26,  9, 13, 10, 12, "WEAPON 6", BT_JOY_BUTTON, 255},
458         { 12, 15, 97, 71, 26, 10, 14, 11, 13, "WEAPON 7", BT_KEY, 255},
459         { 13, 15, 97,100, 26, 11, 15, 12, 14, "WEAPON 7", BT_JOY_BUTTON, 255},
460         { 14, 15,105, 71, 26, 12, 16, 13, 15, "WEAPON 8", BT_KEY, 255},
461         { 15, 15,105,100, 26, 13, 17, 14, 16, "WEAPON 8", BT_JOY_BUTTON, 255},
462         { 16, 15,113, 71, 26, 14, 18, 15, 17, "WEAPON 9", BT_KEY, 255},
463         { 17, 15,113,100, 26, 15, 19, 16, 18, "WEAPON 9", BT_JOY_BUTTON, 255},
464         { 18, 15,121, 71, 26, 16, 20, 17, 19, "WEAPON 0", BT_KEY, 255},
465         { 19, 15,121,100, 26, 17, 21, 18, 20, "WEAPON 0", BT_JOY_BUTTON, 255},
466
467         //{ 20, 15,131, 71, 26, 18, 22, 19, 21, "CYC PRIMARY", BT_KEY, 255},
468         //{ 21, 15,131,100, 26, 19, 23, 20, 22, "CYC PRIMARY", BT_JOY_BUTTON, 255},
469         //{ 22, 15,139, 71, 26, 20, 24, 21, 23, "CYC SECONDARY", BT_KEY, 255},
470         //{ 23, 15,139,100, 26, 21, 25, 22, 24, "CYC SECONDARY", BT_JOY_BUTTON, 255},
471         //{ 24,  8,147, 78, 26, 22, 26, 23, 25, "TOGGLE_PRIM AUTO", BT_KEY, 255},
472         //{ 25,  8,147,107, 26, 23, 27, 24, 26, "TOGGLE_PRIM_AUTO", BT_JOY_BUTTON, 255},
473         //{ 26,  8,155, 78, 26, 24,  1, 25, 27, "TOGGLE SEC AUTO", BT_KEY, 255},
474         //{ 27,  8,155,107, 26, 25,  0, 26,  0, "TOGGLE SEC AUTO", BT_JOY_BUTTON, 255},
475 };
476 //end this section addition - VR
477 #endif
478
479 #else           // ifndef MACINTOSH (following are macintosh controls)
480
481 ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {
482 {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},
483 {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},
484 {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},
485 {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},
486 {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},
487 {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},
488 {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},
489 };
490
491 ubyte default_firebird_settings[MAX_CONTROLS] =
492 {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};
493
494 ubyte default_mousestick_settings[MAX_CONTROLS] =
495 {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};
496
497 kc_item kc_keyboard[NUM_KEY_CONTROLS] = {
498         {  0, 15, 49, 71, 26, 55,  2, 55,  1,"Pitch forward", BT_KEY, 255 },
499         {  1, 15, 49,100, 26, 50,  3,  0, 24,"Pitch forward", BT_KEY, 255 },
500         {  2, 15, 57, 71, 26,  0,  4, 25,  3,"Pitch backward", BT_KEY, 255 },
501         {  3, 15, 57,100, 26,  1,  5,  2, 26,"Pitch backward", BT_KEY, 255 },
502         {  4, 15, 65, 71, 26,  2,  6, 27,  5,"Turn left", BT_KEY, 255 },
503         {  5, 15, 65,100, 26,  3,  7,  4, 28,"Turn left", BT_KEY, 255 },
504         {  6, 15, 73, 71, 26,  4,  8, 29,  7,"Turn right", BT_KEY, 255 },
505         {  7, 15, 73,100, 26,  5,  9,  6, 34,"Turn right", BT_KEY, 255 },
506         {  8, 15, 85, 71, 26,  6, 10, 35,  9,"Slide on", BT_KEY, 255 },
507         {  9, 15, 85,100, 26,  7, 11,  8, 36,"Slide on", BT_KEY, 255 },
508         { 10, 15, 93, 71, 26,  8, 12, 37, 11,"Slide left", BT_KEY, 255 },
509         { 11, 15, 93,100, 26,  9, 13, 10, 44,"Slide left", BT_KEY, 255 },
510         { 12, 15,101, 71, 26, 10, 14, 45, 13,"Slide right", BT_KEY, 255 },
511         { 13, 15,101,100, 26, 11, 15, 12, 30,"Slide right", BT_KEY, 255 },
512         { 14, 15,109, 71, 26, 12, 16, 31, 15,"Slide up", BT_KEY, 255 },
513         { 15, 15,109,100, 26, 13, 17, 14, 32,"Slide up", BT_KEY, 255 },
514         { 16, 15,117, 71, 26, 14, 18, 33, 17,"Slide down", BT_KEY, 255 },
515         { 17, 15,117,100, 26, 15, 19, 16, 46,"Slide down", BT_KEY, 255 },
516         { 18, 15,129, 71, 26, 16, 20, 47, 19,"Bank on", BT_KEY, 255 },
517         { 19, 15,129,100, 26, 17, 21, 18, 38,"Bank on", BT_KEY, 255 },
518         { 20, 15,137, 71, 26, 18, 22, 39, 21,"Bank left", BT_KEY, 255 },
519         { 21, 15,137,100, 26, 19, 23, 20, 40,"Bank left", BT_KEY, 255 },
520         { 22, 15,145, 71, 26, 20, 48, 41, 23,"Bank right", BT_KEY, 255 },
521         { 23, 15,145,100, 26, 21, 49, 22, 42,"Bank right", BT_KEY, 255 },
522         { 24,158, 49, 83, 26, 51, 26,  1, 25,"Fire primary", BT_KEY, 255 },
523         { 25,158, 49,112, 26, 54, 27, 24,  2,"Fire primary", BT_KEY, 255 },
524         { 26,158, 57, 83, 26, 24, 28,  3, 27,"Fire secondary", BT_KEY, 255 },
525         { 27,158, 57,112, 26, 25, 29, 26,  4,"Fire secondary", BT_KEY, 255 },
526         { 28,158, 65, 83, 26, 26, 34,  5, 29,"Fire flare", BT_KEY, 255 },
527         { 29,158, 65,112, 26, 27, 35, 28,  6,"Fire flare", BT_KEY, 255 },
528         { 30,158,105, 83, 26, 44, 32, 13, 31,"Accelerate", BT_KEY, 255 },
529         { 31,158,105,112, 26, 45, 33, 30, 14,"Accelerate", BT_KEY, 255 },
530         { 32,158,113, 83, 26, 30, 46, 15, 33,"reverse", BT_KEY, 255 },
531         { 33,158,113,112, 26, 31, 47, 32, 16,"reverse", BT_KEY, 255 },
532         { 34,158, 73, 83, 26, 28, 36,  7, 35,"Drop Bomb", BT_KEY, 255 },
533         { 35,158, 73,112, 26, 29, 37, 34,  8,"Drop Bomb", BT_KEY, 255 },
534         { 36,158, 85, 83, 26, 34, 44,  9, 37,"REAR VIEW", BT_KEY, 255 },
535         { 37,158, 85,112, 26, 35, 45, 36, 10,"REAR VIEW", BT_KEY, 255 },
536         { 38,158,133, 83, 26, 46, 40, 19, 39,"Cruise Faster", BT_KEY, 255 },
537         { 39,158,133,112, 26, 47, 41, 38, 20,"Cruise Faster", BT_KEY, 255 },
538         { 40,158,141, 83, 26, 38, 42, 21, 41,"Cruise Slower", BT_KEY, 255 },
539         { 41,158,141,112, 26, 39, 43, 40, 22,"Cruise Slower", BT_KEY, 255 },
540         { 42,158,149, 83, 26, 40, 52, 23, 43,"Cruise Off", BT_KEY, 255 },
541         { 43,158,149,112, 26, 41, 53, 42, 48,"Cruise Off", BT_KEY, 255 },
542         { 44,158, 93, 83, 26, 36, 30, 11, 45,"Automap", BT_KEY, 255 },
543         { 45,158, 93,112, 26, 37, 31, 44, 12,"Automap", BT_KEY, 255 },
544         { 46,158,121, 83, 26, 32, 38, 17, 47,"Afterburner", BT_KEY, 255 },
545         { 47,158,121,112, 26, 33, 39, 46, 18,"Afterburner", BT_KEY, 255 },
546         { 48, 15,161, 71, 26, 22, 50, 43, 49,"Cycle Primary", BT_KEY, 255 },
547         { 49, 15,161,100, 26, 23, 51, 48, 52,"Cycle Primary", BT_KEY, 255 },
548         { 50, 15,169, 71, 26, 48,  1, 53, 51,"Cycle Second", BT_KEY, 255 },
549         { 51, 15,169,100, 26, 49, 24, 50, 54,"Cycle Second", BT_KEY, 255 },
550         { 52,158,163, 83, 26, 42, 54, 49, 53,"Headlight", BT_KEY, 255 },
551         { 53,158,163,112, 26, 43, 55, 52, 50,"Headlight", BT_KEY, 255 },
552         { 54,158,171, 83, 26, 52, 25, 51, 55,"Energy->Shield", BT_KEY, 255 },
553         { 55,158,171,112, 26, 53,  0, 54,  0,"Energy->Shield", BT_KEY, 255 },
554 };
555 kc_item kc_joystick[NUM_OTHER_CONTROLS] = {
556         {  0, 25, 46, 85, 28, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
557         {  1, 25, 54, 85, 28,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
558         {  2, 25, 85, 85, 28, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
559         {  3, 25, 93, 85, 28,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
560         {  4, 25, 62, 85, 28,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
561         {  5,180, 46, 79, 28, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
562         {  6,180, 54, 79, 28,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
563         {  7,180, 62, 79, 28,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
564         {  8,180, 70, 79, 28,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
565         {  9,180, 78, 79, 28,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
566         { 10,180, 90, 79, 28,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
567         { 11,180, 98, 79, 28, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
568         { 12,180,106, 79, 28, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
569         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
570         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
571         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
572         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
573         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
574         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
575         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
576         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
577         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
578         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
579         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
580         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
581         { 25, 25,109, 85, 28,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
582         { 26, 25, 70, 85, 28,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
583         { 27, 25,117, 85, 28, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
584         { 28,180,114, 79, 28, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
585         { 29,180,122, 79, 28, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
586         { 30, 25,125, 85, 28, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
587 };
588 kc_item kc_superjoy[NUM_OTHER_CONTROLS] = {
589         {  0, 25, 46, 85, 26, 15,  1, 24,  5,"Fire primary", BT_JOY_BUTTON, 255 },
590         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_JOY_BUTTON, 255 },
591         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_JOY_BUTTON, 255 },
592         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_JOY_BUTTON, 255 },
593         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_JOY_BUTTON, 255 },
594         {  5,180, 46, 79, 26, 23,  6,  0,  1,"Slide on", BT_JOY_BUTTON, 255 },
595         {  6,180, 54, 79, 26,  5,  7,  1,  4,"Slide left", BT_JOY_BUTTON, 255 },
596         {  7,180, 62, 79, 26,  6,  8,  4, 26,"Slide right", BT_JOY_BUTTON, 255 },
597         {  8,180, 70, 79, 26,  7,  9, 26,  9,"Slide up", BT_JOY_BUTTON, 255 },
598         {  9,180, 78, 79, 26,  8, 10,  8,  2,"Slide down", BT_JOY_BUTTON, 255 },
599         { 10,180, 90, 79, 26,  9, 11,  2,  3,"Bank on", BT_JOY_BUTTON, 255 },
600         { 11,180, 98, 79, 26, 10, 12,  3, 12,"Bank left", BT_JOY_BUTTON, 255 },
601         { 12,180,106, 79, 26, 11, 28, 11, 25,"Bank right", BT_JOY_BUTTON, 255 },
602         { 13, 22,154, 51, 26, 24, 15, 30, 14,"Pitch U/D", BT_JOY_AXIS, 255 },
603         { 14, 22,154, 99,  8, 30, 16, 13, 17,"Pitch U/D", BT_INVERT, 255 },
604         { 15, 22,162, 51, 26, 13,  0, 18, 16,"Turn L/R", BT_JOY_AXIS, 255 },
605         { 16, 22,162, 99,  8, 14, 17, 15, 19,"Turn L/R", BT_INVERT, 255 },
606         { 17,164,154, 58, 26, 16, 19, 14, 18,"Slide L/R", BT_JOY_AXIS, 255 },
607         { 18,164,154,106,  8, 29, 20, 17, 15,"Slide L/R", BT_INVERT, 255 },
608         { 19,164,162, 58, 26, 17, 21, 16, 20,"Slide U/D", BT_JOY_AXIS, 255 },
609         { 20,164,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
610         { 21,164,172, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_JOY_AXIS, 255 },
611         { 22,164,172,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
612         { 23,164,180, 58, 26, 21,  5, 22, 24,"throttle", BT_JOY_AXIS, 255 },
613         { 24,164,180,106,  8, 22, 13, 23,  0,"throttle", BT_INVERT, 255 },
614         { 25, 25,109, 85, 26,  3, 27, 12, 28,"REAR VIEW", BT_JOY_BUTTON, 255 },
615         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_JOY_BUTTON, 255 },
616         { 27, 25,117, 85, 26, 25, 30, 28, 29,"Afterburner", BT_JOY_BUTTON, 255 },
617         { 28,180,114, 79, 26, 12, 29, 25, 27,"Cycle Primary", BT_JOY_BUTTON, 255 },
618         { 29,180,122, 79, 26, 28, 18, 27, 30,"Cycle Secondary", BT_JOY_BUTTON, 255 },
619         { 30, 25,125, 85, 26, 27, 14, 29, 13,"Headlight", BT_JOY_BUTTON, 255 },
620 };
621
622 kc_item kc_mouse[NUM_OTHER_CONTROLS] = {
623         {  0, 25, 46, 85, 26, 28,  1, 28,  5,"Fire primary", BT_MOUSE_BUTTON, 255 },
624         {  1, 25, 54, 85, 26,  0,  4,  5,  6,"Fire secondary", BT_MOUSE_BUTTON, 255 },
625         {  2, 25, 85, 85, 26, 26,  3,  9, 10,"Accelerate", BT_MOUSE_BUTTON, 255 },
626         {  3, 25, 93, 85, 26,  2, 25, 10, 11,"reverse", BT_MOUSE_BUTTON, 255 },
627         {  4, 25, 62, 85, 26,  1, 26,  6,  7,"Fire flare", BT_MOUSE_BUTTON, 255 },
628         {  5,180, 46, 59, 26, 24,  6,  0,  1,"Slide on", BT_MOUSE_BUTTON, 255 },
629         {  6,180, 54, 59, 26,  5,  7,  1,  4,"Slide left", BT_MOUSE_BUTTON, 255 },
630         {  7,180, 62, 59, 26,  6,  8,  4, 26,"Slide right", BT_MOUSE_BUTTON, 255 },
631         {  8,180, 70, 59, 26,  7,  9, 26,  9,"Slide up", BT_MOUSE_BUTTON, 255 },
632         {  9,180, 78, 59, 26,  8, 10,  8,  2,"Slide down", BT_MOUSE_BUTTON, 255 },
633         { 10,180, 90, 59, 26,  9, 11,  2,  3,"Bank on", BT_MOUSE_BUTTON, 255 },
634         { 11,180, 98, 59, 26, 10, 12,  3, 12,"Bank left", BT_MOUSE_BUTTON, 255 },
635         { 12,180,106, 59, 26, 11, 28, 11, 25,"Bank right", BT_MOUSE_BUTTON, 255 },
636         { 13,103,138, 58, 26, 27, 15, 27, 14,"Pitch U/D", BT_MOUSE_AXIS, 255 },
637         { 14,103,138,106,  8, 23, 16, 13, 15,"Pitch U/D", BT_INVERT, 255 },
638         { 15,103,146, 58, 26, 13, 17, 14, 16,"Turn L/R", BT_MOUSE_AXIS, 255 },
639         { 16,103,146,106,  8, 14, 18, 15, 17,"Turn L/R", BT_INVERT, 255 },
640         { 17,103,154, 58, 26, 15, 19, 16, 18,"Slide L/R", BT_MOUSE_AXIS, 255 },
641         { 18,103,154,106,  8, 16, 20, 17, 19,"Slide L/R", BT_INVERT, 255 },
642         { 19,103,162, 58, 26, 17, 21, 18, 20,"Slide U/D", BT_MOUSE_AXIS, 255 },
643         { 20,103,162,106,  8, 18, 22, 19, 21,"Slide U/D", BT_INVERT, 255 },
644         { 21,103,170, 58, 26, 19, 23, 20, 22,"Bank L/R", BT_MOUSE_AXIS, 255 },
645         { 22,103,170,106,  8, 20, 24, 21, 23,"Bank L/R", BT_INVERT, 255 },
646         { 23,103,182, 58, 26, 21, 14, 22, 24,"throttle", BT_MOUSE_AXIS, 255 },
647         { 24,103,182,106,  8, 22,  5, 23, 28,"throttle", BT_INVERT, 255 },
648         { 25, 25,109, 85, 26,  3, 27, 12, 27,"REAR VIEW", BT_MOUSE_BUTTON, 255 },
649         { 26, 25, 70, 85, 26,  4,  2,  7,  8,"Drop Bomb", BT_MOUSE_BUTTON, 255 },
650         { 27, 25,117, 85, 26, 25, 13, 25, 13,"Afterburner", BT_MOUSE_BUTTON, 255 },
651 };
652
653 #endif
654
655 //added on 2/4/99 by Victor Rachels to add new keys system
656 ubyte default_kconfig_d2x_settings[MAX_D2X_CONTROLS] = {
657  0x2 ,0xff,0x3 ,0xff,0x4 ,0xff,0x5 ,0xff,0x6 ,0xff,0x7 ,0xff,0x8 ,0xff,0x9 ,
658  0xff,0xa ,0xff,0xb ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
659  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
660 //end this section addition - VR
661
662 void kc_drawitem( kc_item *item, int is_current );
663 void kc_change_key( kc_item * item );
664 void kc_change_joybutton( kc_item * item );
665 void kc_change_mousebutton( kc_item * item );
666 void kc_next_joyaxis(kc_item *item);  //added by WraithX on 11/22/00
667 void kc_change_joyaxis( kc_item * item );
668 void kc_change_mouseaxis( kc_item * item );
669 void kc_change_invert( kc_item * item );
670 void kconfig_read_fcs( int raw_axis );
671 void kconfig_set_fcs_button( int btn, int button );
672 void kconfig_read_external_controls( void );
673
674 // the following methods added by WraithX, 4/17/00
675 int isJoyRotationKey(int test_key)
676 {
677         if (test_key == kc_joystick[11].value ||
678             test_key == kc_joystick[12].value)
679         {
680                 return 1;
681         }// end if
682
683         // else...
684         return 0;
685 }// method isJoyRotationKey
686
687 int isMouseRotationKey(int test_key)
688 {
689         if (test_key == kc_mouse[11].value ||
690             test_key == kc_mouse[12].value)
691         {
692                 return 1;
693         }// end if
694
695         // else...
696         return 0;
697 }// method isMouseRotationKey
698
699 int isKeyboardRotationKey(int test_key)
700 {
701         if (test_key == kc_keyboard[0].value ||
702             test_key == kc_keyboard[1].value ||
703             test_key == kc_keyboard[2].value ||
704             test_key == kc_keyboard[3].value ||
705             test_key == kc_keyboard[4].value ||
706             test_key == kc_keyboard[5].value ||
707             test_key == kc_keyboard[6].value ||
708             test_key == kc_keyboard[7].value ||
709             test_key == kc_keyboard[20].value ||
710             test_key == kc_keyboard[21].value ||
711             test_key == kc_keyboard[22].value ||
712             test_key == kc_keyboard[23].value)
713         {
714                 return 1;
715         }// end if
716
717         // else...
718         return 0;
719 }// method isKeyboardRotationKey
720 // end addition - WraithX
721
722 int kconfig_is_axes_used(int axis)
723 {
724         int i;
725         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
726                 if (( kc_joystick[i].type == BT_JOY_AXIS ) && (kc_joystick[i].value == axis ))
727                         return 1;
728         }
729         return 0;
730 }
731
732 #ifdef TABLE_CREATION
733 int find_item_at( kc_item * items, int nitems, int x, int y )
734 {
735         int i;
736         
737         for (i=0; i<nitems; i++ )       {
738                 if ( ((items[i].x+items[i].w1)==x) && (items[i].y==y))
739                         return i;
740         }
741         return -1;
742 }
743
744 int find_next_item_up( kc_item * items, int nitems, int citem )
745 {
746         int x, y, i;
747
748         y = items[citem].y;
749         x = items[citem].x+items[citem].w1;
750         
751         do {    
752                 y--;
753                 if ( y < 0 ) {
754                         y = grd_curcanv->cv_bitmap.bm_h-1;
755                         x--;
756                         if ( x < 0 ) {
757                                 x = grd_curcanv->cv_bitmap.bm_w-1;
758                         }
759                 }
760                 i = find_item_at( items, nitems, x, y );
761         } while ( i < 0 );
762         
763         return i;
764 }
765
766 int find_next_item_down( kc_item * items, int nitems, int citem )
767 {
768         int x, y, i;
769
770         y = items[citem].y;
771         x = items[citem].x+items[citem].w1;
772         
773         do {    
774                 y++;
775                 if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
776                         y = 0;
777                         x++;
778                         if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
779                                 x = 0;
780                         }
781                 }
782                 i = find_item_at( items, nitems, x, y );
783         } while ( i < 0 );
784         
785         return i;
786 }
787
788 int find_next_item_right( kc_item * items, int nitems, int citem )
789 {
790         int x, y, i;
791
792         y = items[citem].y;
793         x = items[citem].x+items[citem].w1;
794         
795         do {    
796                 x++;
797                 if ( x > grd_curcanv->cv_bitmap.bm_w-1 ) {
798                         x = 0;
799                         y++;
800                         if ( y > grd_curcanv->cv_bitmap.bm_h-1 ) {
801                                 y = 0;
802                         }
803                 }
804                 i = find_item_at( items, nitems, x, y );
805         } while ( i < 0 );
806         
807         return i;
808 }
809
810 int find_next_item_left( kc_item * items, int nitems, int citem )
811 {
812         int x, y, i;
813
814         y = items[citem].y;
815         x = items[citem].x+items[citem].w1;
816         
817         do {    
818                 x--;
819                 if ( x < 0 ) {
820                         x = grd_curcanv->cv_bitmap.bm_w-1;
821                         y--;
822                         if ( y < 0 ) {
823                                 y = grd_curcanv->cv_bitmap.bm_h-1;
824                         }
825                 }
826                 i = find_item_at( items, nitems, x, y );
827         } while ( i < 0 );
828         
829         return i;
830 }
831 #endif
832
833 #ifdef NEWMENU_MOUSE
834 int get_item_height(kc_item *item)
835 {
836         int w, h, aw;
837         char btext[10];
838
839         if (item->value==255) {
840                 strcpy(btext, "");
841         } else {
842                 switch( item->type )    {
843                         case BT_KEY:
844                                 strncpy( btext, key_text[item->value], 10 ); break;
845                         case BT_MOUSE_BUTTON:
846 #ifndef MACINTOSH
847                                 strncpy( btext, Text_string[mousebutton_text[item->value]], 10); break;
848 #else
849                                 strncpy( btext, mousebutton_text[item->value], 10 ); break;
850 #endif
851                         case BT_MOUSE_AXIS:
852                                 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
853                         case BT_JOY_BUTTON:
854 #ifdef USE_LINUX_JOY
855                                 sprintf(btext, "J%d B%d", j_button[item->value].joydev, j_Get_joydev_button_number(item->value));
856 #elif defined(SDL_INPUT)
857                                 strncpy(btext, joybutton_text[item->value], 10);
858 #else
859                                 if ( joybutton_text[item->value] !=-1 )
860                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
861                                 else
862                                         sprintf( btext, "BTN%d", item->value );
863 #endif
864                                 break;
865                         case BT_JOY_AXIS:
866 #ifdef USE_LINUX_JOY
867                                 sprintf( btext, "J%d A%d", j_axis[item->value].joydev, j_Get_joydev_axis_number (item->value) );
868 #elif defined(SDL_INPUT)
869                                 strncpy(btext, joyaxis_text[item->value], 10);
870 #else
871                                 strncpy(btext, Text_string[joyaxis_text[item->value]], 10);
872 #endif
873                                 break;
874                         case BT_INVERT:
875                                 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
876                 }
877         }
878         gr_get_string_size(btext, &w, &h, &aw  );
879
880         return h;
881 }
882 #endif
883
884 void kconfig_sub(kc_item * items,int nitems, char * title)
885 {
886 WINDOS(
887         dd_grs_canvas * save_canvas,
888         grs_canvas * save_canvas
889 );
890         grs_font * save_font;
891         int old_keyd_repeat;
892 #ifdef NEWMENU_MOUSE
893         int mouse_state, omouse_state, mx, my, x1, x2, y1, y2;
894         int close_x, close_y, close_size;
895 #endif
896
897         int i,k,ocitem,citem;
898         int time_stopped = 0;
899 WIN(char *old_bg_pcx);
900
901 WIN(old_bg_pcx = _SCRContext.bkg_filename);
902 WIN(DEFINE_SCREEN(NULL));
903
904         All_items = items;
905         Num_items = nitems;
906
907         if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) )
908         {
909                 time_stopped = 1;
910                 stop_time();
911         }
912
913 //      if (Config_control_type == CONTROL_WINJOYSTICK) {
914 //              WINDOS(
915 //                      joydefsw_win_joyselect(title2); title = title2,
916 //                      Int3()
917 //              );                                                                                              // Get Samir...
918 //      }
919
920 WINDOS(
921         save_canvas = dd_grd_curcanv,
922         save_canvas = grd_curcanv
923 );
924
925
926 WINDOS(
927         dd_gr_set_current_canvas(NULL),
928         gr_set_current_canvas(NULL)
929 );              
930         save_font = grd_curcanv->cv_font;
931
932 #ifdef WINDOWS
933 KConfigPaint:
934 #endif
935         game_flush_inputs();
936         old_keyd_repeat = keyd_repeat;
937         keyd_repeat = 1;
938
939         //gr_clear_canvas( BM_XRGB(0,0,0) );
940
941         nm_draw_background(0, 0, grd_curcanv->cv_bitmap.bm_w - 1, grd_curcanv->cv_bitmap.bm_h - 1);
942    gr_palette_load (gr_palette);
943
944         grd_curcanv->cv_font = MEDIUM3_FONT;
945
946 WIN(DDGRLOCK(dd_grd_curcanv));  
947         {
948                 char * p;
949                 p = strchr( title, '\n' );
950                 if ( p ) *p = 32;
951                 gr_string( 0x8000, LHY(8), title );
952                 if ( p ) *p = '\n';
953         }
954
955
956 //      if ( items == kc_keyboard )     {
957 //              gr_string( 0x8000, 8, "Keyboard" );
958 //      } else if ( items == kc_joystick )      {
959 //              gr_string( 0x8000, 8, "Joysticks" );
960 //      } else if ( items == kc_mouse ) {
961 //              gr_string( 0x8000, 8, "Mouse" );
962 //      }
963
964 #ifdef NEWMENU_MOUSE
965         close_x = close_y = MenuHires?15:7;
966         close_size = MenuHires?10:5;
967         gr_setcolor( BM_XRGB(0, 0, 0) );
968         gr_rect(close_x, close_y, close_x + close_size, close_y + close_size);
969         gr_setcolor( BM_XRGB(21, 21, 21) );
970         gr_rect(close_x + LHX(1), close_y + LHX(1), close_x + close_size - LHX(1), close_y + close_size - LHX(1));
971 #endif
972
973         grd_curcanv->cv_font = GAME_FONT;
974         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
975
976         #ifndef MACINTOSH
977         gr_string( 0x8000, LHY(20), TXT_KCONFIG_STRING_1 );
978         #else
979         gr_string( 0x8000, LHY(20), "Enter changes, ctrl-d deletes, ctrl-r resets defaults, ESC exits");
980         #endif
981         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
982         if ( items == kc_keyboard )     {
983                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
984                 gr_setcolor( BM_XRGB(31,27,6) );
985                 
986                 gr_scanline( LHX(98), LHX(106), LHY(42) );
987                 gr_scanline( LHX(120), LHX(128), LHY(42) );
988                 gr_pixel( LHX(98), LHY(43) );                                           
989                 gr_pixel( LHX(98), LHY(44) );                                           
990                 gr_pixel( LHX(128), LHY(43) );                                          
991                 gr_pixel( LHX(128), LHY(44) );                                          
992                 
993                 gr_string( LHX(109), LHY(40), "OR" );
994
995                 gr_scanline( LHX(253), LHX(261), LHY(42) );
996                 gr_scanline( LHX(274), LHX(283), LHY(42) );
997                 gr_pixel( LHX(253), LHY(43) );                                          
998                 gr_pixel( LHX(253), LHY(44) );                                          
999                 gr_pixel( LHX(283), LHY(43) );                                          
1000                 gr_pixel( LHX(283), LHY(44) );                                          
1001
1002                 gr_string( LHX(264), LHY(40), "OR" );
1003
1004         } if ( items == kc_joystick )   {
1005                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1006                 gr_setcolor( BM_XRGB(31,27,6) );
1007                 gr_scanline( LHX(18), LHX(135), LHY(37) );
1008                 gr_scanline( LHX(181), LHX(294), LHY(37) );
1009                 gr_scanline( LHX(18), LHX(144), LHY(119+18) );
1010                 gr_scanline( LHX(174), LHX(294), LHY(119+18) );
1011                 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1012                 gr_string( 0x8000,LHY(117+18), TXT_AXES );
1013                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1014                 gr_string( LHX(81), LHY(137+8), TXT_AXIS );
1015                 gr_string( LHX(111), LHY(137+8), TXT_INVERT );
1016                 gr_string( LHX(222), LHY(137+8), TXT_AXIS );
1017                 gr_string( LHX(252), LHY(137+8), TXT_INVERT );
1018         } else if ( items == kc_mouse ) {
1019                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1020                 gr_setcolor( BM_XRGB(31,27,6) );
1021                 gr_scanline( LHX(18), LHX(135), LHY(37) );
1022                 gr_scanline( LHX(181), LHX(294), LHY(37) );
1023                 gr_scanline( LHX(18), LHX(144), LHY(119+5) );
1024                 gr_scanline( LHX(174), LHX(294), LHY(119+5) );
1025                 gr_string( 0x8000, LHY(35), TXT_BUTTONS );
1026                 gr_string( 0x8000,LHY(117+5), TXT_AXES );
1027                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1028                 gr_string( LHX(169), LHY(129), TXT_AXIS );
1029                 gr_string( LHX(199), LHY(129), TXT_INVERT );
1030         }
1031 #ifdef D2X_KEYS
1032         else if ( items == kc_d2x )
1033         {
1034                 gr_set_fontcolor( BM_XRGB(31,27,6), -1 );
1035                 gr_setcolor( BM_XRGB(31,27,6) );
1036
1037                 gr_string(LHX( 94), LHY(40), "KB");
1038                 gr_string(LHX(121), LHY(40), "JOY");
1039         }
1040 #endif
1041
1042 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1043
1044         for (i=0; i<nitems; i++ )       {
1045                 kc_drawitem( &items[i], 0 );
1046         }
1047
1048         citem = 0;
1049         kc_drawitem( &items[citem], 1 );
1050
1051         newmenu_show_cursor();
1052
1053 #ifdef NEWMENU_MOUSE
1054         mouse_state = omouse_state = 0;
1055 #endif
1056
1057         while(1)                {
1058         //      Windows addendum to allow for kconfig input.
1059         #ifdef WINDOWS
1060                 {
1061                         MSG msg;
1062
1063                         DoMessageStuff(&msg);
1064
1065                         if (_RedrawScreen) {
1066                                 _RedrawScreen = FALSE;
1067
1068                                 dd_gr_set_current_canvas(NULL); 
1069
1070                                 goto KConfigPaint;
1071                         }
1072
1073                         DDGRRESTORE;
1074                 }
1075         #endif
1076                 gr_update();
1077
1078                 //see if redbook song needs to be restarted
1079                 songs_check_redbook_repeat();
1080
1081                 k = key_inkey();
1082
1083 #ifdef NEWMENU_MOUSE
1084                 omouse_state = mouse_state;
1085                 mouse_state = mouse_button_state(0);
1086 #endif
1087
1088                 if ( !time_stopped ) {
1089                         #ifdef NETWORK
1090                         if (multi_menu_poll() == -1)
1091                                 k = -2;
1092                         #endif
1093                 }
1094                 ocitem = citem;
1095                 switch( k )     {
1096                 case KEY_BACKSP:
1097                         Int3();
1098                         break;
1099                 MAC(case KEY_COMMAND+KEY_SHIFTED+KEY_3:)
1100                 case KEY_PRINT_SCREEN:
1101                         save_screen_shot(0);
1102                         break;                                                  
1103                 case KEY_CTRLED+KEY_D:
1104                         items[citem].value = 255;
1105                         kc_drawitem( &items[citem], 1 );
1106                         break;
1107                 case KEY_CTRLED+KEY_R:  
1108                         if ( items==kc_keyboard )       {
1109                                 for (i=0; i<NUM_KEY_CONTROLS; i++ )             {
1110                                         items[i].value=default_kconfig_settings[0][i];
1111                                         kc_drawitem( &items[i], 0 );
1112                                 }
1113 #ifdef D2X_KEYS
1114                         } else if ( items==kc_d2x ) {
1115                                 for(i=0;i<NUM_D2X_CONTROLS;i++)
1116                                 {
1117                                         items[i].value=default_kconfig_d2x_settings[i];
1118                                         kc_drawitem( &items[i], 0 );
1119                                 }
1120 #endif
1121                         } else {
1122                                 #ifdef MACINTOSH
1123                           // hack for firebire and mousestick default controls since I made
1124                           // them the same control type -- dumb dumb dumb
1125                                 if (joy_have_firebird())
1126                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1127                                                 items[i].value = default_firebird_settings[i];
1128                                                 kc_drawitem( &items[i], 0 );
1129                                         }
1130                                 else if (joy_have_mousestick())
1131                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1132                                                 items[i].value = default_mousestick_settings[i];
1133                                                 kc_drawitem( &items[i], 0 );
1134                                         }
1135                                 else
1136                                 #endif  // note link to above else
1137                                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1138                                                 items[i].value = default_kconfig_settings[Config_control_type][i];
1139                                                 kc_drawitem( &items[i], 0 );
1140                                         }
1141                         }
1142                         kc_drawitem( &items[citem], 1 );
1143                         break;
1144                 case KEY_DELETE:
1145                         items[citem].value=255;
1146                         kc_drawitem( &items[citem], 1 );
1147                         break;
1148                 case KEY_UP:            
1149                 case KEY_PAD8:
1150 #ifdef TABLE_CREATION
1151                         if (items[citem].u==-1) items[citem].u=find_next_item_up( items,nitems, citem);
1152 #endif
1153                         citem = items[citem].u; 
1154                         break;
1155                 
1156                 case KEY_DOWN:  
1157                 case KEY_PAD2:
1158 #ifdef TABLE_CREATION
1159                         if (items[citem].d==-1) items[citem].d=find_next_item_down( items,nitems, citem);
1160 #endif
1161                         citem = items[citem].d; 
1162                         break;
1163                 case KEY_LEFT:  
1164                 case KEY_PAD4:
1165 #ifdef TABLE_CREATION
1166                         if (items[citem].l==-1) items[citem].l=find_next_item_left( items,nitems, citem);
1167 #endif
1168                         citem = items[citem].l; 
1169                         break;
1170                 case KEY_RIGHT:         
1171                 case KEY_PAD6:
1172 #ifdef TABLE_CREATION
1173                         if (items[citem].r==-1) items[citem].r=find_next_item_right( items,nitems, citem);
1174 #endif
1175                         citem = items[citem].r; 
1176                         break;
1177                 case KEY_ENTER: 
1178                 case KEY_PADENTER:      
1179                         switch( items[citem].type )     {
1180                         case BT_KEY:            kc_change_key( &items[citem] ); break;
1181                         case BT_MOUSE_BUTTON:   kc_change_mousebutton( &items[citem] ); break;
1182                         case BT_MOUSE_AXIS:     kc_change_mouseaxis( &items[citem] ); break;
1183                         case BT_JOY_BUTTON:     kc_change_joybutton( &items[citem] ); break;
1184                         case BT_JOY_AXIS:       kc_change_joyaxis( &items[citem] ); break;
1185                         case BT_INVERT:         kc_change_invert( &items[citem] ); break;
1186                         }
1187                         break;
1188                 //the following case added by WraithX on 11/22/00 to work around the weird joystick bug...
1189                 case KEY_SPACEBAR:
1190                         switch(items[citem].type)
1191                         {
1192                         case BT_JOY_AXIS:
1193                                 kc_next_joyaxis(&items[citem]);
1194                                 break;
1195                         }
1196                         break;
1197                 //end addition by WraithX
1198                 case -2:        
1199                 case KEY_ESC:
1200                         grd_curcanv->cv_font    = save_font;
1201
1202                 WIN(DEFINE_SCREEN(old_bg_pcx));
1203
1204                 WINDOS(
1205                         dd_gr_set_current_canvas(save_canvas),
1206                         gr_set_current_canvas( save_canvas )
1207                 );                      
1208                         keyd_repeat = old_keyd_repeat;
1209                         game_flush_inputs();
1210                         newmenu_hide_cursor();
1211                         if (time_stopped)
1212                                 start_time();
1213                         return;
1214 #ifdef TABLE_CREATION
1215                 case KEY_DEBUGGED+KEY_F12:      {
1216                         FILE * fp;
1217                         for (i=0; i<NUM_KEY_CONTROLS; i++ )     {
1218                                 kc_keyboard[i].u = find_next_item_up( kc_keyboard,NUM_KEY_CONTROLS, i);
1219                                 kc_keyboard[i].d = find_next_item_down( kc_keyboard,NUM_KEY_CONTROLS, i);
1220                                 kc_keyboard[i].l = find_next_item_left( kc_keyboard,NUM_KEY_CONTROLS, i);
1221                                 kc_keyboard[i].r = find_next_item_right( kc_keyboard,NUM_KEY_CONTROLS, i);
1222                         }
1223                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1224                                 kc_joystick[i].u = find_next_item_up( kc_joystick,NUM_OTHER_CONTROLS, i);
1225                                 kc_joystick[i].d = find_next_item_down( kc_joystick,NUM_OTHER_CONTROLS, i);
1226                                 kc_joystick[i].l = find_next_item_left( kc_joystick,NUM_OTHER_CONTROLS, i);
1227                                 kc_joystick[i].r = find_next_item_right( kc_joystick,NUM_OTHER_CONTROLS, i);
1228                         }
1229                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1230                                 kc_mouse[i].u = find_next_item_up( kc_mouse,NUM_OTHER_CONTROLS, i);
1231                                 kc_mouse[i].d = find_next_item_down( kc_mouse,NUM_OTHER_CONTROLS, i);
1232                                 kc_mouse[i].l = find_next_item_left( kc_mouse,NUM_OTHER_CONTROLS, i);
1233                                 kc_mouse[i].r = find_next_item_right( kc_mouse,NUM_OTHER_CONTROLS, i);
1234                         }
1235                         fp = fopen( "kconfig.cod", "wt" );
1236
1237                         fprintf( fp, "ubyte default_kconfig_settings[CONTROL_MAX_TYPES][MAX_CONTROLS] = {\n" );
1238                         for (i=0; i<CONTROL_MAX_TYPES; i++ )    {
1239                                 int j;
1240                                 fprintf( fp, "{0x%x", kconfig_settings[i][0] );
1241                                 for (j=1; j<MAX_CONTROLS; j++ )
1242                                         fprintf( fp, ",0x%x", kconfig_settings[i][j] );
1243                                 fprintf( fp, "},\n" );
1244                         }
1245                         fprintf( fp, "};\n" );
1246                 
1247                         fprintf( fp, "\nkc_item kc_keyboard[NUM_KEY_CONTROLS] = {\n" );
1248                         for (i=0; i<NUM_KEY_CONTROLS; i++ )     {
1249                                 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1250                                         kc_keyboard[i].id, kc_keyboard[i].x, kc_keyboard[i].y, kc_keyboard[i].w1, kc_keyboard[i].w2,
1251                                         kc_keyboard[i].u, kc_keyboard[i].d, kc_keyboard[i].l, kc_keyboard[i].r,
1252                                         34, kc_keyboard[i].text, 34, btype_text[kc_keyboard[i].type] );
1253                         }
1254                         fprintf( fp, "};" );
1255
1256                         fprintf( fp, "\nkc_item kc_joystick[NUM_OTHER_CONTROLS] = {\n" );
1257                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1258                                 if (kc_joystick[i].type == BT_JOY_BUTTON)
1259                                         fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1260                                                 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1261                                                 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1262                                                 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1263                 else
1264                                         fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1265                                                 kc_joystick[i].id, kc_joystick[i].x, kc_joystick[i].y, kc_joystick[i].w1, kc_joystick[i].w2,
1266                                                 kc_joystick[i].u, kc_joystick[i].d, kc_joystick[i].l, kc_joystick[i].r,
1267                                                 34, kc_joystick[i].text, 34, btype_text[kc_joystick[i].type] );
1268                         }
1269                         fprintf( fp, "};" );
1270
1271                         fprintf( fp, "\nkc_item kc_mouse[NUM_OTHER_CONTROLS] = {\n" );
1272                         for (i=0; i<NUM_OTHER_CONTROLS; i++ )   {
1273                                 fprintf( fp, "\t{ %2d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%c%s%c, %s, 255 },\n", 
1274                                         kc_mouse[i].id, kc_mouse[i].x, kc_mouse[i].y, kc_mouse[i].w1, kc_mouse[i].w2,
1275                                         kc_mouse[i].u, kc_mouse[i].d, kc_mouse[i].l, kc_mouse[i].r,
1276                                         34, kc_mouse[i].text, 34, btype_text[kc_mouse[i].type] );
1277                         }
1278                         fprintf( fp, "};" );
1279
1280                         fclose(fp);
1281
1282                         }
1283                         break;
1284 #endif
1285                 }
1286
1287 #ifdef NEWMENU_MOUSE
1288                 if ( (mouse_state && !omouse_state) || (mouse_state && omouse_state) ) {
1289                         int item_height;
1290                         
1291                         mouse_get_pos(&mx, &my);
1292                         for (i=0; i<nitems; i++ )       {
1293                                 item_height = get_item_height( &items[i] );
1294                                 x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[i].x) + LHX(items[i].w1);
1295                                 x2 = x1 + LHX(items[i].w2);
1296                                 y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[i].y);
1297                                 y2 = y1 + LHX(item_height);
1298                                 if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1299                                         citem = i;
1300                                         break;
1301                                 }
1302                         }
1303                 }
1304                 else if ( !mouse_state && omouse_state ) {
1305                         int item_height;
1306                         
1307                         mouse_get_pos(&mx, &my);
1308                         item_height = get_item_height( &items[citem] );
1309                         x1 = grd_curcanv->cv_bitmap.bm_x + LHX(items[citem].x) + LHX(items[citem].w1);
1310                         x2 = x1 + LHX(items[citem].w2);
1311                         y1 = grd_curcanv->cv_bitmap.bm_y + LHY(items[citem].y);
1312                         y2 = y1 + LHY(item_height);
1313                         if (((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2))) {
1314                                 newmenu_hide_cursor();
1315                                 switch( items[citem].type )     {
1316                                 case BT_KEY:                            kc_change_key( &items[citem] ); break;
1317                                 case BT_MOUSE_BUTTON:   kc_change_mousebutton( &items[citem] ); break;
1318                                 case BT_MOUSE_AXIS:             kc_change_mouseaxis( &items[citem] ); break;
1319                                 case BT_JOY_BUTTON:             kc_change_joybutton( &items[citem] ); break;
1320                                 case BT_JOY_AXIS:               kc_change_joyaxis( &items[citem] ); break;
1321                                 case BT_INVERT:                         kc_change_invert( &items[citem] ); break;
1322                                 }
1323                                 newmenu_show_cursor();
1324                         } else {
1325                                 x1 = grd_curcanv->cv_bitmap.bm_x + close_x + LHX(1);
1326                                 x2 = x1 + close_size - LHX(1);
1327                                 y1 = grd_curcanv->cv_bitmap.bm_y + close_y + LHX(1);
1328                                 y2 = y1 + close_size - LHX(1);
1329                                 if ( ((mx > x1) && (mx < x2)) && ((my > y1) && (my < y2)) ) {
1330                                         grd_curcanv->cv_font    = save_font;
1331                                         WINDOS(dd_gr_set_current_canvas( save_canvas ),
1332                                                         gr_set_current_canvas( save_canvas ));
1333                                         keyd_repeat = old_keyd_repeat;
1334                                         game_flush_inputs();
1335                                         newmenu_hide_cursor();
1336                                         if (time_stopped)
1337                                                 start_time();
1338                                         return;
1339                                 }
1340                         }
1341
1342                 }
1343 #endif // NEWMENU_MOUSE
1344
1345                 if (ocitem!=citem)      {
1346                         newmenu_hide_cursor();
1347                         kc_drawitem( &items[ocitem], 0 );
1348                         kc_drawitem( &items[citem], 1 );
1349                         newmenu_show_cursor();
1350                 }
1351         }
1352 }
1353
1354
1355 void kc_drawitem( kc_item *item, int is_current )
1356 {
1357         int x, w, h, aw;
1358         char btext[16];
1359 //      PA_DFX (pa_set_frontbuffer_current());
1360 WIN(DDGRLOCK(dd_grd_curcanv));
1361
1362         if (is_current)
1363                 gr_set_fontcolor( BM_XRGB(20,20,29), -1 );
1364         else
1365                 gr_set_fontcolor( BM_XRGB(15,15,24), -1 );
1366    gr_string( LHX(item->x), LHY(item->y), item->text );
1367 WIN(DDGRUNLOCK(dd_grd_curcanv));
1368
1369         if (item->value==255) {
1370                 strcpy( btext, "" );
1371         } else {
1372                 switch( item->type )    {
1373                         case BT_KEY:
1374                                 strncpy( btext, key_text[item->value], 10 ); break;
1375                         case BT_MOUSE_BUTTON:
1376                                 #ifndef MACINTOSH
1377                                 //strncpy( btext, Text_string[mousebutton_text[item->value]], 10 ); break;
1378                                 strncpy( btext, (item->value <= 3)?Text_string[mousebutton_text[item->value]]:mousebutton_textra[item->value-3], 10 ); break;
1379                                 #else
1380                                 strncpy( btext, mousebutton_text[item->value], 10 ); break;
1381                                 #endif
1382                         case BT_MOUSE_AXIS:
1383                                 strncpy( btext, Text_string[mouseaxis_text[item->value]], 10 ); break;
1384                         case BT_JOY_BUTTON:
1385 #ifdef USE_LINUX_JOY
1386                                 sprintf(btext, "J%d B%d", j_button[item->value].joydev, j_Get_joydev_button_number(item->value));
1387 #elif defined(SDL_INPUT)
1388                                 strncpy(btext, joybutton_text[item->value], 10);
1389 #else
1390 # ifndef MACINTOSH
1391 #  ifdef WINDOWS
1392                                 if (joybutton_text[item->value] != -1) 
1393                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1394                                 else 
1395                                         sprintf( btext, "BTN%2d", item->value+1 );
1396 #  else
1397                                 if ( joybutton_text[item->value] !=-1 )
1398                                         strncpy( btext, Text_string[ joybutton_text[item->value]  ], 10 );
1399                                 else
1400                                         sprintf( btext, "BTN%d", item->value );
1401 #  endif
1402 # else
1403                                 strncpy( btext, joy_btn_name( item->value ), 10);
1404                                 if (btext == NULL)
1405                                         sprintf( btext, "BTN%d", item->value );
1406 # endif
1407 #endif
1408                                 break;
1409                         case BT_JOY_AXIS:
1410 #ifdef USE_LINUX_JOY
1411                                 sprintf(btext, "J%d A%d", j_axis[item->value].joydev, j_Get_joydev_axis_number(item->value));
1412 #elif defined(SDL_INPUT)
1413                                 strncpy(btext, joyaxis_text[item->value], 10);
1414 #else
1415                                 strncpy(btext, Text_string[joyaxis_text[item->value]], 10);
1416 #endif
1417                                 break;
1418                         case BT_INVERT:
1419                                 strncpy( btext, Text_string[invert_text[item->value]], 10 ); break;
1420                 }
1421         }
1422         if (item->w1) {
1423         WIN(DDGRLOCK(dd_grd_curcanv));
1424                 gr_get_string_size(btext, &w, &h, &aw  );
1425
1426                 if (is_current)
1427                         gr_setcolor( BM_XRGB(21,0,24) );
1428                 else
1429                         gr_setcolor( BM_XRGB(16,0,19) );
1430                 gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1431                 
1432                 gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1433
1434                 x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1435         
1436                 gr_string( x, LHY(item->y), btext );
1437 //              PA_DFX (pa_set_backbuffer_current());
1438
1439         WIN(DDGRUNLOCK(dd_grd_curcanv));
1440         }
1441 }
1442
1443
1444 static int looper=0;
1445
1446 void kc_drawquestion( kc_item *item )
1447 {
1448         int c, x, w, h, aw;
1449
1450 WIN(DDGRLOCK(dd_grd_curcanv));  
1451   // PA_DFX (pa_set_frontbuffer_current());
1452
1453         gr_get_string_size("?", &w, &h, &aw  );
1454
1455         c = BM_XRGB(21,0,24);
1456
1457         //@@gr_setcolor( gr_fade_table[fades[looper]*256+c] );
1458         gr_setcolor(BM_XRGB(21*fades[looper]/31,0,24*fades[looper]/31));
1459         looper++;
1460         if (looper>63) looper=0;
1461
1462         gr_urect( LHX(item->w1+item->x), LHY(item->y-1), LHX(item->w1+item->x+item->w2), LHY(item->y)+h );
1463         
1464         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1465
1466         x = LHX(item->w1+item->x)+((LHX(item->w2)-w)/2);
1467    
1468         gr_string( x, LHY(item->y), "?" );
1469 //      PA_DFX (pa_set_backbuffer_current());
1470 WIN(DDGRUNLOCK(dd_grd_curcanv));
1471 gr_update();
1472 }
1473
1474 void kc_change_key( kc_item * item )
1475 {
1476         int i,n,f,k;
1477         ubyte keycode;
1478
1479 WIN(DDGRLOCK(dd_grd_curcanv));
1480         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1481         
1482         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_KEY );
1483 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1484
1485         game_flush_inputs();
1486         keycode=255;
1487         k=255;
1488         
1489         while( (k!=KEY_ESC) && (keycode==255) ) 
1490         {                               
1491         #ifdef WINDOWS
1492                 {
1493                         MSG msg;
1494
1495                         DoMessageStuff(&msg);
1496                         DDGRRESTORE;
1497                 
1498                 }
1499         #endif
1500
1501                 #ifdef NETWORK
1502                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1503                         multi_menu_poll();
1504                 #endif
1505 //              if ( Game_mode & GM_MULTI )
1506 //                      GameLoop( 0, 0 );                               // Continue
1507                 k = key_inkey();
1508                 timer_delay(f0_1/10);
1509                 kc_drawquestion( item );
1510         
1511                 for (i=0; i<256; i++ )  {
1512                         if (keyd_pressed[i] && (strlen(key_text[i])>0)) {
1513                                 f = 0;
1514                                 for (n=0; n<sizeof(system_keys); n++ )
1515                                         if ( system_keys[n] == i )
1516                                                 f=1;
1517                                 if (!f) 
1518                                         keycode=i;
1519                         }
1520                 }
1521         }
1522
1523         if (k!=KEY_ESC) {
1524                 for (i=0; i<Num_items; i++ )    {
1525                         n = item - All_items;
1526                         if ( (i!=n) && (All_items[i].type==BT_KEY) && (All_items[i].value==keycode) )           {
1527                                 All_items[i].value = 255;
1528                                 kc_drawitem( &All_items[i], 0 );
1529                         }
1530                 }
1531                 item->value = keycode;
1532         }
1533         kc_drawitem( item, 1 );
1534
1535 WIN(DDGRLOCK(dd_grd_curcanv));
1536         gr_set_fontcolor( BM_XRGB(28,28,28), BM_XRGB(0,0,0) );
1537 WIN(DDGRUNLOCK(dd_grd_curcanv));
1538
1539         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1540
1541         game_flush_inputs();
1542
1543 }
1544
1545 void kc_change_joybutton( kc_item * item )
1546 {
1547         int n,i,k;
1548         ubyte code;
1549
1550 WIN(DDGRLOCK(dd_grd_curcanv));
1551         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1552         
1553         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_JBUTTON );
1554 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1555
1556         game_flush_inputs();
1557         code=255;
1558         k=255;
1559         
1560         while( (k!=KEY_ESC) && (code==255))     
1561         {                               
1562         #ifdef WINDOWS
1563                 {
1564                         MSG msg;
1565                         DoMessageStuff(&msg);
1566                         DDGRRESTORE;
1567                 }
1568         #endif
1569
1570                 #ifdef NETWORK
1571                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1572                         multi_menu_poll();
1573                 #endif
1574 //              if ( Game_mode & GM_MULTI )
1575 //                      GameLoop( 0, 0 );                               // Continue
1576                 k = key_inkey();
1577                 timer_delay(f0_1/10);
1578
1579                 if (k == KEY_PRINT_SCREEN)
1580                         save_screen_shot(0);
1581
1582                 kc_drawquestion( item );
1583
1584                 WIN(code = joydefsw_do_button());
1585                 
1586 #ifdef MACINTOSH
1587                 code = joy_do_buttons();
1588 #endif
1589                 
1590 #if !defined(WINDOWS) && !defined(MACINTOSH)
1591                 if (Config_control_type==CONTROL_THRUSTMASTER_FCS)      {
1592                         int axis[4];
1593                         joystick_read_raw_axis( JOY_ALL_AXIS, axis );
1594                         kconfig_read_fcs( axis[3] );
1595                         if ( joy_get_button_state(7) ) code = 7;
1596                         if ( joy_get_button_state(11) ) code = 11;
1597                         if ( joy_get_button_state(15) ) code = 15;
1598                         if ( joy_get_button_state(19) ) code = 19;
1599                         for (i=0; i<4; i++ )    {
1600                                 if ( joy_get_button_state(i) )
1601                                         code = i;
1602                         }
1603                 } else if (Config_control_type==CONTROL_FLIGHTSTICK_PRO) {
1604                         for (i=4; i<20; i++ )   {
1605                                 if ( joy_get_button_state(i)  ) {
1606                                         code = i;
1607                                         mprintf(( 0, "JB: %d\n", code ));
1608                                 }
1609                         }
1610                 } else {
1611                         for (i = 0; i < JOY_MAX_BUTTONS; i++)
1612                         {
1613                                 if ( joy_get_button_state(i) )
1614                                         code = i;
1615                         }
1616                 }
1617 #endif
1618         }
1619         if (code!=255)  {
1620                 for (i=0; i<Num_items; i++ )    {
1621                         n = item - All_items;
1622                         if ( (i!=n) && (All_items[i].type==BT_JOY_BUTTON) && (All_items[i].value==code) ) {
1623                                 All_items[i].value = 255;
1624                                 kc_drawitem( &All_items[i], 0 );
1625                         }
1626                 }
1627                 item->value = code;
1628         }
1629         kc_drawitem( item, 1 );
1630         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1631         game_flush_inputs();
1632 }
1633
1634 void kc_change_mousebutton( kc_item * item )
1635 {
1636         int n,i,b,k;
1637         ubyte code;
1638
1639 WIN(DDGRLOCK(dd_grd_curcanv));
1640         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1641         
1642         gr_string( 0x8000, LHY(INFO_Y), TXT_PRESS_NEW_MBUTTON );
1643 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1644
1645
1646         game_flush_inputs();
1647         code=255;
1648         k=255;
1649         
1650         while( (k!=KEY_ESC) && (code==255))     
1651         {                               
1652         #ifdef WINDOWS
1653                 {
1654                         MSG msg;
1655                         DoMessageStuff(&msg);
1656                         DDGRRESTORE;
1657                 }
1658         #endif
1659
1660                 #ifdef NETWORK
1661                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1662                         multi_menu_poll();
1663                 #endif
1664 //              if ( Game_mode & GM_MULTI )
1665 //                      GameLoop( 0, 0 );                               // Continue
1666                 k = key_inkey();
1667                 timer_delay(f0_1/10);
1668
1669                 if (k == KEY_PRINT_SCREEN)
1670                         save_screen_shot(0);
1671
1672                 kc_drawquestion( item );
1673
1674                 b = mouse_get_btns();
1675                 for (i = 0; i < 16; i++ ) {
1676                         if ( b & (1<<i) )       
1677                                 code = i;
1678                 }
1679         }
1680         if (code!=255)  {
1681                 for (i=0; i<Num_items; i++ )    {
1682                         n = item - All_items;
1683                         if ( (i!=n) && (All_items[i].type==BT_MOUSE_BUTTON) && (All_items[i].value==code) )             {
1684                                 All_items[i].value = 255;
1685                                 kc_drawitem( &All_items[i], 0 );
1686                         }
1687                 }
1688                 item->value = code;
1689         }
1690         kc_drawitem( item, 1 );
1691         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1692         game_flush_inputs();
1693
1694 }
1695
1696
1697 // 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
1698 void kc_next_joyaxis(kc_item *item)
1699 {
1700         int n, i, k, max, tries;
1701         ubyte code = 0;
1702
1703         k = 255;
1704         n = 0;
1705         i = 0;
1706
1707         // I modelled this ifdef after the code in the kc_change_joyaxis method.
1708         // So, if somethin's not workin here, it might not be workin there either.
1709         max = JOY_MAX_AXES;
1710         tries = 1;
1711         code = (item->value + 1) % max;
1712
1713         if (code != 255)
1714         {
1715                 for (i = 0; i < Num_items; i++)
1716                 {
1717                         n = item - All_items;
1718                         if ((i != n) && (All_items[i].type == BT_JOY_AXIS) && (All_items[i].value == code))
1719                         {
1720                                 if (tries > max)
1721                                         return; // all axes allocated already
1722                                 i = -1; // -1 so the i++ will push back to 0
1723                                 code = (item->value + ++tries) % max; // try next axis
1724                         }//end if
1725                 }//end for
1726
1727                 item->value = code;
1728         }//end if
1729
1730         kc_drawitem(item, 1);
1731         nm_restore_background(0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h);
1732         game_flush_inputs();
1733
1734 }//method kc_next_joyaxis
1735 //end addition by WraithX
1736
1737
1738 void kc_change_joyaxis( kc_item * item )
1739 {
1740         int axis[JOY_MAX_AXES];
1741         int old_axis[JOY_MAX_AXES];
1742         int numaxis = joy_num_axes;
1743         int n,i,k;
1744         ubyte code;
1745
1746 WIN(DDGRLOCK(dd_grd_curcanv));
1747         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1748         
1749         gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_JOY_AXIS );
1750 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1751
1752         game_flush_inputs();
1753         code=255;
1754         k=255;
1755
1756         WINDOS(
1757                 joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, old_axis ),
1758                 joystick_read_raw_axis( JOY_ALL_AXIS, old_axis )
1759         );
1760
1761         while( (k!=KEY_ESC) && (code==255))     
1762         {                               
1763         #ifdef WINDOWS
1764                 {
1765                         MSG msg;
1766                         DoMessageStuff(&msg);
1767                         DDGRRESTORE;
1768                 }
1769         #endif
1770
1771                 #ifdef NETWORK
1772                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1773                         multi_menu_poll();
1774                 #endif
1775 //              if ( Game_mode & GM_MULTI )
1776 //                      GameLoop( 0, 0 );                               // Continue
1777                 k = key_inkey();
1778                 timer_delay(f0_1/10);
1779
1780                 if (k == KEY_PRINT_SCREEN)
1781                         save_screen_shot(0);
1782
1783                 kc_drawquestion( item );
1784
1785                 WINDOS(
1786                         joystick_read_raw_axis( JOY_ALL_AXIS+JOY_EXT_AXIS, axis ),
1787                         joystick_read_raw_axis( JOY_ALL_AXIS, axis )
1788                 );
1789                 
1790                 for (i=0; i<numaxis; i++ )      {
1791 #if defined (MACINTOSH)
1792                         if ( abs(axis[i]-old_axis[i])>100 )     {
1793 #elif defined(WINDOWS)
1794                         if ( abs(axis[i]-old_axis[i])>1024 )    {
1795 #else 
1796                         if ( abs(axis[i]-old_axis[i])>200 )     {
1797 #endif
1798                                 code = i;
1799                                 con_printf(CON_DEBUG, "Axis Movement detected: Axis %i\n", i);
1800                         }
1801                         //old_axis[i] = axis[i];
1802                 }
1803                 for (i=0; i<Num_items; i++ )    
1804                  {
1805                         n = item - All_items;
1806                         if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) 
1807                                 code = 255;
1808                  }
1809         
1810         }
1811         if (code!=255)  {
1812                 for (i=0; i<Num_items; i++ )    {
1813                         n = item - All_items;
1814                         if ( (i!=n) && (All_items[i].type==BT_JOY_AXIS) && (All_items[i].value==code) ) {
1815                                 All_items[i].value = 255;
1816                                 kc_drawitem( &All_items[i], 0 );
1817                         }
1818                 }
1819
1820                 item->value = code;                                      
1821         }
1822         kc_drawitem( item, 1 );
1823         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1824         game_flush_inputs();
1825
1826 }
1827
1828 void kc_change_mouseaxis( kc_item * item )
1829 {
1830         int i,n,k;
1831         ubyte code;
1832         int dx,dy;
1833 #ifdef SDL_INPUT
1834         int dz;
1835 #endif
1836
1837 WIN(DDGRLOCK(dd_grd_curcanv));
1838         gr_set_fontcolor( BM_XRGB(28,28,28), -1 );
1839         
1840         gr_string( 0x8000, LHY(INFO_Y), TXT_MOVE_NEW_MSE_AXIS );
1841 WIN(DDGRUNLOCK(dd_grd_curcanv));        
1842
1843         game_flush_inputs();
1844         code=255;
1845         k=255;
1846
1847         mouse_get_delta( &dx, &dy );
1848
1849         while( (k!=KEY_ESC) && (code==255))     
1850         {                               
1851         #ifdef WINDOWS
1852                 {
1853                         MSG msg;
1854                         DoMessageStuff(&msg);
1855                         DDGRRESTORE;
1856                 }
1857         #endif
1858
1859                 #ifdef NETWORK
1860                 if ((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence))
1861                         multi_menu_poll();
1862                 #endif
1863 //              if ( Game_mode & GM_MULTI )
1864 //                      GameLoop( 0, 0 );                               // Continue
1865                 k = key_inkey();
1866                 timer_delay(f0_1/10);
1867
1868                 if (k == KEY_PRINT_SCREEN)
1869                         save_screen_shot(0);
1870
1871                 kc_drawquestion( item );
1872
1873 #ifdef SDL_INPUT
1874                 mouse_get_delta_z( &dx, &dy, &dz );
1875 #else
1876                 mouse_get_delta( &dx, &dy );
1877 #endif
1878                 if ( abs(dx)>20 ) code = 0;
1879                 if ( abs(dy)>20 ) code = 1;
1880 #ifdef SDL_INPUT
1881                 if ( abs(dz)>20 ) code = 2;
1882 #endif
1883         }
1884         if (code!=255)  {
1885                 for (i=0; i<Num_items; i++ )    {
1886                         n = item - All_items;
1887                         if ( (i!=n) && (All_items[i].type==BT_MOUSE_AXIS) && (All_items[i].value==code) )               {
1888                                 All_items[i].value = 255;
1889                                 kc_drawitem( &All_items[i], 0 );
1890                         }
1891                 }
1892                 item->value = code;
1893         }
1894         kc_drawitem( item, 1 );
1895         nm_restore_background( 0, LHY(INFO_Y), LHX(310), grd_curcanv->cv_font->ft_h );
1896         game_flush_inputs();
1897
1898 }
1899
1900
1901 void kc_change_invert( kc_item * item )
1902 {
1903         game_flush_inputs();
1904
1905         if (item->value)
1906                 item->value = 0;
1907         else 
1908                 item->value = 1;
1909
1910         kc_drawitem( item, 1 );
1911
1912 }
1913
1914 #include "screens.h"
1915
1916 void kconfig(int n, char * title)
1917 {
1918         int i;
1919         grs_bitmap *save_bm;
1920
1921         set_screen_mode( SCREEN_MENU );
1922
1923         kc_set_controls();
1924
1925         //save screen
1926         WIN(mouse_set_mode(0));
1927         WIN(dd_gr_set_current_canvas(NULL));
1928         
1929 #if defined(POLY_ACC)
1930         save_bm = gr_create_bitmap2( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h, grd_curcanv->cv_bitmap.bm_type, NULL );
1931 #else
1932         save_bm = gr_create_bitmap( grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_h );
1933 #endif
1934         Assert( save_bm != NULL );
1935         
1936         WIN(DDGRLOCK(dd_grd_curcanv));
1937                 gr_bm_bitblt(grd_curcanv->cv_bitmap.bm_w, grd_curcanv->cv_bitmap.bm_w, 
1938                                                  0, 0, 0, 0, &grd_curcanv->cv_bitmap, save_bm );
1939         WIN(DDGRUNLOCK(dd_grd_curcanv));
1940
1941         switch(n)       {
1942         case 0:kconfig_sub( kc_keyboard, NUM_KEY_CONTROLS, title );break;
1943         case 1:kconfig_sub( kc_joystick, NUM_OTHER_CONTROLS, title );break;
1944         case 2:kconfig_sub( kc_mouse, NUM_OTHER_CONTROLS, title ); break;
1945         case 3:kconfig_sub( kc_superjoy, NUM_OTHER_CONTROLS, title); break;
1946 #ifdef D2X_KEYS
1947         //added on 2/4/99 by Victor Rachels for new keys menu
1948         case 4:kconfig_sub( kc_d2x, NUM_D2X_CONTROLS, title ); break;
1949         //end this section addition - VR
1950 #endif
1951         default:
1952                 Int3();
1953                 return;
1954         }
1955
1956         //restore screen
1957         WIN(mouse_set_mode(1));
1958         WIN(dd_gr_set_current_canvas(NULL));
1959         WIN(DDGRLOCK(dd_grd_curcanv));
1960                 gr_bitmap(0, 0, save_bm);
1961         WIN(DDGRUNLOCK(dd_grd_curcanv));
1962         gr_free_bitmap(save_bm);
1963
1964 #if 0 // set_screen_mode always calls this later... right?
1965         reset_cockpit();                //force cockpit redraw next time
1966 #endif
1967
1968         // Update save values...
1969         
1970         for (i=0; i<NUM_KEY_CONTROLS; i++ )     
1971                 kconfig_settings[0][i] = kc_keyboard[i].value;
1972
1973         if ( (Config_control_type>0) && (Config_control_type<5)) { 
1974                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
1975                         kconfig_settings[Config_control_type][i] = kc_joystick[i].value;
1976         } else if (Config_control_type>4 && Config_control_type<CONTROL_WINJOYSTICK) {
1977                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
1978                         kconfig_settings[Config_control_type][i] = kc_mouse[i].value;
1979         }
1980         else if (Config_control_type == CONTROL_WINJOYSTICK) {
1981                 for (i=0; i<NUM_OTHER_CONTROLS; i++ )   
1982                         kconfig_settings[Config_control_type][i] = kc_superjoy[i].value;
1983         }
1984
1985 #ifdef D2X_KEYS
1986         for (i=0; i<NUM_D2X_CONTROLS; i++)
1987                 kconfig_d2x_settings[i] = kc_d2x[i].value;
1988 #endif
1989 }
1990
1991
1992 void kconfig_read_fcs( int raw_axis )
1993 {
1994         int raw_button, button, axis_min[4], axis_center[4], axis_max[4];
1995
1996         if (Config_control_type!=CONTROL_THRUSTMASTER_FCS) return;
1997
1998         joy_get_cal_vals(axis_min, axis_center, axis_max);
1999
2000         if ( axis_max[3] > 1 )
2001                 raw_button = (raw_axis*100)/axis_max[3];
2002         else
2003                 raw_button = 0;
2004
2005         if ( raw_button > 88 )
2006                 button = 0;
2007         else if ( raw_button > 63 )
2008                 button = 7;
2009         else if ( raw_button > 39 )
2010                 button = 11;
2011         else if ( raw_button > 15 )
2012                 button = 15;
2013         else    
2014                 button = 19;
2015
2016         kconfig_set_fcs_button( 19, button );
2017         kconfig_set_fcs_button( 15, button );
2018         kconfig_set_fcs_button( 11, button );
2019         kconfig_set_fcs_button( 7, button );
2020 }
2021                 
2022
2023 void kconfig_set_fcs_button( int btn, int button )
2024 {
2025         int state,time_down,upcount,downcount;
2026         state = time_down = upcount = downcount = 0;
2027
2028         if ( joy_get_button_state(btn) ) {
2029                 if ( btn==button )      {
2030                         state = 1;
2031                         time_down = FrameTime;
2032                 } else {
2033                         upcount=1;
2034                 }
2035         } else {
2036                 if ( btn==button )      {
2037                         state = 1;
2038                         time_down = FrameTime;
2039                         downcount=1;
2040                 } else {
2041                         upcount=1;
2042                 }
2043         }                               
2044                         
2045         joy_set_btn_values( btn, state, time_down, downcount, upcount );
2046                                         
2047 }
2048
2049
2050
2051 fix Last_angles_p = 0;
2052 fix Last_angles_b = 0;
2053 fix Last_angles_h = 0;
2054 ubyte Last_angles_read = 0;
2055
2056 extern int                      VR_sensitivity;
2057                                                 
2058 int VR_sense_range[3] = { 25, 50, 75 };
2059
2060 #if 0 //ndef MACINTOSH
2061 read_head_tracker()
2062 {
2063 #ifndef WINDOWS
2064
2065         fix yaw, pitch, roll;
2066         int buttons;
2067
2068 //------ read vfx1 helmet --------
2069         if (vfx1_installed) {
2070                 vfx_get_data(&yaw,&pitch,&roll,&buttons);
2071         } else if (iglasses_headset_installed)  {
2072                 iglasses_read_headset( &yaw, &pitch, &roll );
2073         } else if (Victor_headset_installed)   {
2074                 victor_read_headset_filtered( &yaw, &pitch, &roll );
2075         } else {
2076                 return;
2077         }
2078
2079         Use_player_head_angles = 0;
2080         if ( Last_angles_read ) {
2081                 fix yaw1 = yaw;
2082                 
2083                 yaw1 = yaw;
2084                 if ( (Last_angles_h < (F1_0/4) ) && (yaw > ((F1_0*3)/4) ) )     
2085                         yaw1 -= F1_0;
2086                 else if ( (yaw < (F1_0/4) ) && (Last_angles_h > ((F1_0*3)/4) ) )        
2087                         yaw1 += F1_0;
2088         
2089                 Controls.pitch_time     += fixmul((pitch- Last_angles_p)*VR_sense_range[VR_sensitivity],FrameTime);
2090                 Controls.heading_time+= fixmul((yaw1 -  Last_angles_h)*VR_sense_range[VR_sensitivity],FrameTime);
2091                 Controls.bank_time      += fixmul((roll - Last_angles_b)*VR_sense_range[VR_sensitivity],FrameTime);
2092         }
2093         Last_angles_read = 1;
2094         Last_angles_p = pitch;
2095         Last_angles_h = yaw;
2096         Last_angles_b = roll;
2097 #endif
2098 }
2099 #endif
2100
2101 #define PH_SCALE        8
2102
2103 #ifndef __MSDOS__ // WINDOWS
2104 #define JOYSTICK_READ_TIME      (F1_0/40)               //      Read joystick at 40 Hz.
2105 #else
2106 #define JOYSTICK_READ_TIME      (F1_0/10)               //      Read joystick at 10 Hz.
2107 #endif
2108
2109 fix     LastReadTime = 0;
2110
2111 fix     joy_axis[JOY_MAX_AXES];
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         int raw_joy_axis[JOY_MAX_AXES];
2913         int mouse_buttons;
2914         fix k0, k1, k2, k3, kp;
2915         fix k4, k5, k6, k7, kh;
2916         ubyte channel_masks;
2917         int use_mouse, use_joystick;
2918         int speed_factor=1;
2919
2920         mouse_buttons=0;
2921         use_mouse=0;
2922
2923         if (Game_turbo_mode)
2924                 speed_factor = 2;
2925         
2926         {
2927                 fix temp = Controls.heading_time;
2928                 fix temp1 = Controls.pitch_time;
2929                 memset( &Controls, 0, sizeof(control_info) );
2930                 Controls.heading_time = temp;
2931                 Controls.pitch_time = temp1;
2932         }
2933         slide_on = 0;
2934         bank_on = 0;
2935
2936         ctime = timer_get_fixed_seconds();
2937
2938         //---------  Read Joystick -----------
2939 #ifndef MACINTOSH
2940         if ( (LastReadTime + JOYSTICK_READ_TIME > ctime) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) ) {
2941 # ifndef __MSDOS__
2942                 if ((ctime < 0) && (LastReadTime >= 0))
2943 # else
2944                 if ((ctime < 0) && (LastReadTime > 0))
2945 # endif
2946                         LastReadTime = ctime;
2947                 use_joystick=1;
2948         } else if ((Config_control_type>0) && (Config_control_type<5) ) {
2949                 LastReadTime = ctime;
2950                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
2951
2952                 for (i = 0; i < joy_num_axes; i++)
2953                 {
2954 #ifndef SDL_INPUT
2955                         if (channel_masks&(1<<i))       {
2956 #endif
2957                                 int joy_null_value = 10;
2958
2959                                 if ( (i==3) && (Config_control_type==CONTROL_THRUSTMASTER_FCS) )        {
2960                                         kconfig_read_fcs( raw_joy_axis[i] );
2961                                 } else {
2962                                         raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
2963         
2964                                         if (kc_joystick[23].value==i)           // If this is the throttle
2965                                                 joy_null_value = 20;            // Then use a larger dead-zone
2966         
2967                                         if (raw_joy_axis[i] > joy_null_value) 
2968                                           raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
2969                                         else if (raw_joy_axis[i] < -joy_null_value)
2970                                           raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
2971                                         else
2972                                           raw_joy_axis[i] = 0;
2973                                         joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
2974                                 }
2975 #ifndef SDL_INPUT
2976                         } else {
2977                                 joy_axis[i] = 0;
2978                         }
2979 #endif
2980                 }       
2981                 use_joystick=1;
2982         } else {
2983                 for (i = 0; i < joy_num_axes; i++)
2984                         joy_axis[i] = 0;
2985                 use_joystick=0;
2986         }
2987 #else   // MACINTOSH
2988         //---------  Read Joystick -----------
2989         if ((Config_control_type>0) && (Config_control_type<5) ) {
2990                 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
2991                 for (i=0; i<4; i++ )    {
2992                         if (channel_masks&(1<<i))       {
2993                                 int joy_null_value = 10;
2994
2995                                 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
2996
2997                                 if (kc_joystick[23].value==i)           // If this is the throttle
2998                                         joy_null_value = 20;                            // Then use a larger dead-zone
2999
3000                                 if (raw_joy_axis[i] > joy_null_value) 
3001                                         raw_joy_axis[i] = ((raw_joy_axis[i]-joy_null_value)*128)/(128-joy_null_value);
3002                                 else if (raw_joy_axis[i] < -joy_null_value)
3003                                         raw_joy_axis[i] = ((raw_joy_axis[i]+joy_null_value)*128)/(128-joy_null_value);
3004                                 else
3005                                         raw_joy_axis[i] = 0;
3006                                 joy_axis[i]     = (raw_joy_axis[i]*FrameTime)/128;      
3007                         } else {
3008                                 joy_axis[i] = 0;
3009                         }
3010                 }       
3011                 use_joystick=1;
3012         } else {
3013                 for (i=0; i<4; i++ )
3014                         joy_axis[i] = 0;
3015                 use_joystick=0;
3016         }
3017 #endif          // ifndef MACINTOSH
3018
3019         if (Config_control_type==5 && !CybermouseActive) {
3020                 //---------  Read Mouse -----------
3021 #ifdef SDL_INPUT
3022                 mouse_get_delta_z( &dx, &dy, &dz );
3023 #else
3024                 mouse_get_delta( &dx, &dy );
3025 #endif
3026                 mouse_axis[0] = (dx*FrameTime)/35;
3027                 mouse_axis[1] = (dy*FrameTime)/25;
3028 #ifdef SDL_INPUT
3029                 mouse_axis[2] = (dz*FrameTime);
3030 #endif
3031                 mouse_buttons = mouse_get_btns();
3032                 //mprintf(( 0, "Mouse %d,%d b:%d, 0x%x\n", mouse_axis[0], mouse_axis[1], mouse_buttons, FrameTime ));
3033                 use_mouse=1;
3034         } else if (Config_control_type==6 && !CybermouseActive) {
3035                 //---------  Read Cyberman -----------
3036                 mouse_get_cyberman_pos(&idx,&idy );
3037                 mouse_axis[0] = (idx*FrameTime)/128;
3038                 mouse_axis[1] = (idy*FrameTime)/128;
3039                 mouse_buttons = mouse_get_btns();
3040                 use_mouse=1;
3041         } else if (CybermouseActive) {
3042 //              ReadOWL (kc_external_control);
3043 //              CybermouseAdjust();
3044         } else {
3045                 mouse_axis[0] = 0;
3046                 mouse_axis[1] = 0;
3047                 mouse_buttons = 0;
3048                 use_mouse=0;
3049         }
3050
3051 #ifdef D2X_KEYS
3052         //added on 2/4/99 by Victor Rachels for d1x keys
3053         //--------- Read primary weapon select -------------
3054         //the following "if" added by WraithX to stop deadies from switchin weapons, 4/14/00
3055         if (!Player_is_dead)
3056         {
3057                 {
3058                         int d2x_joystick_state[10];
3059
3060                         for(i=0;i<10;i++)
3061                                 d2x_joystick_state[i] = joy_get_button_state(kc_d2x[i*2+1].value);
3062
3063
3064                         //----------------Weapon 1----------------
3065                         if(key_down_count(kc_d2x[0].value) ||
3066                            (joy_get_button_state(kc_d2x[1].value) &&
3067                                 (d2x_joystick_state[0]!=d2x_joystick_ostate[0]) ) )
3068                         {
3069                                 //int i, valu=0;
3070                                 do_weapon_select(0,0);
3071                                 /*
3072                                 for(i=MAX_PRIMARY_WEAPONS;i<MAX_PRIMARY_WEAPONS+NEWPRIMS;i++)
3073                                         if(primary_order[i]>primary_order[valu]&&player_has_weapon(i,0))
3074                                                 valu = i;
3075                                 LaserPowSelected = valu;
3076                                 */
3077                         }
3078                         //----------------Weapon 2----------------
3079                         if(key_down_count(kc_d2x[2].value) ||
3080                            (joy_get_button_state(kc_d2x[3].value) &&
3081                                 (d2x_joystick_state[1]!=d2x_joystick_ostate[1]) ) )
3082                                 do_weapon_select(1,0);
3083                         //----------------Weapon 3----------------
3084                         if(key_down_count(kc_d2x[4].value) ||
3085                            (joy_get_button_state(kc_d2x[5].value) &&
3086                                 (d2x_joystick_state[2]!=d2x_joystick_ostate[2]) ) )
3087                                 do_weapon_select(2,0);
3088                         //----------------Weapon 4----------------
3089                         if(key_down_count(kc_d2x[6].value) ||
3090                            (joy_get_button_state(kc_d2x[7].value) &&
3091                                 (d2x_joystick_state[3]!=d2x_joystick_ostate[3]) ) )
3092                                 do_weapon_select(3,0);
3093                         //----------------Weapon 5----------------
3094                         if(key_down_count(kc_d2x[8].value) ||
3095                            (joy_get_button_state(kc_d2x[9].value) &&
3096                                 (d2x_joystick_state[4]!=d2x_joystick_ostate[4]) ) )
3097                                 do_weapon_select(4,0);
3098  
3099                         //--------- Read secondary weapon select ----------
3100                         //----------------Weapon 6----------------
3101                         if(key_down_count(kc_d2x[10].value) ||
3102                            (joy_get_button_state(kc_d2x[11].value) &&
3103                                 (d2x_joystick_state[5]!=d2x_joystick_ostate[5]) ) )
3104                                 do_weapon_select(0,1);
3105                         //----------------Weapon 7----------------
3106                         if(key_down_count(kc_d2x[12].value) ||
3107                            (joy_get_button_state(kc_d2x[13].value) &&
3108                                 (d2x_joystick_state[6]!=d2x_joystick_ostate[6]) ) )
3109                                 do_weapon_select(1,1);
3110                         //----------------Weapon 8----------------
3111                         if(key_down_count(kc_d2x[14].value) ||
3112                            (joy_get_button_state(kc_d2x[15].value) &&
3113                                 (d2x_joystick_state[7]!=d2x_joystick_ostate[7]) ) )
3114                                 do_weapon_select(2,1);
3115                         //----------------Weapon 9----------------
3116                         if(key_down_count(kc_d2x[16].value) ||
3117                            (joy_get_button_state(kc_d2x[17].value) &&
3118                                 (d2x_joystick_state[8]!=d2x_joystick_ostate[8]) ) )
3119                                 do_weapon_select(3,1);
3120                         //----------------Weapon 0----------------
3121                         if(key_down_count(kc_d2x[18].value) ||
3122                            (joy_get_button_state(kc_d2x[19].value) &&
3123                                 (d2x_joystick_state[9]!=d2x_joystick_ostate[9]) ) )
3124                                 do_weapon_select(4,1);
3125                         memcpy(d2x_joystick_ostate,d2x_joystick_state,10*sizeof(int));
3126                 }
3127                 //end this section addition - VR
3128
3129
3130         }//end "if (!Player_is_dead)" - WraithX
3131 #endif
3132
3133
3134 //------------- Read slide_on -------------
3135         
3136         // From keyboard...
3137         if ( kc_keyboard[8].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[8].value ];
3138         if ( kc_keyboard[9].value < 255 ) slide_on |= keyd_pressed[ kc_keyboard[9].value ];
3139         // From joystick...
3140         if ((use_joystick)&&(kc_joystick[5].value<255)) slide_on |= joy_get_button_state( kc_joystick[5].value );
3141         // From mouse...
3142         if ((use_mouse)&&(kc_mouse[5].value<255)) slide_on |= mouse_buttons & (1<<kc_mouse[5].value);
3143
3144 //------------- Read bank_on ---------------
3145
3146         // From keyboard...
3147         if ( kc_keyboard[18].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[18].value ];
3148         if ( kc_keyboard[19].value < 255 ) bank_on |= keyd_pressed[ kc_keyboard[19].value ];
3149         // From joystick...
3150         if ( (use_joystick)&&(kc_joystick[10].value < 255 )) bank_on |= joy_get_button_state( kc_joystick[10].value );
3151         // From mouse...
3152         if ( (use_mouse)&&(kc_mouse[10].value < 255 )) bank_on |= mouse_buttons & (1<<kc_mouse[10].value);
3153
3154 //------------ Read pitch_time -----------
3155         if ( !slide_on )        {
3156                 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3157                 kp = 0;
3158                 k0 = speed_factor*key_down_time( kc_keyboard[0].value )/2;      // Divide by two since we want pitch to go slower
3159                 k1 = speed_factor*key_down_time( kc_keyboard[1].value )/2;
3160                 k2 = speed_factor*key_down_time( kc_keyboard[2].value )/2;
3161                 k3 = speed_factor*key_down_time( kc_keyboard[3].value )/2;
3162
3163                 // From keyboard...
3164                 if ( kc_keyboard[0].value < 255 ) kp += k0/PH_SCALE;
3165                 if ( kc_keyboard[1].value < 255 ) kp += k1/PH_SCALE;
3166                 if ( kc_keyboard[2].value < 255 ) kp -= k2/PH_SCALE;
3167                 if ( kc_keyboard[3].value < 255 ) kp -= k3/PH_SCALE;
3168
3169                 // From Cyberman...
3170                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3171                         kp += mouse_button_down_time(MB_PITCH_FORWARD)/(PH_SCALE*2);
3172                         kp -= mouse_button_down_time(MB_PITCH_BACKWARD)/(PH_SCALE*2);
3173                 }
3174         
3175                 if (kp == 0)
3176                         Controls.pitch_time = 0;
3177                 else if (kp > 0) {
3178                         if (Controls.pitch_time < 0)
3179                                 Controls.pitch_time = 0;
3180                 } else // kp < 0
3181                         if (Controls.pitch_time > 0)
3182                                 Controls.pitch_time = 0;
3183                 Controls.pitch_time += kp;
3184         
3185                 // From joystick...
3186                 if ( (use_joystick)&&(kc_joystick[13].value < 255 ))    {
3187                         if ( !kc_joystick[14].value )           // If not inverted...
3188                                 Controls.pitch_time -= (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3189                         else
3190                                 Controls.pitch_time += (joy_axis[kc_joystick[13].value]*Config_joystick_sensitivity)/8;
3191                 }
3192         
3193                 // From mouse...
3194                 //mprintf(( 0, "UM: %d, PV: %d\n", use_mouse, kc_mouse[13].value ));
3195                 if ( (use_mouse)&&(kc_mouse[13].value < 255) )  {
3196                         if ( !kc_mouse[14].value )              // If not inverted...
3197                                 Controls.pitch_time -= (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3198                         else
3199                                 Controls.pitch_time += (mouse_axis[kc_mouse[13].value]*Config_joystick_sensitivity)/8;
3200                 }
3201         } else {
3202                 Controls.pitch_time = 0;
3203         }
3204
3205
3206 // the following "if" added by WraithX, 4/14/00
3207 // done so that dead players can't move
3208 if (!Player_is_dead)
3209 {
3210 //----------- Read vertical_thrust_time -----------------
3211
3212         if ( slide_on ) {
3213                 k0 = speed_factor*key_down_time( kc_keyboard[0].value );
3214                 k1 = speed_factor*key_down_time( kc_keyboard[1].value );
3215                 k2 = speed_factor*key_down_time( kc_keyboard[2].value );
3216                 k3 = speed_factor*key_down_time( kc_keyboard[3].value );
3217
3218                 // From keyboard...
3219                 if ( kc_keyboard[0].value < 255 ) Controls.vertical_thrust_time += k0;
3220                 if ( kc_keyboard[1].value < 255 ) Controls.vertical_thrust_time += k1;
3221                 if ( kc_keyboard[2].value < 255 ) Controls.vertical_thrust_time -= k2;
3222                 if ( kc_keyboard[3].value < 255 ) Controls.vertical_thrust_time -= k3;
3223
3224                 // From Cyberman...
3225                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3226                         Controls.vertical_thrust_time -= mouse_button_down_time(MB_PITCH_FORWARD);
3227                         Controls.vertical_thrust_time += mouse_button_down_time(MB_PITCH_BACKWARD);
3228                 }
3229         
3230                 // From joystick...
3231                 if ((use_joystick)&&( kc_joystick[13].value < 255 ))    {
3232                         if ( !kc_joystick[14].value )           // If not inverted...
3233                                 Controls.vertical_thrust_time += joy_axis[kc_joystick[13].value];
3234                         else
3235                                 Controls.vertical_thrust_time -= joy_axis[kc_joystick[13].value];
3236                 }
3237         
3238                 // From mouse...
3239                 if ( (use_mouse)&&(kc_mouse[13].value < 255 ))  {
3240                         if ( !kc_mouse[14].value )              // If not inverted...
3241                                 Controls.vertical_thrust_time -= mouse_axis[kc_mouse[13].value];
3242                         else
3243                                 Controls.vertical_thrust_time += mouse_axis[kc_mouse[13].value];
3244                 }
3245         }
3246
3247         // From keyboard...
3248         if ( kc_keyboard[14].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[14].value );
3249         if ( kc_keyboard[15].value < 255 ) Controls.vertical_thrust_time += speed_factor*key_down_time( kc_keyboard[15].value );
3250         if ( kc_keyboard[16].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[16].value );
3251         if ( kc_keyboard[17].value < 255 ) Controls.vertical_thrust_time -= speed_factor*key_down_time( kc_keyboard[17].value );
3252         
3253         // From joystick...
3254         if ((use_joystick)&&( kc_joystick[19].value < 255 ))    {
3255                 if ( !kc_joystick[20].value )           // If not inverted...
3256                         Controls.vertical_thrust_time += joy_axis[kc_joystick[19].value];
3257                 else
3258                         Controls.vertical_thrust_time -= joy_axis[kc_joystick[19].value];
3259         }
3260
3261         // From joystick buttons
3262         if ( (use_joystick)&&(kc_joystick[8].value < 255 )) Controls.vertical_thrust_time += joy_get_button_down_time( kc_joystick[8].value );
3263         if ( (use_joystick)&&(kc_joystick[9].value < 255 )) Controls.vertical_thrust_time -= joy_get_button_down_time( kc_joystick[9].value );
3264
3265         // From mouse buttons
3266         if ( (use_mouse)&&(kc_mouse[8].value < 255 )) Controls.vertical_thrust_time += mouse_button_down_time( kc_mouse[8].value );
3267         if ( (use_mouse)&&(kc_mouse[9].value < 255 )) Controls.vertical_thrust_time -= mouse_button_down_time( kc_mouse[9].value );
3268
3269         // From mouse...
3270         if ( (use_mouse)&&(kc_mouse[19].value < 255 ))  {
3271                 if ( !kc_mouse[20].value )              // If not inverted...
3272                         Controls.vertical_thrust_time += mouse_axis[kc_mouse[19].value];
3273                 else
3274                         Controls.vertical_thrust_time -= mouse_axis[kc_mouse[19].value];
3275         }
3276
3277         // From Cyberman...
3278         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3279                 Controls.vertical_thrust_time += mouse_button_down_time(MB_Z_UP)/2;
3280                 Controls.vertical_thrust_time -= mouse_button_down_time(MB_Z_DOWN)/2;
3281         }
3282 }// end "if" added by WraithX
3283
3284 //---------- Read heading_time -----------
3285
3286         if (!slide_on && !bank_on)      {
3287                 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
3288                 kh = 0;
3289                 k4 = speed_factor*key_down_time( kc_keyboard[4].value );
3290                 k5 = speed_factor*key_down_time( kc_keyboard[5].value );
3291                 k6 = speed_factor*key_down_time( kc_keyboard[6].value );
3292                 k7 = speed_factor*key_down_time( kc_keyboard[7].value );
3293
3294                 // From keyboard...
3295                 if ( kc_keyboard[4].value < 255 ) kh -= k4/PH_SCALE;
3296                 if ( kc_keyboard[5].value < 255 ) kh -= k5/PH_SCALE;
3297                 if ( kc_keyboard[6].value < 255 ) kh += k6/PH_SCALE;
3298                 if ( kc_keyboard[7].value < 255 ) kh += k7/PH_SCALE;
3299
3300                 // From Cyberman...
3301                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3302                         kh -= mouse_button_down_time(MB_HEAD_LEFT)/PH_SCALE;
3303                         kh += mouse_button_down_time(MB_HEAD_RIGHT)/PH_SCALE;
3304                 }
3305         
3306                 if (kh == 0)
3307                         Controls.heading_time = 0;
3308                 else if (kh > 0) {
3309                         if (Controls.heading_time < 0)
3310                                 Controls.heading_time = 0;
3311                 } else // kh < 0
3312                         if (Controls.heading_time > 0)
3313                                 Controls.heading_time = 0;
3314                 Controls.heading_time += kh;
3315
3316                 // From joystick...
3317                 if ( (use_joystick)&&(kc_joystick[15].value < 255 ))    {
3318                         if ( !kc_joystick[16].value )           // If not inverted...
3319                                 Controls.heading_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3320                         else
3321                                 Controls.heading_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3322                 }
3323         
3324                 // From mouse...
3325                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
3326                         if ( !kc_mouse[16].value )              // If not inverted...
3327                                 Controls.heading_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3328                         else
3329                                 Controls.heading_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3330                 }
3331         } else {
3332                 Controls.heading_time = 0;
3333         }
3334
3335 // the following "if" added by WraithX, 4/14/00
3336 // done so that dead players can't move
3337 if (!Player_is_dead)
3338 {
3339 //----------- Read sideways_thrust_time -----------------
3340
3341         if ( slide_on ) {
3342                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3343                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3344                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3345                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3346
3347                 // From keyboard...
3348                 if ( kc_keyboard[4].value < 255 ) Controls.sideways_thrust_time -= k0;
3349                 if ( kc_keyboard[5].value < 255 ) Controls.sideways_thrust_time -= k1;
3350                 if ( kc_keyboard[6].value < 255 ) Controls.sideways_thrust_time += k2;
3351                 if ( kc_keyboard[7].value < 255 ) Controls.sideways_thrust_time += k3;
3352         
3353                 // From joystick...
3354                 if ( (use_joystick)&&(kc_joystick[15].value < 255 ))    {
3355                         if ( !kc_joystick[16].value )           // If not inverted...
3356                                 Controls.sideways_thrust_time += joy_axis[kc_joystick[15].value];
3357                         else
3358                                 Controls.sideways_thrust_time -= joy_axis[kc_joystick[15].value];
3359                 }
3360                 
3361                 // From cyberman
3362                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3363                         Controls.sideways_thrust_time -= mouse_button_down_time(MB_HEAD_LEFT);
3364                         Controls.sideways_thrust_time += mouse_button_down_time(MB_HEAD_RIGHT);
3365                 }
3366         
3367                 // From mouse...
3368                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
3369                         if ( !kc_mouse[16].value )              // If not inverted...
3370                                 Controls.sideways_thrust_time += mouse_axis[kc_mouse[15].value];
3371                         else
3372                                 Controls.sideways_thrust_time -= mouse_axis[kc_mouse[15].value];
3373                 }
3374         }
3375
3376         // From keyboard...
3377         if ( kc_keyboard[10].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[10].value );
3378         if ( kc_keyboard[11].value < 255 ) Controls.sideways_thrust_time -= speed_factor*key_down_time( kc_keyboard[11].value );
3379         if ( kc_keyboard[12].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[12].value );
3380         if ( kc_keyboard[13].value < 255 ) Controls.sideways_thrust_time += speed_factor*key_down_time( kc_keyboard[13].value );
3381         
3382         // From joystick...
3383         if ( (use_joystick)&&(kc_joystick[17].value < 255 ))    {
3384                 if ( !kc_joystick[18].value )           // If not inverted...
3385                         Controls.sideways_thrust_time -= joy_axis[kc_joystick[17].value];
3386                 else
3387                         Controls.sideways_thrust_time += joy_axis[kc_joystick[17].value];
3388         }
3389
3390         // From joystick buttons
3391         if ( (use_joystick)&&(kc_joystick[6].value < 255 )) Controls.sideways_thrust_time -= joy_get_button_down_time( kc_joystick[6].value );
3392         if ( (use_joystick)&&(kc_joystick[7].value < 255 )) Controls.sideways_thrust_time += joy_get_button_down_time( kc_joystick[7].value );
3393
3394         // From mouse buttons
3395         if ( (use_mouse)&&(kc_mouse[6].value < 255 )) Controls.sideways_thrust_time -= mouse_button_down_time( kc_mouse[6].value );
3396         if ( (use_mouse)&&(kc_mouse[7].value < 255 )) Controls.sideways_thrust_time += mouse_button_down_time( kc_mouse[7].value );
3397
3398         // From mouse...
3399         if ( (use_mouse)&&(kc_mouse[17].value < 255 ))  {
3400                 if ( !kc_mouse[18].value )              // If not inverted...
3401                         Controls.sideways_thrust_time += mouse_axis[kc_mouse[17].value];
3402                 else
3403                         Controls.sideways_thrust_time -= mouse_axis[kc_mouse[17].value];
3404         }
3405 }// end "if" added by WraithX
3406
3407 //----------- Read bank_time -----------------
3408
3409         if ( bank_on )  {
3410                 k0 = speed_factor*key_down_time( kc_keyboard[4].value );
3411                 k1 = speed_factor*key_down_time( kc_keyboard[5].value );
3412                 k2 = speed_factor*key_down_time( kc_keyboard[6].value );
3413                 k3 = speed_factor*key_down_time( kc_keyboard[7].value );
3414
3415                 // From keyboard...
3416                 if ( kc_keyboard[4].value < 255 ) Controls.bank_time += k0;
3417                 if ( kc_keyboard[5].value < 255 ) Controls.bank_time += k1;
3418                 if ( kc_keyboard[6].value < 255 ) Controls.bank_time -= k2;
3419                 if ( kc_keyboard[7].value < 255 ) Controls.bank_time -= k3;
3420
3421                 // From Cyberman...
3422                 if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3423                         Controls.bank_time -= mouse_button_down_time(MB_HEAD_LEFT);
3424                         Controls.bank_time += mouse_button_down_time(MB_HEAD_RIGHT);
3425                 }
3426
3427                 // From joystick...
3428                 if ( (use_joystick)&&(kc_joystick[15].value < 255) )    {
3429                         if ( !kc_joystick[16].value )           // If not inverted...
3430                                 Controls.bank_time -= (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3431                         else
3432                                 Controls.bank_time += (joy_axis[kc_joystick[15].value]*Config_joystick_sensitivity)/8;
3433                 }
3434         
3435                 // From mouse...
3436                 if ( (use_mouse)&&(kc_mouse[15].value < 255 ))  {
3437                         if ( !kc_mouse[16].value )              // If not inverted...
3438                                 Controls.bank_time += (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3439                         else
3440                                 Controls.bank_time -= (mouse_axis[kc_mouse[15].value]*Config_joystick_sensitivity)/8;
3441                 }
3442         }
3443
3444         // From keyboard...
3445         if ( kc_keyboard[20].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[20].value );
3446         if ( kc_keyboard[21].value < 255 ) Controls.bank_time += speed_factor*key_down_time( kc_keyboard[21].value );
3447         if ( kc_keyboard[22].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[22].value );
3448         if ( kc_keyboard[23].value < 255 ) Controls.bank_time -= speed_factor*key_down_time( kc_keyboard[23].value );
3449
3450         // From joystick...
3451         if ( (use_joystick)&&(kc_joystick[21].value < 255) )    {
3452                 if ( !kc_joystick[22].value )           // If not inverted...
3453                         Controls.bank_time -= joy_axis[kc_joystick[21].value];
3454                 else
3455                         Controls.bank_time += joy_axis[kc_joystick[21].value];
3456         }
3457
3458         // From joystick buttons
3459         if ( (use_joystick)&&(kc_joystick[11].value < 255 )) Controls.bank_time += joy_get_button_down_time( kc_joystick[11].value );
3460         if ( (use_joystick)&&(kc_joystick[12].value < 255 )) Controls.bank_time -= joy_get_button_down_time( kc_joystick[12].value );
3461
3462         // From mouse buttons
3463         if ( (use_mouse)&&(kc_mouse[11].value < 255 )) Controls.bank_time += mouse_button_down_time( kc_mouse[11].value );
3464         if ( (use_mouse)&&(kc_mouse[12].value < 255 )) Controls.bank_time -= mouse_button_down_time( kc_mouse[12].value );
3465
3466         // From mouse...
3467         if ( (use_mouse)&&(kc_mouse[21].value < 255 ))  {
3468                 if ( !kc_mouse[22].value )              // If not inverted...
3469                         Controls.bank_time += mouse_axis[kc_mouse[21].value];
3470                 else
3471                         Controls.bank_time -= mouse_axis[kc_mouse[21].value];
3472         }
3473
3474         // From Cyberman
3475         if ((use_mouse)&&(Config_control_type==CONTROL_CYBERMAN))       {
3476                 Controls.bank_time += mouse_button_down_time(MB_BANK_LEFT);
3477                 Controls.bank_time -= mouse_button_down_time(MB_BANK_RIGHT);
3478         }
3479
3480 // the following "if" added by WraithX, 4/14/00
3481 // done so that dead players can't move
3482 if (!Player_is_dead)
3483 {
3484 //----------- Read forward_thrust_time -------------
3485
3486         // From keyboard...
3487         if ( kc_keyboard[30].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[30].value );
3488         if ( kc_keyboard[31].value < 255 ) Controls.forward_thrust_time += speed_factor*key_down_time( kc_keyboard[31].value );
3489         if ( kc_keyboard[32].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[32].value );
3490         if ( kc_keyboard[33].value < 255 ) Controls.forward_thrust_time -= speed_factor*key_down_time( kc_keyboard[33].value );
3491
3492         // From joystick...
3493         if ( (use_joystick)&&(kc_joystick[23].value < 255 ))    {
3494                 if ( !kc_joystick[24].value )           // If not inverted...
3495                         Controls.forward_thrust_time -= joy_axis[kc_joystick[23].value];
3496                 else
3497                         Controls.forward_thrust_time += joy_axis[kc_joystick[23].value];
3498         }
3499
3500         // From joystick buttons
3501         if ( (use_joystick)&&(kc_joystick[2].value < 255 )) Controls.forward_thrust_time += joy_get_button_down_time( kc_joystick[2].value );
3502         if ( (use_joystick)&&(kc_joystick[3].value < 255 )) Controls.forward_thrust_time -= joy_get_button_down_time( kc_joystick[3].value );
3503
3504         // From mouse...
3505         if ( (use_mouse)&&(kc_mouse[23].value < 255 ))  {
3506                 if ( !kc_mouse[24].value )              // If not inverted...
3507                         Controls.forward_thrust_time -= mouse_axis[kc_mouse[23].value];
3508                 else
3509                         Controls.forward_thrust_time += mouse_axis[kc_mouse[23].value];
3510         }
3511
3512         // From mouse buttons
3513         if ( (use_mouse)&&(kc_mouse[2].value < 255 )) Controls.forward_thrust_time += mouse_button_down_time( kc_mouse[2].value );
3514         if ( (use_mouse)&&(kc_mouse[3].value < 255 )) Controls.forward_thrust_time -= mouse_button_down_time( kc_mouse[3].value );
3515
3516 //----------- Read afterburner_state -------------
3517
3518         // From keyboard...
3519         if ( kc_keyboard[46].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[46].value];
3520         if ( kc_keyboard[47].value < 255 ) Controls.afterburner_state |= keyd_pressed[kc_keyboard[47].value];
3521
3522         if ( (use_mouse)&&(kc_mouse[27].value < 255 )) Controls.afterburner_state |= mouse_button_state(kc_mouse[27].value);
3523
3524         if ( (use_joystick)&&(kc_joystick[27].value < 255 )) Controls.afterburner_state |= joy_get_button_state(kc_joystick[27].value);
3525
3526 //-------Read headlight key--------------------------
3527
3528         if (kc_keyboard[52].value < 255 )
3529                    Controls.headlight_count=key_down_count(kc_keyboard[52].value);
3530         if (kc_keyboard[53].value < 255 )
3531                    Controls.headlight_count+=key_down_count(kc_keyboard[53].value);
3532                   if ((use_joystick)&&(kc_joystick[30].value < 255 )) 
3533                Controls.headlight_count+=joy_get_button_down_cnt(kc_joystick[30].value);
3534
3535 //--------Read Cycle Primary Key------------------
3536
3537                   if (kc_keyboard[48].value<255)
3538                          Controls.cycle_primary_count=key_down_count(kc_keyboard[48].value);
3539                   if (kc_keyboard[49].value<255)
3540                         Controls.cycle_primary_count+=key_down_count(kc_keyboard[49].value);
3541              if ((use_joystick)&&(kc_joystick[28].value < 255 )) 
3542          Controls.cycle_primary_count+=joy_get_button_down_cnt(kc_joystick[28].value);
3543
3544
3545 //--------Read Cycle Secondary Key------------------
3546
3547                   if (kc_keyboard[50].value<255)
3548                          Controls.cycle_secondary_count=key_down_count(kc_keyboard[50].value);
3549                   if (kc_keyboard[51].value<255)
3550                         Controls.cycle_secondary_count+=key_down_count(kc_keyboard[51].value);
3551              if ((use_joystick)&&(kc_joystick[29].value < 255 )) 
3552                         Controls.cycle_secondary_count=joy_get_button_down_cnt(kc_joystick[29].value);
3553
3554 //--------Read Toggle Bomb key----------------------
3555
3556                   if (kc_keyboard[56].value<255 && key_down_count(kc_keyboard[56].value))
3557          {
3558           int bomb = Secondary_last_was_super[PROXIMITY_INDEX]?PROXIMITY_INDEX:SMART_MINE_INDEX;
3559
3560                          if (!Players[Player_num].secondary_ammo[PROXIMITY_INDEX] &&
3561                                   !Players[Player_num].secondary_ammo[SMART_MINE_INDEX])
3562                            {
3563                                  digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3564                                  HUD_init_message ("No bombs available!");
3565                                 }
3566                          else
3567                                 {       
3568                                  if (Players[Player_num].secondary_ammo[bomb]==0)
3569                                         {
3570                                          digi_play_sample_once( SOUND_BAD_SELECTION, F1_0 );
3571                                          HUD_init_message ("No %s available!",(bomb==SMART_MINE_INDEX)?"Smart mines":"Proximity bombs");
3572                                         }
3573                                   else
3574                                         {
3575                                Secondary_last_was_super[PROXIMITY_INDEX]=!Secondary_last_was_super[PROXIMITY_INDEX];
3576                                          digi_play_sample_once( SOUND_GOOD_SELECTION_SECONDARY, F1_0 );
3577                                         }
3578                                 }
3579                         }
3580           
3581 //---------Read Energy->Shield key----------
3582
3583         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[54].value])
3584                 transfer_energy_to_shield(key_down_time(kc_keyboard[54].value));
3585         if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && keyd_pressed[kc_keyboard[55].value])
3586                 transfer_energy_to_shield(key_down_time(kc_keyboard[55].value));
3587
3588 //----------- Read fire_primary_down_count
3589         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[24].value);
3590         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_down_count += key_down_count(kc_keyboard[25].value);
3591         if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_down_count += joy_get_button_down_cnt(kc_joystick[0].value);
3592         if ((use_mouse)&&(kc_mouse[0].value < 255 )) Controls.fire_primary_down_count += mouse_button_down_count(kc_mouse[0].value);
3593
3594 //----------- Read fire_primary_state
3595         if (kc_keyboard[24].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[24].value];
3596         if (kc_keyboard[25].value < 255 ) Controls.fire_primary_state |= keyd_pressed[kc_keyboard[25].value];
3597         if ((use_joystick)&&(kc_joystick[0].value < 255 )) Controls.fire_primary_state |= joy_get_button_state(kc_joystick[0].value);
3598         if ((use_mouse)&&(kc_mouse[0].value < 255) ) Controls.fire_primary_state |= mouse_button_state(kc_mouse[0].value);
3599
3600 //----------- Read fire_secondary_down_count
3601         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[26].value);
3602         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_down_count += key_down_count(kc_keyboard[27].value);
3603         if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_down_count += joy_get_button_down_cnt(kc_joystick[1].value);
3604         if ((use_mouse)&&(kc_mouse[1].value < 255 )) Controls.fire_secondary_down_count += mouse_button_down_count(kc_mouse[1].value);
3605
3606 //----------- Read fire_secondary_state
3607         if (kc_keyboard[26].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[26].value];
3608         if (kc_keyboard[27].value < 255 ) Controls.fire_secondary_state |= keyd_pressed[kc_keyboard[27].value];
3609         if ((use_joystick)&&(kc_joystick[1].value < 255 )) Controls.fire_secondary_state |= joy_get_button_state(kc_joystick[1].value);
3610         if ((use_mouse)&&(kc_mouse[1].value < 255) ) Controls.fire_secondary_state |= mouse_button_state(kc_mouse[1].value);
3611
3612 //----------- Read fire_flare_down_count
3613         if (kc_keyboard[28].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[28].value);
3614         if (kc_keyboard[29].value < 255 ) Controls.fire_flare_down_count += key_down_count(kc_keyboard[29].value);
3615         if ((use_joystick)&&(kc_joystick[4].value < 255 )) Controls.fire_flare_down_count += joy_get_button_down_cnt(kc_joystick[4].value);