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