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