]> icculus.org git repositories - btb/d2x.git/blob - main/config.c
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / main / config.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-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 /*
15  *
16  * contains routine(s) to read in the configuration file which contains
17  * game configuration stuff like detail level, sound card, etc
18  *
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include <conf.h>
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <ctype.h>
29
30 #ifdef WINDOWS
31 #define WIN32_LEAN_AND_MEAN
32 #include <windows.h>
33 #include "winapp.h"
34 #endif
35
36 #include <physfs.h>
37
38 #include "inferno.h"
39 #include "gr.h"
40 #include "joy.h"
41 #include "args.h"
42 #include "mono.h"
43 #include "key.h"
44 #include "physfsx.h"
45
46
47 #ifdef __MSDOS__
48 cvar_t Config_digi_type         = { "DigiDeviceID8",  "0", CVAR_ARCHIVE };
49 cvar_t digi_driver_board_16     = { "DigiDeviceID16", "0", CVAR_ARCHIVE };
50 //cvar_t digi_driver_port         = { "DigiPort",       "0", CVAR_ARCHIVE };
51 //cvar_t digi_driver_irq          = { "DigiIrq",        "0", CVAR_ARCHIVE };
52 cvar_t Config_digi_dma          = { "DigiDma8",       "0", CVAR_ARCHIVE };
53 cvar_t digi_driver_dma_16       = { "DigiDma16",      "0", CVAR_ARCHIVE };
54 cvar_t Config_midi_type         = { "MidiDeviceID",   "0", CVAR_ARCHIVE };
55 //cvar_t digi_midi_port           = { "MidiPort",       "0", CVAR_ARCHIVE };
56 #endif
57 cvar_t Config_digi_volume       = { "DigiVolume",     "8", CVAR_ARCHIVE };
58 cvar_t Config_midi_volume       = { "MidiVolume",     "8", CVAR_ARCHIVE };
59 cvar_t Config_redbook_volume    = { "RedbookVolume",  "8", CVAR_ARCHIVE };
60 cvar_t Config_detail_level      = { "DetailLevel",    "4", CVAR_ARCHIVE };
61 cvar_t Config_gamma_level       = { "GammaLevel",     "0", CVAR_ARCHIVE };
62 cvar_t Config_control_joystick  = { "in_joystick",    "0", CVAR_ARCHIVE };
63 cvar_t Config_control_mouse     = { "in_mouse",       "0", CVAR_ARCHIVE };
64 cvar_t Config_channels_reversed = { "StereoReverse",  "0", CVAR_ARCHIVE };
65 cvar_t Config_joystick_sensitivity[] = {
66         { "joy_forwardsensitivity", "1.0", CVAR_ARCHIVE },
67         { "joy_pitchsensitivity",   "1.0", CVAR_ARCHIVE },
68         { "joy_sidesensitivity",    "1.0", CVAR_ARCHIVE },
69         { "joy_yawsensitivity",     "1.0", CVAR_ARCHIVE },
70         { "joy_upsensitivity",      "1.0", CVAR_ARCHIVE },
71         { "joy_banksensitivity",    "1.0", CVAR_ARCHIVE },
72 };
73 cvar_t Config_joystick_deadzone[] = {
74         { "joy_forwardthreshold", "0.16", CVAR_ARCHIVE },
75         { "joy_pitchthreshold",   "0.08", CVAR_ARCHIVE },
76         { "joy_sidethreshold",    "0.08", CVAR_ARCHIVE },
77         { "joy_yawthreshold",     "0.08", CVAR_ARCHIVE },
78         { "joy_upthreshold",      "0.08", CVAR_ARCHIVE },
79         { "joy_bankthreshold",    "0.08", CVAR_ARCHIVE },
80 };
81 cvar_t Config_mouse_sensitivity[] = {
82         { "m_forward", "1.0", CVAR_ARCHIVE },
83         { "m_pitch",   "1.0", CVAR_ARCHIVE },
84         { "m_side",    "1.0", CVAR_ARCHIVE },
85         { "m_yaw",     "1.0", CVAR_ARCHIVE },
86         { "m_up",      "1.0", CVAR_ARCHIVE },
87         { "m_bank",    "1.0", CVAR_ARCHIVE },
88 };
89 cvar_t Config_joystick_min      = { "JoystickMin", "0,0,0,0", CVAR_ARCHIVE };
90 cvar_t Config_joystick_max      = { "JoystickMax", "0,0,0,0", CVAR_ARCHIVE };
91 cvar_t Config_joystick_cen      = { "JoystickCen", "0,0,0,0", CVAR_ARCHIVE };
92 cvar_t config_last_player       = { "LastPlayer",         "", CVAR_ARCHIVE };
93 cvar_t config_last_mission      = { "LastMission",        "", CVAR_ARCHIVE };
94 cvar_t Config_vr_type           = { "VR_type",           "0", CVAR_ARCHIVE };
95 cvar_t Config_vr_resolution     = { "VR_resolution",     "0", CVAR_ARCHIVE };
96 cvar_t Config_vr_tracking       = { "VR_tracking",       "0", CVAR_ARCHIVE };
97 cvar_t Config_primary_order     = { "PrimaryOrder",       "", CVAR_ARCHIVE };
98 cvar_t Config_secondary_order   = { "SecondaryOrder",     "", CVAR_ARCHIVE };
99 cvar_t Config_lifetime_kills    = { "LifetimeKills",     "0", CVAR_ARCHIVE };
100 cvar_t Config_lifetime_killed   = { "LifetimeKilled",    "0", CVAR_ARCHIVE };
101 cvar_t Config_lifetime_checksum = { "LifetimeChecksum",  "0", CVAR_ARCHIVE };
102 cvar_t Config_resolution_x      = { "ResolutionX",     "640", CVAR_ARCHIVE };
103 cvar_t Config_resolution_y      = { "ResolutionY",     "480", CVAR_ARCHIVE };
104
105
106 #define _CRYSTAL_LAKE_8_ST              0xe201
107 #define _CRYSTAL_LAKE_16_ST     0xe202
108 #define _AWE32_8_ST                             0xe208
109 #define _AWE32_16_ST                            0xe209
110
111
112 extern sbyte Object_complexity, Object_detail, Wall_detail, Wall_render_depth, Debris_amount, SoundChannels;
113
114 void set_custom_detail_vars(void);
115
116
117 #define CL_MC0 0xF8F
118 #define CL_MC1 0xF8D
119 /*
120 void CrystalLakeWriteMCP( ushort mc_addr, ubyte mc_data )
121 {
122         _disable();
123         outp( CL_MC0, 0xE2 );                           // Write password
124         outp( mc_addr, mc_data );               // Write data
125         _enable();
126 }
127
128 ubyte CrystalLakeReadMCP( ushort mc_addr )
129 {
130         ubyte value;
131         _disable();
132         outp( CL_MC0, 0xE2 );           // Write password
133         value = inp( mc_addr );         // Read data
134         _enable();
135         return value;
136 }
137
138 void CrystalLakeSetSB()
139 {
140         ubyte tmp;
141         tmp = CrystalLakeReadMCP( CL_MC1 );
142         tmp &= 0x7F;
143         CrystalLakeWriteMCP( CL_MC1, tmp );
144 }
145
146 void CrystalLakeSetWSS()
147 {
148         ubyte tmp;
149         tmp = CrystalLakeReadMCP( CL_MC1 );
150         tmp |= 0x80;
151         CrystalLakeWriteMCP( CL_MC1, tmp );
152 }
153 */
154 //MovieHires might be changed by -nohighres, so save a "real" copy of it
155 int SaveMovieHires;
156 int save_redbook_enabled;
157
158 #ifdef WINDOWS
159 void CheckMovieAttributes()
160 {
161                 HKEY hKey;
162                 DWORD len, type, val;
163                 long lres;
164  
165                 lres = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Parallax\\Descent II\\1.1\\INSTALL",
166                                                         0, KEY_READ, &hKey);
167                 if (lres == ERROR_SUCCESS) {
168                         len = sizeof(val);
169                         lres = RegQueryValueEx(hKey, "HIRES", NULL, &type, &val, &len);
170                         if (lres == ERROR_SUCCESS) {
171                                 cvar_setint( &MovieHires, val );
172                                 logentry("HIRES=%d\n", val);
173                         }
174                         RegCloseKey(hKey);
175                 }
176 }
177 #endif
178
179
180 static int config_initialized;
181
182 static void config_init(void)
183 {
184         int i;
185
186         /* make sure our cvars are registered */
187         cvar_registervariable(&Config_digi_volume);
188         cvar_registervariable(&Config_midi_volume);
189         cvar_registervariable(&Redbook_enabled);
190         cvar_registervariable(&Config_redbook_volume);
191         cvar_registervariable(&Config_channels_reversed);
192         cvar_registervariable(&Config_gamma_level);
193         cvar_registervariable(&Config_detail_level);
194         cvar_registervariable(&Config_control_joystick);
195         cvar_registervariable(&Config_control_mouse);
196         for (i = 0; i < 6; i++)
197                 cvar_registervariable(&Config_joystick_sensitivity[i]);
198         for (i = 0; i < 6; i++)
199                 cvar_registervariable(&Config_joystick_deadzone[i]);
200         for (i = 0; i < 6; i++)
201                 cvar_registervariable(&Config_mouse_sensitivity[i]);
202         cvar_registervariable(&Config_joystick_min);
203         cvar_registervariable(&Config_joystick_cen);
204         cvar_registervariable(&Config_joystick_max);
205         cvar_registervariable(&config_last_player);
206         cvar_registervariable(&config_last_mission);
207         cvar_registervariable(&Config_vr_type);
208         cvar_registervariable(&Config_vr_resolution);
209         cvar_registervariable(&Config_vr_tracking);
210         cvar_registervariable(&MovieHires);
211         cvar_registervariable(&real_guidebot_name);
212         cvar_registervariable(&Config_primary_order);
213         cvar_registervariable(&Config_secondary_order);
214         cvar_registervariable(&Cockpit_3d_view[0]);
215         cvar_registervariable(&Cockpit_3d_view[1]);
216         cvar_registervariable(&Config_lifetime_kills);
217         cvar_registervariable(&Config_lifetime_killed);
218         cvar_registervariable(&Config_lifetime_checksum);
219 #ifdef NETWORK
220         cvar_registervariable(&Network_message_macro[0]);
221         cvar_registervariable(&Network_message_macro[1]);
222         cvar_registervariable(&Network_message_macro[2]);
223         cvar_registervariable(&Network_message_macro[3]);
224 #endif
225         cvar_registervariable(&Game_window_w);
226         cvar_registervariable(&Game_window_h);
227         cvar_registervariable(&Player_default_difficulty);
228         cvar_registervariable(&Auto_leveling_on);
229         cvar_registervariable(&Reticle_on);
230         cvar_registervariable(&Cockpit_mode);
231         cvar_registervariable(&Config_resolution_x);
232         cvar_registervariable(&Config_resolution_y);
233         cvar_registervariable(&Missile_view_enabled);
234         cvar_registervariable(&Headlight_active_default);
235         cvar_registervariable(&Guided_in_big_window);
236         cvar_registervariable(&Automap_always_hires);
237         cvar_registervariable(&automap_use_game_res);
238         cvar_registervariable(&menu_use_game_res);
239
240         config_initialized = 1;
241 }
242
243
244 #ifdef NETWORK
245 static int get_lifetime_checksum (int a,int b)
246 {
247         int num;
248
249         // confusing enough to beat amateur disassemblers? Lets hope so
250
251         num=(a<<8 ^ b);
252         num^=(a | b);
253         num*=num>>2;
254         return (num);
255 }
256 #endif
257
258
259 void LoadConfigDefaults(void)
260 {
261         cmd_append("bind UP     +lookdown;      bind PAD8   +lookdown");
262         cmd_append("bind DOWN   +lookup;        bind PAD2   +lookup");
263         cmd_append("bind LEFT   +left;          bind PAD4   +left");
264         cmd_append("bind RIGHT  +right;         bind PAD6   +right");
265
266         cmd_append("bind LALT   +strafe");
267         cmd_append("bind PAD1   +moveleft");
268         cmd_append("bind PAD3   +moveright");
269         cmd_append("bind PAD-   +moveup");
270         cmd_append("bind PAD+   +movedown");
271
272         cmd_append("bind Q      +bankleft;      bind PAD7   +bankleft");
273         cmd_append("bind E      +bankright;     bind PAD9   +bankright");
274
275         cmd_append("bind ,      +cycle");
276         cmd_append("bind .      +cycle2");
277
278         cmd_append("bind LCTRL  +attack;        bind RCTRL  +attack");
279         cmd_append("bind SPC    +attack2");
280         cmd_append("bind F      +flare");
281         cmd_append("bind B      +bomb");
282
283         cmd_append("bind R      +rearview");
284         cmd_append("bind TAB    +automap");
285
286         cmd_append("bind A      +forward");
287         cmd_append("bind Z      +back");
288         cmd_append("bind S      +afterburner");
289
290         cmd_append("bind H      +headlight");
291         cmd_append("bind T      +nrgshield");
292
293         cmd_append("bind J1B1   +attack");
294         cmd_append("bind J1B2   +attack2");
295
296         cmd_append("bind MB1    +attack");
297         cmd_append("bind MB2    +attack2");
298
299         cmd_append("bind ` toggleconsole");
300
301         cmd_append("bind 1 weapon 1");
302         cmd_append("bind 2 weapon 2");
303         cmd_append("bind 3 weapon 3");
304         cmd_append("bind 4 weapon 4");
305         cmd_append("bind 5 weapon 5");
306         cmd_append("bind 6 weapon 6");
307         cmd_append("bind 7 weapon 7");
308         cmd_append("bind 8 weapon 8");
309         cmd_append("bind 9 weapon 9");
310         cmd_append("bind 0 weapon 0");
311
312         cmd_append("bind - sizedown");
313         cmd_append("bind \"=\" sizeup");
314 }
315
316
317 int ReadConfigFile()
318 {
319         int joy_axis_min[7];
320         int joy_axis_center[7];
321         int joy_axis_max[7];
322         int i;
323
324         if (!config_initialized)
325                 config_init();
326
327         cvar_set_cvar( &config_last_player, "" );
328
329         joy_axis_min[0] = joy_axis_min[1] = joy_axis_min[2] = joy_axis_min[3] = 0;
330         joy_axis_max[0] = joy_axis_max[1] = joy_axis_max[2] = joy_axis_max[3] = 0;
331         joy_axis_center[0] = joy_axis_center[1] = joy_axis_center[2] = joy_axis_center[3] = 0;
332
333         joy_set_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
334
335 #if 0
336         cvar_setint(&digi_driver_board, 0);
337         cvar_setint(&digi_driver_port, 0);
338         cvar_setint(&digi_driver_irq, 0);
339         cvar_setint(&digi_driver_dma, 0);
340         cvar_setint(&digi_midi_type, 0);
341         cvar_setint(&digi_midi_port, 0);
342 #endif
343
344         cvar_setint( &Config_digi_volume, 8 );
345         cvar_setint( &Config_midi_volume, 8 );
346         cvar_setint( &Config_redbook_volume, 8 );
347         cvar_setint( &Config_control_joystick, 0 );
348         cvar_setint( &Config_control_mouse, 0 );
349         cvar_setint( &Config_channels_reversed, 0);
350
351         //set these here in case no cfg file
352         SaveMovieHires = MovieHires.intval;
353         save_redbook_enabled = Redbook_enabled.intval;
354
355         InitWeaponOrdering(); // setup default weapon priorities
356         cvar_set_cvarf(&Config_primary_order, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
357                 PrimaryOrder[0], PrimaryOrder[1], PrimaryOrder[2], PrimaryOrder[3],
358                 PrimaryOrder[4], PrimaryOrder[5], PrimaryOrder[6], PrimaryOrder[7],
359                 PrimaryOrder[8], PrimaryOrder[9], PrimaryOrder[10]);
360         cvar_set_cvarf(&Config_secondary_order, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
361                 SecondaryOrder[0], SecondaryOrder[1], SecondaryOrder[2], SecondaryOrder[3],
362                 SecondaryOrder[4], SecondaryOrder[5], SecondaryOrder[6], SecondaryOrder[7],
363                 SecondaryOrder[8], SecondaryOrder[9], SecondaryOrder[10]);
364
365         cvar_setint( &Cockpit_3d_view[0], CV_NONE );
366         cvar_setint( &Cockpit_3d_view[1], CV_NONE );
367
368         cvar_setint( &Config_lifetime_kills, 0 );
369         cvar_setint( &Config_lifetime_killed, 0 );
370         cvar_setint( &Config_lifetime_checksum, 0 );
371
372         // Default taunt macros
373 #ifdef NETWORK
374         cvar_set_cvar(&Network_message_macro[0], "Why can't we all just get along?");
375         cvar_set_cvar(&Network_message_macro[1], "Hey, I got a present for ya");
376         cvar_set_cvar(&Network_message_macro[2], "I got a hankerin' for a spankerin'");
377         cvar_set_cvar(&Network_message_macro[3], "This one's headed for Uranus");
378 #endif
379
380         cvar_setint(&Player_default_difficulty, 1);
381         cvar_setint(&Auto_leveling_on, 1);
382
383         if (cfexist("descent.cfg"))
384                 cmd_append("exec descent.cfg");
385         else
386                 LoadConfigDefaults();
387
388         cmd_queue_process();
389
390         /* TODO: allow cvars to define a callback that will carry out these initialization things on change. */
391
392         gr_palette_set_gamma( Config_gamma_level.intval );
393
394         Detail_level = (int)strtol(Config_detail_level.string, NULL, 10);
395         if (Detail_level == NUM_DETAIL_LEVELS - 1) {
396                 int count,dummy,oc,od,wd,wrd,da,sc;
397
398                 count = sscanf (Config_detail_level.string, "%d,%d,%d,%d,%d,%d,%d\n",&dummy,&oc,&od,&wd,&wrd,&da,&sc);
399
400                 if (count == 7) {
401                         Object_complexity = oc;
402                         Object_detail = od;
403                         Wall_detail = wd;
404                         Wall_render_depth = wrd;
405                         Debris_amount = da;
406                         SoundChannels = sc;
407                         set_custom_detail_vars();
408                 }
409         }
410
411         sscanf( Config_joystick_min.string, "%d,%d,%d,%d", &joy_axis_min[0], &joy_axis_min[1], &joy_axis_min[2], &joy_axis_min[3] );
412         sscanf( Config_joystick_max.string, "%d,%d,%d,%d", &joy_axis_max[0], &joy_axis_max[1], &joy_axis_max[2], &joy_axis_max[3] );
413         sscanf( Config_joystick_cen.string, "%d,%d,%d,%d", &joy_axis_center[0], &joy_axis_center[1], &joy_axis_center[2], &joy_axis_center[3] );
414
415         joy_set_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
416
417         i = FindArg( "-volume" );
418         
419         if ( i > 0 )    {
420                 i = atoi( Args[i+1] );
421                 if ( i < 0 ) i = 0;
422                 if ( i > 100 ) i = 100;
423                 cvar_setint( &Config_digi_volume, (i * 8) / 100 );
424                 cvar_setint( &Config_midi_volume, (i * 8) / 100 );
425                 cvar_setint( &Config_redbook_volume, (i * 8) / 100 );
426         }
427
428         if ( Config_digi_volume.intval > 8 ) cvar_setint( &Config_digi_volume, 8 );
429         if ( Config_midi_volume.intval > 8 ) cvar_setint( &Config_midi_volume, 8 );
430         if ( Config_redbook_volume.intval > 8 ) cvar_setint( &Config_redbook_volume, 8 );
431
432         digi_set_volume( (Config_digi_volume.intval * 32768) / 8, (Config_midi_volume.intval * 128) / 8 );
433
434         kc_set_controls();
435
436         strncpy(guidebot_name, real_guidebot_name.string, GUIDEBOT_NAME_LEN);
437         guidebot_name[GUIDEBOT_NAME_LEN] = 0;
438
439         sscanf(Config_primary_order.string, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
440                 (int *)&PrimaryOrder[0], (int *)&PrimaryOrder[1], (int *)&PrimaryOrder[2], (int *)&PrimaryOrder[3],
441                 (int *)&PrimaryOrder[4], (int *)&PrimaryOrder[5], (int *)&PrimaryOrder[6], (int *)&PrimaryOrder[7],
442                 (int *)&PrimaryOrder[8], (int *)&PrimaryOrder[9], (int *)&PrimaryOrder[10]);
443         sscanf(Config_secondary_order.string, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
444                 (int *)&SecondaryOrder[0], (int *)&SecondaryOrder[1], (int *)&SecondaryOrder[2], (int *)&SecondaryOrder[3],
445                 (int *)&SecondaryOrder[4], (int *)&SecondaryOrder[5], (int *)&SecondaryOrder[6], (int *)&SecondaryOrder[7],
446                 (int *)&SecondaryOrder[8], (int *)&SecondaryOrder[9], (int *)&SecondaryOrder[10]);
447
448 #ifdef NETWORK
449         Netlife_kills = Config_lifetime_kills.intval;
450         Netlife_killed = Config_lifetime_killed.intval;
451
452         con_printf(CON_DEBUG, "Reading: lifetime checksum is %d\n", Config_lifetime_checksum.intval);
453         if (Config_lifetime_checksum.intval != get_lifetime_checksum(Netlife_kills, Netlife_killed)) {
454                 Netlife_kills = Netlife_killed = 0;
455                 Warning("Shame on me\nTrying to cheat eh?");
456         }
457 #endif
458
459         Default_display_mode = SM(Config_resolution_x.intval, Config_resolution_y.intval);
460
461 #if 0
462         printf( "DigiDeviceID: 0x%x\n", digi_driver_board );
463         printf( "DigiPort: 0x%x\n", digi_driver_port.intval );
464         printf( "DigiIrq: 0x%x\n",  digi_driver_irq.intval );
465         printf( "DigiDma: 0x%x\n",      digi_driver_dma.intval );
466         printf( "MidiDeviceID: 0x%x\n", digi_midi_type.intval );
467         printf( "MidiPort: 0x%x\n", digi_midi_port.intval );
468         key_getch();
469
470         cvar_setint( &Config_midi_type, digi_midi_type );
471         cvar_setint( &Config_digi_type, digi_driver_board );
472         cvar_setint( &Config_digi_dma, digi_driver_dma );
473 #endif
474
475 #if 0
476         if (digi_driver_board_16.intval > 0 && !FindArg("-no16bit") && digi_driver_board_16.intval != _GUS_16_ST) {
477                 digi_driver_board = digi_driver_board_16.intval;
478                 digi_driver_dma = digi_driver_dma_16.intval;
479         }
480
481         // HACK!!!
482         //Hack to make some cards look like others, such as
483         //the Crytal Lake look like Microsoft Sound System
484         if ( digi_driver_board == _CRYSTAL_LAKE_8_ST )  {
485                 ubyte tmp;
486                 tmp = CrystalLakeReadMCP( CL_MC1 );
487                 if ( !(tmp & 0x80) )
488                         atexit( CrystalLakeSetSB );             // Restore to SB when done.
489                 CrystalLakeSetWSS();
490                 digi_driver_board = _MICROSOFT_8_ST;
491         } else if ( digi_driver_board == _CRYSTAL_LAKE_16_ST )  {
492                 ubyte tmp;
493                 tmp = CrystalLakeReadMCP( CL_MC1 );
494                 if ( !(tmp & 0x80) )
495                         atexit( CrystalLakeSetSB );             // Restore to SB when done.
496                 CrystalLakeSetWSS();
497                 digi_driver_board = _MICROSOFT_16_ST;
498         } else if ( digi_driver_board == _AWE32_8_ST )  {
499                 digi_driver_board = _SB16_8_ST;
500         } else if ( digi_driver_board == _AWE32_16_ST ) {
501                 digi_driver_board = _SB16_16_ST;
502         } else
503                 digi_driver_board               = digi_driver_board;
504 #else
505
506         if (cfexist("descentw.cfg")) {
507                 cmd_append("exec descentw.cfg");
508                 cmd_queue_process();
509
510                 sscanf( Config_joystick_min.string, "%d,%d,%d,%d,%d,%d,%d", &joy_axis_min[0], &joy_axis_min[1], &joy_axis_min[2], &joy_axis_min[3], &joy_axis_min[4], &joy_axis_min[5], &joy_axis_min[6] );
511                 sscanf( Config_joystick_max.string, "%d,%d,%d,%d,%d,%d,%d", &joy_axis_max[0], &joy_axis_max[1], &joy_axis_max[2], &joy_axis_max[3], &joy_axis_max[4], &joy_axis_max[5], &joy_axis_max[6] );
512                 sscanf( Config_joystick_cen.string, "%d,%d,%d,%d,%d,%d,%d", &joy_axis_center[0], &joy_axis_center[1], &joy_axis_center[2], &joy_axis_center[3], &joy_axis_center[4], &joy_axis_center[5], &joy_axis_center[6] );
513         }
514 #endif
515
516         return 0;
517 }
518
519 int WriteConfigFile()
520 {
521         PHYSFS_file *outfile;
522         int joy_axis_min[7];
523         int joy_axis_center[7];
524         int joy_axis_max[7];
525         
526         joy_get_cal_vals(joy_axis_min, joy_axis_center, joy_axis_max);
527
528         if (FindArg("-noredbook"))
529                 cvar_setint( &Redbook_enabled, save_redbook_enabled );
530
531         cvar_setint( &Config_gamma_level, gr_palette_get_gamma() );
532
533         if (Detail_level == NUM_DETAIL_LEVELS-1)
534                 cvar_set_cvarf( &Config_detail_level, "%d,%d,%d,%d,%d,%d,%d", Detail_level,
535                                            Object_complexity,Object_detail,Wall_detail,Wall_render_depth,Debris_amount,SoundChannels );
536         else
537                 cvar_setint( &Config_detail_level, Detail_level );
538
539         cvar_set_cvarf( &Config_joystick_min, "%d,%d,%d,%d", joy_axis_min[0], joy_axis_min[1], joy_axis_min[2], joy_axis_min[3] );
540         cvar_set_cvarf( &Config_joystick_cen, "%d,%d,%d,%d", joy_axis_center[0], joy_axis_center[1], joy_axis_center[2], joy_axis_center[3] );
541         cvar_set_cvarf( &Config_joystick_max, "%d,%d,%d,%d", joy_axis_max[0], joy_axis_max[1], joy_axis_max[2], joy_axis_max[3] );
542
543         cvar_set_cvar( &config_last_player, Players[Player_num].callsign );
544
545         cvar_setint( &MovieHires, SaveMovieHires );
546
547         cvar_set_cvarf(&Config_primary_order, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
548                 PrimaryOrder[0], PrimaryOrder[1], PrimaryOrder[2], PrimaryOrder[3],
549                 PrimaryOrder[4], PrimaryOrder[5], PrimaryOrder[6], PrimaryOrder[7],
550                 PrimaryOrder[8], PrimaryOrder[9], PrimaryOrder[10]);
551         cvar_set_cvarf(&Config_secondary_order, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
552                 SecondaryOrder[0], SecondaryOrder[1], SecondaryOrder[2], SecondaryOrder[3],
553                 SecondaryOrder[4], SecondaryOrder[5], SecondaryOrder[6], SecondaryOrder[7],
554                 SecondaryOrder[8], SecondaryOrder[9], SecondaryOrder[10]);
555
556 #ifdef NETWORK
557         cvar_setint(&Config_lifetime_kills, Netlife_kills);
558         cvar_setint(&Config_lifetime_killed, Netlife_killed);
559         cvar_setint(&Config_lifetime_checksum, get_lifetime_checksum(Netlife_kills, Netlife_killed));
560         con_printf(CON_DEBUG, "Writing: Lifetime checksum is %d\n", Config_lifetime_checksum.intval);
561 #endif
562
563         cvar_setint(&Cockpit_mode, (Cockpit_mode_save != -1)?Cockpit_mode_save:Cockpit_mode.intval); //if have saved mode, write it instead of letterbox/rear view
564
565         cvar_setint(&Config_resolution_x, SM_W(Current_display_mode));
566         cvar_setint(&Config_resolution_y, SM_H(Current_display_mode));
567
568         outfile = PHYSFSX_openWriteBuffered("descent.cfg");
569         if (outfile == NULL)
570                 return 1;
571         cvar_write(outfile);
572         key_write_bindings(outfile);
573         PHYSFS_close(outfile);
574
575         if (FindArg("-nohires") || FindArg("-nohighres") || FindArg("-lowresmovies"))
576                 cvar_setint( &MovieHires, 0 );
577
578 #ifdef WINDOWS
579         CheckMovieAttributes();
580 #endif
581
582         return 0;
583 }