]> icculus.org git repositories - btb/d2x.git/blob - arch/dos/joydefs.c
remove rcs tags
[btb/d2x.git] / arch / dos / joydefs.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 /*
15  * 
16  * .
17  * 
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include <conf.h>
22 #endif
23
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <string.h>
27
28 #include "pstypes.h"
29 #include "mono.h"
30 #include "key.h"
31 #include "joy.h"
32 #include "timer.h"
33 #include "error.h"
34
35 #include "inferno.h"
36 #include "game.h"
37 #include "object.h"
38 #include "player.h"
39
40 #include "controls.h"
41 #include "joydefs.h"
42 #include "render.h"
43 #include "palette.h"
44 #include "newmenu.h"
45 #include "args.h"
46 #include "text.h"
47 #include "kconfig.h"
48 #include "digi.h"
49 #include "playsave.h"
50
51 int joydefs_calibrate_flag = 0;
52
53 int Joy_is_Sidewinder = 0;
54
55 void joy_delay()
56 {
57 #ifdef __MSDOS__
58         int t1 = TICKER + 19/4;                 // Wait 1/4 second...
59         stop_time();
60         while( TICKER < t1 );
61         joy_flush();
62         start_time();
63 #endif
64 }
65
66
67 int joycal_message( char * title, char * text )
68 {
69         int i;
70         newmenu_item    m[2];
71         m[0].type = NM_TYPE_TEXT; m[0].text = text;
72         m[1].type = NM_TYPE_MENU; m[1].text = TXT_OK;
73         i = newmenu_do( title, NULL, 2, m, NULL );
74         if ( i < 0 ) 
75                 return 1;
76         return 0;
77 }
78
79 extern int WriteConfigFile();   
80
81 void joydefs_calibrate()
82 {
83         ubyte masks;
84         int org_axis_min[4];
85         int org_axis_center[4];
86         int org_axis_max[4];
87
88         int axis_min[4] = { 0, 0, 0, 0 };
89         int axis_cen[4] = { 0, 0, 0, 0 };
90         int axis_max[4] = { 0, 0, 0, 0 };
91
92         int temp_values[4];
93         char title[50];
94         char text[50];
95         int nsticks = 0;
96
97         joydefs_calibrate_flag = 0;
98
99         if ( (Config_control_type!=CONTROL_JOYSTICK) && (Config_control_type!=CONTROL_FLIGHTSTICK_PRO) && (Config_control_type!=CONTROL_THRUSTMASTER_FCS) && (Config_control_type!=CONTROL_GRAVIS_GAMEPAD) )    
100                 return;
101
102         joy_get_cal_vals(org_axis_min, org_axis_center, org_axis_max);
103
104         joy_set_cen();
105         joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
106
107         if (!joy_present)       {
108                 nm_messagebox( NULL, 1, TXT_OK, TXT_NO_JOYSTICK );
109                 return;
110         }
111         
112         masks = joy_get_present_mask();
113
114         if ( masks == JOY_ALL_AXIS )
115                 nsticks = 2;
116         else
117                 nsticks = 1;
118
119         if ( nsticks == 2 && !Joy_is_Sidewinder)     {
120                 sprintf( title, "%s #1\n%s", TXT_JOYSTICK, TXT_UPPER_LEFT);
121                 sprintf( text, "%s #1 %s", TXT_MOVE_JOYSTICK, TXT_TO_UL);
122         } else {
123                 sprintf( title, "%s\n%s", TXT_JOYSTICK, TXT_UPPER_LEFT);
124                 sprintf( text, "%s %s", TXT_MOVE_JOYSTICK, TXT_TO_UL);
125         }
126         if (joycal_message( title, text )) {
127                 joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
128                 return;
129         }
130         joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
131         axis_min[0] = temp_values[0];
132         axis_min[1] = temp_values[1];
133         joy_delay();
134
135         if ( nsticks == 2 && !Joy_is_Sidewinder)     {
136                 sprintf( title, "%s #1\n%s", TXT_JOYSTICK, TXT_LOWER_RIGHT);
137                 sprintf( text, "%s #1 %s", TXT_MOVE_JOYSTICK, TXT_TO_LR);
138         } else {
139                 sprintf( title, "%s\n%s", TXT_JOYSTICK, TXT_LOWER_RIGHT);
140                 sprintf( text, "%s %s", TXT_MOVE_JOYSTICK, TXT_TO_LR);
141         }
142         if (joycal_message( title, text)) {
143                 joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
144                 return;
145         }
146         joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
147         axis_max[0] = temp_values[0];
148         axis_max[1] = temp_values[1];
149         joy_delay();
150
151         if ( nsticks == 2 && !Joy_is_Sidewinder)     {
152                 sprintf( title, "%s #1\n%s", TXT_JOYSTICK, TXT_CENTER);
153                 sprintf( text, "%s #1 %s", TXT_MOVE_JOYSTICK, TXT_TO_C);
154         } else {
155                 sprintf( title, "%s\n%s", TXT_JOYSTICK, TXT_CENTER);
156                 sprintf( text, "%s %s", TXT_MOVE_JOYSTICK, TXT_TO_C);
157         }
158         if (joycal_message( title, text)) {
159                 joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
160                 return;
161         }
162         joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
163         axis_cen[0] = temp_values[0];
164         axis_cen[1] = temp_values[1];
165         joy_delay();
166
167         // The fcs uses axes 3 for hat, so don't calibrate it.
168         if (Config_control_type == CONTROL_THRUSTMASTER_FCS)  {
169                 axis_min[3] = 0;
170                 axis_cen[3] = temp_values[3]/2;
171                 axis_max[3] = temp_values[3];
172                 joy_delay();
173         }
174
175         if (Joy_is_Sidewinder || Config_control_type != CONTROL_THRUSTMASTER_FCS) {
176             //    masks = joy_get_present_mask();
177
178                 if ( nsticks == 2 )     {
179                         if ( kconfig_is_axes_used(2) || kconfig_is_axes_used(3) )       {
180                                 if(Joy_is_Sidewinder)
181                                  {
182                                   sprintf( title, "%s\nTWIST-LEFT", TXT_JOYSTICK);
183                                   sprintf( text, "Twist Joystick to \nthe left side");
184                                  }
185                                 else
186                                  {
187                                   sprintf( title, "%s #2\n%s", TXT_JOYSTICK, TXT_UPPER_LEFT);
188                                   sprintf( text, "%s #2 %s", TXT_MOVE_JOYSTICK, TXT_TO_UL);
189                                  }
190                                 if (joycal_message( title, text )) {
191                                         joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
192                                         return;
193                                 }
194                                 joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
195                                 axis_min[2] = temp_values[2];
196                                 axis_min[3] = temp_values[3];
197                                 joy_delay();
198
199                                 if(Joy_is_Sidewinder)
200                                  {
201                                   sprintf( title, "%s\nTWIST-RIGHT", TXT_JOYSTICK);
202                                   sprintf( text, "Twist Joystick to \nthe right side");
203                                  }
204                                 else
205                                  {
206                                   sprintf( title, "%s #2\n%s", TXT_JOYSTICK, TXT_LOWER_RIGHT);
207                                   sprintf( text, "%s #2 %s", TXT_MOVE_JOYSTICK, TXT_TO_LR);
208                                  }
209                                 if (joycal_message( title, text ))      {
210                                         joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max); 
211                                         return;
212                                 }
213                                 joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
214                                 axis_max[2] = temp_values[2];
215                                 axis_max[3] = temp_values[3];
216                                 joy_delay();
217
218                                 
219                                 if(Joy_is_Sidewinder)
220                                  {
221                                   sprintf( title, "%s\nCENTER", TXT_JOYSTICK);
222                                   sprintf( text, "%s %s",TXT_MOVE_JOYSTICK, TXT_TO_C);
223                                  }
224                                 else
225                                  {
226                                    sprintf( title, "%s #2\n%s", TXT_JOYSTICK, TXT_CENTER);
227                                    sprintf( text, "%s #2 %s", TXT_MOVE_JOYSTICK, TXT_TO_C);
228                                  }
229
230                                 if (joycal_message( title, text ))      {
231                                         joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
232                                         return;
233                                 }
234                                 joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
235                                 axis_cen[2] = temp_values[2];
236                                 axis_cen[3] = temp_values[3];   
237                                 joy_delay();
238                         }
239                 } else if ( (!(masks & JOY_2_X_AXIS)) && (masks & JOY_2_Y_AXIS) )       {
240                         if ( kconfig_is_axes_used(3) )  {
241                                 // A throttle axis!!!!!
242                                 sprintf( title, "%s\n%s", TXT_THROTTLE, TXT_FORWARD);
243                                 if (joycal_message( title, TXT_MOVE_THROTTLE_F))        {
244                                         joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
245                                         return;
246                                 }
247                                 joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
248                                 axis_min[3] = temp_values[3];
249                                 joy_delay();
250                 
251                                 sprintf( title, "%s\n%s", TXT_THROTTLE, TXT_REVERSE);
252                                 if (joycal_message( title, TXT_MOVE_THROTTLE_R)) {
253                                         joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
254                                         return;
255                                 }
256                                 joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
257                                 axis_max[3] = temp_values[3];
258                                 joy_delay();
259                 
260                                 sprintf( title, "%s\n%s", TXT_THROTTLE, TXT_CENTER);
261                                 if (joycal_message( title, TXT_MOVE_THROTTLE_C)) {
262                                         joy_set_cal_vals(org_axis_min, org_axis_center, org_axis_max);
263                                         return;
264                                 }
265                                 joystick_read_raw_axis( JOY_ALL_AXIS, temp_values );
266                                 axis_cen[3] = temp_values[3];
267                                 joy_delay();
268                         }
269                 }
270         }
271         joy_set_cal_vals(axis_min, axis_cen, axis_max);
272
273
274 //added 9/1/98 by Victor Rachels to make sidewinder calibratable
275 /*         if(Joy_is_Sidewinder)
276           Config_control_type=tempstick; */
277 //end this section addition - Victor Rachels
278
279
280         WriteConfigFile();
281 }
282
283
284 //char *control_text[CONTROL_MAX_TYPES] = { "Keyboard only", "Joystick", "Flightstick Pro", "Thrustmaster FCS", "Gravis Gamepad", "Mouse", "Cyberman" };
285
286 void joydef_menuset_1(int nitems, newmenu_item * items, int *last_key, int citem )
287 {
288         int i;
289         int oc_type = Config_control_type;
290
291         nitems = nitems;
292         last_key = last_key;
293         citem = citem;          
294
295         for (i=0; i<CONTROL_MAX_TYPES; i++ )
296                 if (items[i].value) Config_control_type = i;
297
298         if ( (oc_type != Config_control_type) && (Config_control_type == CONTROL_THRUSTMASTER_FCS ) )   {
299                 nm_messagebox( TXT_IMPORTANT_NOTE, 1, TXT_OK, TXT_FCS );
300         }
301
302         if (oc_type != Config_control_type) {
303                 switch (Config_control_type) {
304         //              case    CONTROL_NONE:
305                         case    CONTROL_JOYSTICK:
306                         case    CONTROL_FLIGHTSTICK_PRO:
307                         case    CONTROL_THRUSTMASTER_FCS:
308                         case    CONTROL_GRAVIS_GAMEPAD:
309         //              case    CONTROL_MOUSE:
310         //              case    CONTROL_CYBERMAN:
311                                 joydefs_calibrate_flag = 1;
312                 }
313                 kc_set_controls();
314         }
315
316 }
317
318 extern ubyte kc_use_external_control;
319 extern ubyte kc_enable_external_control;
320 extern ubyte *kc_external_name;
321
322 void joydefs_config()
323 {
324         char xtext[128];
325         int i, old_masks, masks;
326         newmenu_item m[13];
327         int i1=9;
328         int nitems;
329
330         do {
331                 nitems = 12;
332                 m[0].type = NM_TYPE_RADIO; m[0].text = CONTROL_TEXT(0); m[0].value = 0; m[0].group = 0;
333                 m[1].type = NM_TYPE_RADIO; m[1].text = CONTROL_TEXT(1); m[1].value = 0; m[1].group = 0;
334                 m[2].type = NM_TYPE_RADIO; m[2].text = CONTROL_TEXT(2); m[2].value = 0; m[2].group = 0;
335                 m[3].type = NM_TYPE_RADIO; m[3].text = CONTROL_TEXT(3); m[3].value = 0; m[3].group = 0;
336                 m[4].type = NM_TYPE_RADIO; m[4].text = CONTROL_TEXT(4); m[4].value = 0; m[4].group = 0;
337                 m[5].type = NM_TYPE_RADIO; m[5].text = CONTROL_TEXT(5); m[5].value = 0; m[5].group = 0;
338                 m[6].type = NM_TYPE_RADIO; m[6].text = CONTROL_TEXT(6); m[6].value = 0; m[6].group = 0;
339                 m[7].type = NM_TYPE_MENU; m[7].text=TXT_CUST_ABOVE;
340                 m[8].type = NM_TYPE_TEXT; m[8].text="";
341                 m[9].type = NM_TYPE_MENU; m[9].text=TXT_CUST_KEYBOARD;
342 //added on 2/5/99 by Victor Rachels to add d1x key menu
343                 m[10].type = NM_TYPE_MENU; m[10].text="CUSTOMIZE D1X KEYS";
344 //end this section addition - VR
345                 m[11].type = NM_TYPE_CHECK; m[11].text= "Joy is Sidewinder"; m[11].value=Joy_is_Sidewinder;
346         
347                 if ( kc_use_external_control )  {
348                         sprintf( xtext, "Enable %s", kc_external_name );
349                         m[12].type = NM_TYPE_CHECK; m[12].text = xtext; m[12].value = kc_enable_external_control;
350                         nitems = nitems + 1;
351                 }
352                 
353                 m[Config_control_type].value = 1;
354          
355                 i1 = newmenu_do1( NULL, TXT_CONTROLS, nitems, m, joydef_menuset_1, i1 );
356
357 //added on 9/1/98 by Victor Rachels to add Sidewinder calibration
358                 Joy_is_Sidewinder = m[11].value;
359 //end this section addition
360
361                 switch(i1)      {
362                 case 7: {
363                                 old_masks = 0;
364                                 for (i=0; i<4; i++ )            {
365                                         if (kconfig_is_axes_used(i))
366                                                 old_masks |= (1<<i);
367                                 }
368                                 if ( Config_control_type==0 )
369                                         // nothing...
370                                         Config_control_type=0;
371                                 else if ( Config_control_type<5 ) 
372                                         kconfig(1, CONTROL_TEXT(Config_control_type) );
373                                 else 
374                                         kconfig(2, CONTROL_TEXT(Config_control_type) ); 
375
376                                 masks = 0;
377                                 for (i=0; i<4; i++ )            {
378                                         if (kconfig_is_axes_used(i))
379                                                 masks |= (1<<i);
380                                 }
381
382                                 switch (Config_control_type) {
383                                 case    CONTROL_JOYSTICK:
384                                 case    CONTROL_FLIGHTSTICK_PRO:
385                                 case    CONTROL_THRUSTMASTER_FCS:       
386                                         {
387                                                 for (i=0; i<4; i++ )    {
388                                                         if ( (masks&(1<<i)) && (!(old_masks&(1<<i))))
389                                                                 joydefs_calibrate_flag = 1;
390                                                 }
391                                         }
392                                         break;
393                                 }
394                         }
395                         break;
396                 case 9: 
397                         kconfig(0, TXT_KEYBOARD); 
398                         break;
399 //added on 2/5/99 by Victor Rachels to add d1x key menu
400                 case 10:
401                         kconfig(3,"D1X Keys");
402                         break;
403 //end this section addition - VR
404                 }
405
406                 if ( kc_use_external_control )  {
407                         kc_enable_external_control = m[12].value;
408                 }
409
410         } while(i1>-1);
411
412         switch (Config_control_type) {
413         case    CONTROL_JOYSTICK:
414         case    CONTROL_FLIGHTSTICK_PRO:
415         case    CONTROL_THRUSTMASTER_FCS:
416         case    CONTROL_GRAVIS_GAMEPAD:
417                 if ( joydefs_calibrate_flag )
418                         joydefs_calibrate();
419                 break;
420         }
421
422 }