diff options
Diffstat (limited to 'src/m_config.c')
-rw-r--r-- | src/m_config.c | 641 |
1 files changed, 375 insertions, 266 deletions
diff --git a/src/m_config.c b/src/m_config.c index 4066cb3c..38ec8e00 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -2,6 +2,7 @@ //----------------------------------------------------------------------------- // // Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software // Copyright(C) 2005 Simon Howard // // This program is free software; you can redistribute it and/or @@ -19,7 +20,6 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. // -// // DESCRIPTION: // Configuration file interface. // @@ -28,38 +28,20 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <ctype.h> #include <errno.h> #include "config.h" -#include "deh_main.h" -#include "doomdef.h" -#include "doomfeatures.h" - -#include "z_zone.h" - -#include "m_menu.h" -#include "m_argv.h" -#include "net_client.h" -#include "w_wad.h" - -#include "i_joystick.h" -#include "i_swap.h" +#include "doomtype.h" +#include "doomkeys.h" +#include "doomfeatures.h" #include "i_system.h" -#include "i_video.h" -#include "v_video.h" - -#include "hu_stuff.h" - -// State. -#include "doomstat.h" - -// Data. -#include "dstrings.h" - +#include "m_argv.h" #include "m_misc.h" +#include "z_zone.h" // // DEFAULTS @@ -68,75 +50,12 @@ // Location where all configuration data is stored - // default.cfg, savegames, etc. -char * configdir; - - -int usemouse = 1; -int usejoystick = 0; - -extern int key_right; -extern int key_left; -extern int key_up; -extern int key_down; - -extern int key_strafeleft; -extern int key_straferight; - -extern int key_fire; -extern int key_use; -extern int key_strafe; -extern int key_speed; - -extern int mousebfire; -extern int mousebstrafe; -extern int mousebforward; - -extern int mousebstrafeleft; -extern int mousebstraferight; -extern int mousebbackward; -extern int mousebuse; - -extern int dclick_use; - -extern int joybfire; -extern int joybstrafe; -extern int joybuse; -extern int joybspeed; -extern int joybstrafeleft; -extern int joybstraferight; - -extern int viewwidth; -extern int viewheight; +char *configdir; -extern int mouseSensitivity; -extern int showMessages; +// Default filenames for configuration files. -// machine-independent sound params -extern int numChannels; - - -extern char* chat_macros[]; - -extern int show_endoom; -extern int vanilla_savegame_limit; -extern int vanilla_demo_limit; - -extern int snd_musicdevice; -extern int snd_sfxdevice; -extern int snd_samplerate; - -// controls whether to use libsamplerate for sample rate conversions - -extern int use_libsamplerate; - -// dos specific options: these are unused but should be maintained -// so that the config file can be shared between chocolate -// doom and doom.exe - -static int snd_sbport = 0; -static int snd_sbirq = 0; -static int snd_sbdma = 0; -static int snd_mport = 0; +static char *default_main_config; +static char *default_extra_config; typedef enum { @@ -149,10 +68,10 @@ typedef enum typedef struct { // Name of the variable - char * name; + char *name; // Pointer to the location in memory of the variable - void * location; + void *location; // Type of the variable default_type_t type; @@ -160,30 +79,34 @@ typedef struct // If this is a key value, the original integer scancode we read from // the config file before translating it to the internal key value. // If zero, we didn't read this value from a config file. - int untranslated; + int untranslated; // The value we translated the scancode into when we read the // config file on startup. If the variable value is different from // this, it has been changed and needs to be converted; otherwise, // use the 'untranslated' value. - int original_translated; + int original_translated; + + // If true, this config variable has been bound to a variable + // and is being used. + boolean bound; } default_t; typedef struct { default_t *defaults; - int numdefaults; - char *filename; + int numdefaults; + char *filename; } default_collection_t; -#define CONFIG_VARIABLE_KEY(name, variable) \ - { #name, &variable, DEFAULT_KEY, 0, 0 } -#define CONFIG_VARIABLE_INT(name, variable) \ - { #name, &variable, DEFAULT_INT, 0, 0 } -#define CONFIG_VARIABLE_FLOAT(name, variable) \ - { #name, &variable, DEFAULT_FLOAT, 0, 0 } -#define CONFIG_VARIABLE_STRING(name, variable) \ - { #name, &variable, DEFAULT_STRING, 0, 0 } +#define CONFIG_VARIABLE_KEY(name) \ + { #name, NULL, DEFAULT_KEY, 0, 0, false } +#define CONFIG_VARIABLE_INT(name) \ + { #name, NULL, DEFAULT_INT, 0, 0, false } +#define CONFIG_VARIABLE_FLOAT(name) \ + { #name, NULL, DEFAULT_FLOAT, 0, 0, false } +#define CONFIG_VARIABLE_STRING(name) \ + { #name, NULL, DEFAULT_STRING, 0, 0, false } //! @begin_config_file default.cfg @@ -198,19 +121,19 @@ static default_t doom_defaults_list[] = // the game to crash when entering the options menu. // - CONFIG_VARIABLE_INT(mouse_sensitivity, mouseSensitivity), + CONFIG_VARIABLE_INT(mouse_sensitivity), //! // Volume of sound effects, range 0-15. // - CONFIG_VARIABLE_INT(sfx_volume, sfxVolume), + CONFIG_VARIABLE_INT(sfx_volume), //! // Volume of in-game music, range 0-15. // - CONFIG_VARIABLE_INT(music_volume, musicVolume), + CONFIG_VARIABLE_INT(music_volume), //! // If non-zero, messages are displayed on the heads-up display @@ -218,55 +141,115 @@ static default_t doom_defaults_list[] = // are not displayed. // - CONFIG_VARIABLE_INT(show_messages, showMessages), + CONFIG_VARIABLE_INT(show_messages), //! // Keyboard key to turn right. // - CONFIG_VARIABLE_KEY(key_right, key_right), + CONFIG_VARIABLE_KEY(key_right), //! // Keyboard key to turn left. // - CONFIG_VARIABLE_KEY(key_left, key_left), + CONFIG_VARIABLE_KEY(key_left), //! // Keyboard key to move forward. // - CONFIG_VARIABLE_KEY(key_up, key_up), + CONFIG_VARIABLE_KEY(key_up), //! // Keyboard key to move backward. // - CONFIG_VARIABLE_KEY(key_down, key_down), + CONFIG_VARIABLE_KEY(key_down), //! // Keyboard key to strafe left. // - CONFIG_VARIABLE_KEY(key_strafeleft, key_strafeleft), + CONFIG_VARIABLE_KEY(key_strafeleft), //! // Keyboard key to strafe right. // - CONFIG_VARIABLE_KEY(key_straferight, key_straferight), + CONFIG_VARIABLE_KEY(key_straferight), + + //! + // Keyboard key to jump. + // + + CONFIG_VARIABLE_KEY(key_jump), + + //! + // Keyboard key to fly upward. + // + + CONFIG_VARIABLE_KEY(key_flyup), + + //! + // Keyboard key to fly downwards. + // + + CONFIG_VARIABLE_KEY(key_flydown), + + //! + // Keyboard key to center flying. + // + + CONFIG_VARIABLE_KEY(key_flycenter), + + //! + // Keyboard key to look up. + // + + CONFIG_VARIABLE_KEY(key_lookup), + + //! + // Keyboard key to look down. + // + + CONFIG_VARIABLE_KEY(key_lookdown), + + //! + // Keyboard key to center the view. + // + + CONFIG_VARIABLE_KEY(key_lookcenter), + + //! + // Keyboard key to scroll left in the inventory. + // + + CONFIG_VARIABLE_KEY(key_invleft), + + //! + // Keyboard key to scroll right in the inventory. + // + + CONFIG_VARIABLE_KEY(key_invright), + + //! + // Keyboard key to use the current item in the inventory. + // + + CONFIG_VARIABLE_KEY(key_useartifact), //! // Keyboard key to fire the currently selected weapon. // - CONFIG_VARIABLE_KEY(key_fire, key_fire), + CONFIG_VARIABLE_KEY(key_fire), //! // Keyboard key to "use" an object, eg. a door or switch. // - CONFIG_VARIABLE_KEY(key_use, key_use), + CONFIG_VARIABLE_KEY(key_use), //! // Keyboard key to turn on strafing. When held down, pressing the @@ -274,63 +257,69 @@ static default_t doom_defaults_list[] = // right instead. // - CONFIG_VARIABLE_KEY(key_strafe, key_strafe), + CONFIG_VARIABLE_KEY(key_strafe), //! // Keyboard key to make the player run. // - CONFIG_VARIABLE_KEY(key_speed, key_speed), + CONFIG_VARIABLE_KEY(key_speed), //! // If non-zero, mouse input is enabled. If zero, mouse input is // disabled. // - CONFIG_VARIABLE_INT(use_mouse, usemouse), + CONFIG_VARIABLE_INT(use_mouse), //! // Mouse button to fire the currently selected weapon. // - CONFIG_VARIABLE_INT(mouseb_fire, mousebfire), + CONFIG_VARIABLE_INT(mouseb_fire), //! // Mouse button to turn on strafing. When held down, the player // will strafe left and right instead of turning left and right. // - CONFIG_VARIABLE_INT(mouseb_strafe, mousebstrafe), + CONFIG_VARIABLE_INT(mouseb_strafe), //! // Mouse button to move forward. // - CONFIG_VARIABLE_INT(mouseb_forward, mousebforward), + CONFIG_VARIABLE_INT(mouseb_forward), + + //! + // Mouse button to jump. + // + + CONFIG_VARIABLE_INT(mouseb_jump), //! // If non-zero, joystick input is enabled. // - CONFIG_VARIABLE_INT(use_joystick, usejoystick), + CONFIG_VARIABLE_INT(use_joystick), //! // Joystick button to fire the current weapon. // - CONFIG_VARIABLE_INT(joyb_fire, joybfire), + CONFIG_VARIABLE_INT(joyb_fire), //! // Joystick button to fire the current weapon. // - CONFIG_VARIABLE_INT(joyb_strafe, joybstrafe), + CONFIG_VARIABLE_INT(joyb_strafe), //! // Joystick button to "use" an object, eg. a door or switch. // - CONFIG_VARIABLE_INT(joyb_use, joybuse), + CONFIG_VARIABLE_INT(joyb_use), //! // Joystick button to make the player run. @@ -338,7 +327,13 @@ static default_t doom_defaults_list[] = // If this has a value of 20 or greater, the player will always run. // - CONFIG_VARIABLE_INT(joyb_speed, joybspeed), + CONFIG_VARIABLE_INT(joyb_speed), + + //! + // Joystick button to jump. + // + + CONFIG_VARIABLE_INT(joyb_jump), //! // Screen size, range 3-11. @@ -348,27 +343,27 @@ static default_t doom_defaults_list[] = // status bar displayed. // - CONFIG_VARIABLE_INT(screenblocks, screenblocks), + CONFIG_VARIABLE_INT(screenblocks), //! // Screen detail. Zero gives normal "high detail" mode, while // a non-zero value gives "low detail" mode. // - CONFIG_VARIABLE_INT(detaillevel, detailLevel), + CONFIG_VARIABLE_INT(detaillevel), //! // Number of sounds that will be played simultaneously. // - CONFIG_VARIABLE_INT(snd_channels, numChannels), + CONFIG_VARIABLE_INT(snd_channels), //! // Music output device. A non-zero value gives MIDI sound output, // while a value of zero disables music. // - CONFIG_VARIABLE_INT(snd_musicdevice, snd_musicdevice), + CONFIG_VARIABLE_INT(snd_musicdevice), //! // Sound effects device. A value of zero disables in-game sound @@ -377,31 +372,31 @@ static default_t doom_defaults_list[] = // effects. // - CONFIG_VARIABLE_INT(snd_sfxdevice, snd_sfxdevice), + CONFIG_VARIABLE_INT(snd_sfxdevice), //! // SoundBlaster I/O port. Unused. // - CONFIG_VARIABLE_INT(snd_sbport, snd_sbport), + CONFIG_VARIABLE_INT(snd_sbport), //! // SoundBlaster IRQ. Unused. // - CONFIG_VARIABLE_INT(snd_sbirq, snd_sbirq), + CONFIG_VARIABLE_INT(snd_sbirq), //! // SoundBlaster DMA channel. Unused. // - CONFIG_VARIABLE_INT(snd_sbdma, snd_sbdma), + CONFIG_VARIABLE_INT(snd_sbdma), //! // Output port to use for OPL MIDI playback. Unused. // - CONFIG_VARIABLE_INT(snd_mport, snd_mport), + CONFIG_VARIABLE_INT(snd_mport), //! // Gamma correction level. A value of zero disables gamma @@ -409,67 +404,81 @@ static default_t doom_defaults_list[] = // levels of gamma correction. // - CONFIG_VARIABLE_INT(usegamma, usegamma), + CONFIG_VARIABLE_INT(usegamma), + + //! + // Directory in which to store savegames. + // + + CONFIG_VARIABLE_STRING(savedir), + + //! + // Controls whether messages are displayed in the heads-up display. + // If this has a non-zero value, messages are displayed. + // + + CONFIG_VARIABLE_INT(messageson), + //! // Multiplayer chat macro: message to send when alt+0 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro0, chat_macros[0]), + CONFIG_VARIABLE_STRING(chatmacro0), //! // Multiplayer chat macro: message to send when alt+1 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro1, chat_macros[1]), + CONFIG_VARIABLE_STRING(chatmacro1), //! // Multiplayer chat macro: message to send when alt+2 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro2, chat_macros[2]), + CONFIG_VARIABLE_STRING(chatmacro2), //! // Multiplayer chat macro: message to send when alt+3 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro3, chat_macros[3]), + CONFIG_VARIABLE_STRING(chatmacro3), //! // Multiplayer chat macro: message to send when alt+4 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro4, chat_macros[4]), + CONFIG_VARIABLE_STRING(chatmacro4), //! // Multiplayer chat macro: message to send when alt+5 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro5, chat_macros[5]), + CONFIG_VARIABLE_STRING(chatmacro5), //! // Multiplayer chat macro: message to send when alt+6 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro6, chat_macros[6]), + CONFIG_VARIABLE_STRING(chatmacro6), //! // Multiplayer chat macro: message to send when alt+7 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro7, chat_macros[7]), + CONFIG_VARIABLE_STRING(chatmacro7), //! // Multiplayer chat macro: message to send when alt+8 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro8, chat_macros[8]), + CONFIG_VARIABLE_STRING(chatmacro8), //! // Multiplayer chat macro: message to send when alt+9 is pressed. // - CONFIG_VARIABLE_STRING(chatmacro9, chat_macros[9]), + CONFIG_VARIABLE_STRING(chatmacro9), }; static default_collection_t doom_defaults = @@ -484,26 +493,33 @@ static default_collection_t doom_defaults = static default_t extra_defaults_list[] = { //! + // If non-zero, use the graphical startup mode for Heretic and + // Hexen. + // + + CONFIG_VARIABLE_INT(graphical_startup), + + //! // If non-zero, video settings will be autoadjusted to a valid // configuration when the screen_width and screen_height variables // do not match any valid configuration. // - CONFIG_VARIABLE_INT(autoadjust_video_settings, autoadjust_video_settings), + CONFIG_VARIABLE_INT(autoadjust_video_settings), //! // If non-zero, the game will run in full screen mode. If zero, // the game will run in a window. // - CONFIG_VARIABLE_INT(fullscreen, fullscreen), + CONFIG_VARIABLE_INT(fullscreen), //! // If non-zero, the screen will be stretched vertically to display // correctly on a square pixel video mode. // - CONFIG_VARIABLE_INT(aspect_ratio_correct, aspect_ratio_correct), + CONFIG_VARIABLE_INT(aspect_ratio_correct), //! // Number of milliseconds to wait on startup after the video mode @@ -512,7 +528,7 @@ static default_t extra_defaults_list[] = // for a brief interval after changing video modes. // - CONFIG_VARIABLE_INT(startup_delay, startup_delay), + CONFIG_VARIABLE_INT(startup_delay), //! // Screen width in pixels. If running in full screen mode, this is @@ -521,7 +537,7 @@ static default_t extra_defaults_list[] = // will run. // - CONFIG_VARIABLE_INT(screen_width, screen_width), + CONFIG_VARIABLE_INT(screen_width), //! // Screen height in pixels. If running in full screen mode, this is @@ -530,7 +546,7 @@ static default_t extra_defaults_list[] = // will run. // - CONFIG_VARIABLE_INT(screen_height, screen_height), + CONFIG_VARIABLE_INT(screen_height), //! // If this is non-zero, the mouse will be "grabbed" when running @@ -538,7 +554,7 @@ static default_t extra_defaults_list[] = // When running full screen, this has no effect. // - CONFIG_VARIABLE_INT(grabmouse, grabmouse), + CONFIG_VARIABLE_INT(grabmouse), //! // If non-zero, all vertical mouse movement is ignored. This @@ -546,7 +562,7 @@ static default_t extra_defaults_list[] = // that performs the same function. // - CONFIG_VARIABLE_INT(novert, novert), + CONFIG_VARIABLE_INT(novert), //! // Mouse acceleration factor. When the speed of mouse movement @@ -554,7 +570,7 @@ static default_t extra_defaults_list[] = // multiplied by this value. // - CONFIG_VARIABLE_FLOAT(mouse_acceleration, mouse_acceleration), + CONFIG_VARIABLE_FLOAT(mouse_acceleration), //! // Mouse acceleration threshold. When the speed of mouse movement @@ -562,21 +578,21 @@ static default_t extra_defaults_list[] = // acceleration factor (mouse_acceleration). // - CONFIG_VARIABLE_INT(mouse_threshold, mouse_threshold), + CONFIG_VARIABLE_INT(mouse_threshold), //! // Sound output sample rate, in Hz. Typical values to use are // 11025, 22050, 44100 and 48000. // - CONFIG_VARIABLE_INT(snd_samplerate, snd_samplerate), + CONFIG_VARIABLE_INT(snd_samplerate), //! // If non-zero, the ENDOOM screen is displayed when exiting the // game. If zero, the ENDOOM screen is not displayed. // - CONFIG_VARIABLE_INT(show_endoom, show_endoom), + CONFIG_VARIABLE_INT(show_endoom), //! // If non-zero, the Vanilla savegame limit is enforced; if the @@ -585,7 +601,7 @@ static default_t extra_defaults_list[] = // the size of savegames. // - CONFIG_VARIABLE_INT(vanilla_savegame_limit, vanilla_savegame_limit), + CONFIG_VARIABLE_INT(vanilla_savegame_limit), //! // If non-zero, the Vanilla demo size limit is enforced; the game @@ -594,7 +610,7 @@ static default_t extra_defaults_list[] = // limit to the size of demos. // - CONFIG_VARIABLE_INT(vanilla_demo_limit, vanilla_demo_limit), + CONFIG_VARIABLE_INT(vanilla_demo_limit), //! // If non-zero, the game behaves like Vanilla Doom, always assuming @@ -602,14 +618,14 @@ static default_t extra_defaults_list[] = // native keyboard mapping of the keyboard is used. // - CONFIG_VARIABLE_INT(vanilla_keyboard_mapping, vanilla_keyboard_mapping), + CONFIG_VARIABLE_INT(vanilla_keyboard_mapping), //! // Name of the SDL video driver to use. If this is an empty string, // the default video driver is used. // - CONFIG_VARIABLE_STRING(video_driver, video_driver), + CONFIG_VARIABLE_STRING(video_driver), #ifdef FEATURE_MULTIPLAYER @@ -618,7 +634,7 @@ static default_t extra_defaults_list[] = // used on the "waiting" screen while waiting for the game to start. // - CONFIG_VARIABLE_STRING(player_name, net_player_name), + CONFIG_VARIABLE_STRING(player_name), #endif @@ -627,74 +643,74 @@ static default_t extra_defaults_list[] = // value ('-1') indicates that no joystick is configured. // - CONFIG_VARIABLE_INT(joystick_index, joystick_index), + CONFIG_VARIABLE_INT(joystick_index), //! // Joystick axis to use to for horizontal (X) movement. // - CONFIG_VARIABLE_INT(joystick_x_axis, joystick_x_axis), + CONFIG_VARIABLE_INT(joystick_x_axis), //! // If non-zero, movement on the horizontal joystick axis is inverted. // - CONFIG_VARIABLE_INT(joystick_x_invert, joystick_x_invert), + CONFIG_VARIABLE_INT(joystick_x_invert), //! // Joystick axis to use to for vertical (Y) movement. // - CONFIG_VARIABLE_INT(joystick_y_axis, joystick_y_axis), + CONFIG_VARIABLE_INT(joystick_y_axis), //! // If non-zero, movement on the vertical joystick axis is inverted. // - CONFIG_VARIABLE_INT(joystick_y_invert, joystick_y_invert), + CONFIG_VARIABLE_INT(joystick_y_invert), //! // Joystick button to strafe left. // - CONFIG_VARIABLE_INT(joyb_strafeleft, joybstrafeleft), + CONFIG_VARIABLE_INT(joyb_strafeleft), //! // Joystick button to strafe right. // - CONFIG_VARIABLE_INT(joyb_straferight, joybstraferight), + CONFIG_VARIABLE_INT(joyb_straferight), //! // Mouse button to strafe left. // - CONFIG_VARIABLE_INT(mouseb_strafeleft, mousebstrafeleft), + CONFIG_VARIABLE_INT(mouseb_strafeleft), //! // Mouse button to strafe right. // - CONFIG_VARIABLE_INT(mouseb_straferight, mousebstraferight), + CONFIG_VARIABLE_INT(mouseb_straferight), //! // Mouse button to "use" an object, eg. a door or switch. // - CONFIG_VARIABLE_INT(mouseb_use, mousebuse), + CONFIG_VARIABLE_INT(mouseb_use), //! // Mouse button to move backwards. // - CONFIG_VARIABLE_INT(mouseb_backward, mousebbackward), + CONFIG_VARIABLE_INT(mouseb_backward), //! // If non-zero, double-clicking a mouse button acts like pressing // the "use" key to use an object in-game, eg. a door or switch. // - CONFIG_VARIABLE_INT(dclick_use, dclick_use), + CONFIG_VARIABLE_INT(dclick_use), //! // Controls whether libsamplerate support is used for performing @@ -709,7 +725,7 @@ static default_t extra_defaults_list[] = // Sinc filter = 4; High quality Sinc filter = 5. // - CONFIG_VARIABLE_INT(use_libsamplerate, use_libsamplerate), + CONFIG_VARIABLE_INT(use_libsamplerate), }; static default_collection_t extra_defaults = @@ -719,6 +735,23 @@ static default_collection_t extra_defaults = NULL, }; +// Search a collection for a variable + +static default_t *SearchCollection(default_collection_t *collection, char *name) +{ + int i; + + for (i=0; i<collection->numdefaults; ++i) + { + if (!strcmp(name, collection->defaults[i].name)) + { + return &collection->defaults[i]; + } + } + + return NULL; +} + static const int scantokey[128] = { 0 , 27, '1', '2', '3', '4', '5', '6', @@ -756,6 +789,13 @@ static void SaveDefaultCollection(default_collection_t *collection) { int chars_written; + // Ignore unbound variables + + if (!defaults[i].bound) + { + continue; + } + // Print the name and line up all values at 30 characters chars_written = fprintf(f, "%s ", defaults[i].name); @@ -838,18 +878,20 @@ static int ParseIntParameter(char *strparm) static void LoadDefaultCollection(default_collection_t *collection) { - default_t *defaults = collection->defaults; - int i; - FILE* f; - char defname[80]; - char strparm[100]; + default_t *def; + FILE *f; + char defname[80]; + char strparm[100]; + char *s; + int intparm; // read the file in, overriding any set defaults f = fopen(collection->filename, "r"); - if (!f) + if (f == NULL) { - // File not opened, but don't complain + // File not opened, but don't complain. + // It's probably just the first time they ran the game. return; } @@ -873,59 +915,60 @@ static void LoadDefaultCollection(default_collection_t *collection) // Find the setting in the list - for (i=0; i<collection->numdefaults; ++i) - { - default_t *def = &collection->defaults[i]; - char *s; - int intparm; - - if (strcmp(defname, def->name) != 0) - { - // not this one - continue; - } + def = SearchCollection(collection, defname); - // parameter found + if (def == NULL || !def->bound) + { + // Unknown variable? Unbound variables are also treated + // as unknown. - switch (def->type) - { - case DEFAULT_STRING: - s = strdup(strparm + 1); - s[strlen(s) - 1] = '\0'; - * (char **) def->location = s; - break; + continue; + } - case DEFAULT_INT: - * (int *) def->location = ParseIntParameter(strparm); - break; + // parameter found - case DEFAULT_KEY: + switch (def->type) + { + case DEFAULT_STRING: + s = strdup(strparm + 1); + s[strlen(s) - 1] = '\0'; + * (char **) def->location = s; + break; - // translate scancodes read from config - // file (save the old value in untranslated) + case DEFAULT_INT: + * (int *) def->location = ParseIntParameter(strparm); + break; - intparm = ParseIntParameter(strparm); - defaults[i].untranslated = intparm; - intparm = scantokey[intparm]; + case DEFAULT_KEY: - defaults[i].original_translated = intparm; - * (int *) def->location = intparm; - break; + // translate scancodes read from config + // file (save the old value in untranslated) - case DEFAULT_FLOAT: - * (float *) def->location = (float) atof(strparm); - break; - } + intparm = ParseIntParameter(strparm); + def->untranslated = intparm; + intparm = scantokey[intparm]; - // finish + def->original_translated = intparm; + * (int *) def->location = intparm; + break; - break; + case DEFAULT_FLOAT: + * (float *) def->location = (float) atof(strparm); + break; } } fclose (f); } +// Set the default filenames to use for configuration files. + +void M_SetConfigFilenames(char *main_config, char *extra_config) +{ + default_main_config = main_config; + default_extra_config = extra_config; +} + // // M_SaveDefaults // @@ -936,6 +979,30 @@ void M_SaveDefaults (void) SaveDefaultCollection(&extra_defaults); } +// +// Save defaults to alternate filenames +// + +void M_SaveDefaultsAlternate(char *main, char *extra) +{ + char *orig_main; + char *orig_extra; + + // Temporarily change the filenames + + orig_main = doom_defaults.filename; + orig_extra = extra_defaults.filename; + + doom_defaults.filename = main; + extra_defaults.filename = extra; + + M_SaveDefaults(); + + // Restore normal filenames + + doom_defaults.filename = orig_main; + extra_defaults.filename = orig_extra; +} // // M_LoadDefaults @@ -951,8 +1018,8 @@ void M_LoadDefaults (void) // @arg <file> // @vanilla // - // Load configuration from the specified file, instead of - // default.cfg. + // Load configuration from the specified file. The default + // configuration file (for Doom) is named default.cfg. // i = M_CheckParm ("-config"); @@ -964,8 +1031,9 @@ void M_LoadDefaults (void) } else { - doom_defaults.filename = malloc(strlen(configdir) + 20); - sprintf(doom_defaults.filename, "%sdefault.cfg", configdir); + doom_defaults.filename + = malloc(strlen(configdir) + strlen(default_main_config) + 1); + sprintf(doom_defaults.filename, "%s%s", configdir, default_main_config); } printf("saving config in %s\n", doom_defaults.filename); @@ -973,8 +1041,8 @@ void M_LoadDefaults (void) //! // @arg <file> // - // Load extra configuration from the specified file, instead - // of chocolate-doom.cfg. + // Load extra configuration from the specified file. The default + // configuration file for Doom is named chocolate-doom.cfg. // i = M_CheckParm("-extraconfig"); @@ -988,29 +1056,65 @@ void M_LoadDefaults (void) else { extra_defaults.filename - = malloc(strlen(configdir) + strlen(PACKAGE_TARNAME) + 10); - sprintf(extra_defaults.filename, "%s%s.cfg", - configdir, PACKAGE_TARNAME); + = malloc(strlen(configdir) + strlen(default_extra_config) + 1); + sprintf(extra_defaults.filename, "%s%s", + configdir, default_extra_config); } LoadDefaultCollection(&doom_defaults); LoadDefaultCollection(&extra_defaults); } -// -// SetConfigDir: +// Get a configuration file variable by its name + +static default_t *GetDefaultForName(char *name) +{ + default_t *result; + + // Try the main list and the extras + + result = SearchCollection(&doom_defaults, name); + + if (result == NULL) + { + result = SearchCollection(&extra_defaults, name); + } + + // Not found? Internal error. + + if (result == NULL) + { + I_Error("Unknown configuration variable: '%s'", name); + } + + return result; +} + // -// Sets the location of the configuration directory, where configuration -// files are stored - default.cfg, chocolate-doom.cfg, savegames, etc. +// Bind a variable to a given configuration file variable, by name. // -void M_SetConfigDir(void) +void M_BindVariable(char *name, void *location) +{ + default_t *variable; + + variable = GetDefaultForName(name); + + variable->location = location; + variable->bound = true; +} + +// Get the path to the default configuration dir to use, if NULL +// is passed to M_SetConfigDir. + +static char *GetDefaultConfigDir(void) { #ifndef _WIN32 - // Ignore the HOME environment variable on Windows - just behave - // like Vanilla Doom. + // On Unix systems we put configuration into ~/.chocolate-doom, but + // on Windows we just use the current directory, like Vanilla. char *homedir; + char *result; homedir = getenv("HOME"); @@ -1019,39 +1123,44 @@ void M_SetConfigDir(void) // put all configuration in a config directory off the // homedir - configdir = malloc(strlen(homedir) + strlen(PACKAGE_TARNAME) + 5); + result = malloc(strlen(homedir) + strlen(PACKAGE_TARNAME) + 5); - sprintf(configdir, "%s%c.%s%c", homedir, DIR_SEPARATOR, - PACKAGE_TARNAME, DIR_SEPARATOR); - - // make the directory if it doesnt already exist - - M_MakeDirectory(configdir); + sprintf(result, "%s%c.%s%c", homedir, DIR_SEPARATOR, + PACKAGE_TARNAME, DIR_SEPARATOR); } else #endif /* #ifndef _WIN32 */ { -#ifdef _WIN32 - //! - // @platform windows - // @vanilla - // - // Save configuration data and savegames in c:\doomdata, - // allowing play from CD. - // - - if (M_CheckParm("-cdrom") > 0) - { - printf(D_CDROM); - configdir = strdup("c:\\doomdata\\"); + // On Windows, we just use the current directory. - M_MakeDirectory(configdir); - } - else -#endif - { - configdir = strdup(""); - } + return strdup(""); } } +// +// SetConfigDir: +// +// Sets the location of the configuration directory, where configuration +// files are stored - default.cfg, chocolate-doom.cfg, savegames, etc. +// + +void M_SetConfigDir(char *dir) +{ + // Use the directory that was passed, or find the default. + + if (dir != NULL) + { + configdir = dir; + } + else + { + configdir = GetDefaultConfigDir(); + } + + printf("Using %s for configuration and saves\n", configdir); + + // Make the directory if it doesn't already exist: + + M_MakeDirectory(configdir); +} + |