diff options
Diffstat (limited to 'src/m_config.c')
-rw-r--r-- | src/m_config.c | 834 |
1 files changed, 405 insertions, 429 deletions
diff --git a/src/m_config.c b/src/m_config.c index 4f789845..f70e112a 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,43 +28,20 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <ctype.h> #include <errno.h> -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#endif - #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 @@ -73,130 +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 key_pause; - -// Menu control keys: - -extern int key_menu_activate; -extern int key_menu_up; -extern int key_menu_down; -extern int key_menu_left; -extern int key_menu_right; -extern int key_menu_back; -extern int key_menu_forward; -extern int key_menu_confirm; -extern int key_menu_abort; - -// Keyboard shortcuts: - -extern int key_menu_help; -extern int key_menu_save; -extern int key_menu_load; -extern int key_menu_volume; -extern int key_menu_detail; -extern int key_menu_qsave; -extern int key_menu_endgame; -extern int key_menu_messages; -extern int key_menu_qload; -extern int key_menu_quit; -extern int key_menu_gamma; - -extern int key_menu_incscreen; -extern int key_menu_decscreen; - -extern int key_map_north; -extern int key_map_south; -extern int key_map_east; -extern int key_map_west; -extern int key_map_zoomin; -extern int key_map_zoomout; -extern int key_map_toggle; -extern int key_map_maxzoom; -extern int key_map_follow; -extern int key_map_grid; -extern int key_map_mark; -extern int key_map_clearmark; - -extern int key_weapon1; -extern int key_weapon2; -extern int key_weapon3; -extern int key_weapon4; -extern int key_weapon5; -extern int key_weapon6; -extern int key_weapon7; -extern int key_weapon8; - -extern int key_message_refresh; - -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; - -extern int mouseSensitivity; -extern int showMessages; - -// machine-independent sound params -extern int numChannels; - - -extern char* chat_macros[]; +char *configdir; -extern int show_endoom; -extern int vanilla_savegame_limit; -extern int vanilla_demo_limit; +// Default filenames for configuration files. -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 { @@ -209,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; @@ -220,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 @@ -258,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 @@ -278,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 @@ -334,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. @@ -398,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. @@ -408,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 @@ -437,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 @@ -469,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 = @@ -544,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 @@ -572,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 @@ -581,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 @@ -590,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 @@ -598,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 @@ -606,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 @@ -614,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 @@ -622,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 @@ -645,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 @@ -654,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 @@ -662,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 @@ -678,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 @@ -687,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), #ifdef FEATURE_SOUND @@ -771,7 +727,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), #endif @@ -779,265 +735,265 @@ static default_t extra_defaults_list[] = // Key to pause or unpause the game. // - CONFIG_VARIABLE_KEY(key_pause, key_pause), + CONFIG_VARIABLE_KEY(key_pause), //! // Key that activates the menu when pressed. // - CONFIG_VARIABLE_KEY(key_menu_activate, key_menu_activate), + CONFIG_VARIABLE_KEY(key_menu_activate), //! // Key that moves the cursor up on the menu. // - CONFIG_VARIABLE_KEY(key_menu_up, key_menu_up), + CONFIG_VARIABLE_KEY(key_menu_up), //! // Key that moves the cursor down on the menu. // - CONFIG_VARIABLE_KEY(key_menu_down, key_menu_down), + CONFIG_VARIABLE_KEY(key_menu_down), //! // Key that moves the currently selected slider on the menu left. // - CONFIG_VARIABLE_KEY(key_menu_left, key_menu_left), + CONFIG_VARIABLE_KEY(key_menu_left), //! // Key that moves the currently selected slider on the menu right. // - CONFIG_VARIABLE_KEY(key_menu_right, key_menu_right), + CONFIG_VARIABLE_KEY(key_menu_right), //! // Key to go back to the previous menu. // - CONFIG_VARIABLE_KEY(key_menu_back, key_menu_back), + CONFIG_VARIABLE_KEY(key_menu_back), //! // Key to activate the currently selected menu item. // - CONFIG_VARIABLE_KEY(key_menu_forward, key_menu_forward), + CONFIG_VARIABLE_KEY(key_menu_forward), //! // Key to answer 'yes' to a question in the menu. // - CONFIG_VARIABLE_KEY(key_menu_confirm, key_menu_confirm), + CONFIG_VARIABLE_KEY(key_menu_confirm), //! // Key to answer 'no' to a question in the menu. // - CONFIG_VARIABLE_KEY(key_menu_abort, key_menu_abort), + CONFIG_VARIABLE_KEY(key_menu_abort), //! // Keyboard shortcut to bring up the help screen. // - CONFIG_VARIABLE_KEY(key_menu_help, key_menu_help), + CONFIG_VARIABLE_KEY(key_menu_help), //! // Keyboard shortcut to bring up the save game menu. // - CONFIG_VARIABLE_KEY(key_menu_save, key_menu_save), + CONFIG_VARIABLE_KEY(key_menu_save), //! // Keyboard shortcut to bring up the load game menu. // - CONFIG_VARIABLE_KEY(key_menu_load, key_menu_load), + CONFIG_VARIABLE_KEY(key_menu_load), //! // Keyboard shortcut to bring up the sound volume menu. // - CONFIG_VARIABLE_KEY(key_menu_volume, key_menu_volume), + CONFIG_VARIABLE_KEY(key_menu_volume), //! // Keyboard shortcut to toggle the detail level. // - CONFIG_VARIABLE_KEY(key_menu_detail, key_menu_detail), + CONFIG_VARIABLE_KEY(key_menu_detail), //! // Keyboard shortcut to quicksave the current game. // - CONFIG_VARIABLE_KEY(key_menu_qsave, key_menu_qsave), + CONFIG_VARIABLE_KEY(key_menu_qsave), //! // Keyboard shortcut to end the game. // - CONFIG_VARIABLE_KEY(key_menu_endgame, key_menu_endgame), + CONFIG_VARIABLE_KEY(key_menu_endgame), //! // Keyboard shortcut to toggle heads-up messages. // - CONFIG_VARIABLE_KEY(key_menu_messages, key_menu_messages), + CONFIG_VARIABLE_KEY(key_menu_messages), //! // Keyboard shortcut to load the last quicksave. // - CONFIG_VARIABLE_KEY(key_menu_qload, key_menu_qload), + CONFIG_VARIABLE_KEY(key_menu_qload), //! // Keyboard shortcut to quit the game. // - CONFIG_VARIABLE_KEY(key_menu_quit, key_menu_quit), + CONFIG_VARIABLE_KEY(key_menu_quit), //! // Keyboard shortcut to toggle the gamma correction level. // - CONFIG_VARIABLE_KEY(key_menu_gamma, key_menu_gamma), + CONFIG_VARIABLE_KEY(key_menu_gamma), //! // Keyboard shortcut to increase the screen size. // - CONFIG_VARIABLE_KEY(key_menu_incscreen, key_menu_incscreen), + CONFIG_VARIABLE_KEY(key_menu_incscreen), //! // Keyboard shortcut to decrease the screen size. // - CONFIG_VARIABLE_KEY(key_menu_decscreen, key_menu_decscreen), + CONFIG_VARIABLE_KEY(key_menu_decscreen), //! // Key to toggle the map view. // - CONFIG_VARIABLE_KEY(key_map_toggle, key_map_toggle), + CONFIG_VARIABLE_KEY(key_map_toggle), //! // Key to pan north when in the map view. // - CONFIG_VARIABLE_KEY(key_map_north, key_map_north), + CONFIG_VARIABLE_KEY(key_map_north), //! // Key to pan south when in the map view. // - CONFIG_VARIABLE_KEY(key_map_south, key_map_south), + CONFIG_VARIABLE_KEY(key_map_south), //! // Key to pan east when in the map view. // - CONFIG_VARIABLE_KEY(key_map_east, key_map_east), + CONFIG_VARIABLE_KEY(key_map_east), //! // Key to pan west when in the map view. // - CONFIG_VARIABLE_KEY(key_map_west, key_map_west), + CONFIG_VARIABLE_KEY(key_map_west), //! // Key to zoom in when in the map view. // - CONFIG_VARIABLE_KEY(key_map_zoomin, key_map_zoomin), + CONFIG_VARIABLE_KEY(key_map_zoomin), //! // Key to zoom out when in the map view. // - CONFIG_VARIABLE_KEY(key_map_zoomout, key_map_zoomout), + CONFIG_VARIABLE_KEY(key_map_zoomout), //! // Key to zoom out the maximum amount when in the map view. // - CONFIG_VARIABLE_KEY(key_map_maxzoom, key_map_maxzoom), + CONFIG_VARIABLE_KEY(key_map_maxzoom), //! // Key to toggle follow mode when in the map view. // - CONFIG_VARIABLE_KEY(key_map_follow, key_map_follow), + CONFIG_VARIABLE_KEY(key_map_follow), //! // Key to toggle the grid display when in the map view. // - CONFIG_VARIABLE_KEY(key_map_grid, key_map_grid), + CONFIG_VARIABLE_KEY(key_map_grid), //! // Key to set a mark when in the map view. // - CONFIG_VARIABLE_KEY(key_map_mark, key_map_mark), + CONFIG_VARIABLE_KEY(key_map_mark), //! // Key to clear all marks when in the map view. // - CONFIG_VARIABLE_KEY(key_map_clearmark, key_map_clearmark), + CONFIG_VARIABLE_KEY(key_map_clearmark), //! // Key to select weapon 1. // - CONFIG_VARIABLE_KEY(key_weapon1, key_weapon1), + CONFIG_VARIABLE_KEY(key_weapon1), //! // Key to select weapon 2. // - CONFIG_VARIABLE_KEY(key_weapon2, key_weapon2), + CONFIG_VARIABLE_KEY(key_weapon2), //! // Key to select weapon 3. // - CONFIG_VARIABLE_KEY(key_weapon3, key_weapon3), + CONFIG_VARIABLE_KEY(key_weapon3), //! // Key to select weapon 4. // - CONFIG_VARIABLE_KEY(key_weapon4, key_weapon4), + CONFIG_VARIABLE_KEY(key_weapon4), //! // Key to select weapon 5. // - CONFIG_VARIABLE_KEY(key_weapon5, key_weapon5), + CONFIG_VARIABLE_KEY(key_weapon5), //! // Key to select weapon 6. // - CONFIG_VARIABLE_KEY(key_weapon6, key_weapon6), + CONFIG_VARIABLE_KEY(key_weapon6), //! // Key to select weapon 7. // - CONFIG_VARIABLE_KEY(key_weapon7, key_weapon7), + CONFIG_VARIABLE_KEY(key_weapon7), //! // Key to select weapon 8. // - CONFIG_VARIABLE_KEY(key_weapon8, key_weapon8), + CONFIG_VARIABLE_KEY(key_weapon8), //! // Key to re-display last message. // - CONFIG_VARIABLE_KEY(key_message_refresh, key_message_refresh), + CONFIG_VARIABLE_KEY(key_message_refresh), }; static default_collection_t extra_defaults = @@ -1047,6 +1003,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', @@ -1084,6 +1057,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); @@ -1166,18 +1146,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; } @@ -1201,59 +1183,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 // @@ -1264,6 +1247,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 @@ -1279,8 +1286,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"); @@ -1292,8 +1299,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); @@ -1301,8 +1309,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"); @@ -1316,23 +1324,58 @@ 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) { #if !defined(_WIN32) || defined(_WIN32_WCE) @@ -1341,6 +1384,7 @@ void M_SetConfigDir(void) // save in the current directory. char *homedir; + char *result; homedir = getenv("HOME"); @@ -1349,112 +1393,44 @@ void M_SetConfigDir(void) // put all configuration in a config directory off the // homedir - configdir = malloc(strlen(homedir) + strlen(PACKAGE_TARNAME) + 5); - - sprintf(configdir, "%s%c.%s%c", homedir, DIR_SEPARATOR, - PACKAGE_TARNAME, DIR_SEPARATOR); + result = malloc(strlen(homedir) + strlen(PACKAGE_TARNAME) + 5); - // make the directory if it doesnt already exist + sprintf(result, "%s%c.%s%c", homedir, DIR_SEPARATOR, + PACKAGE_TARNAME, DIR_SEPARATOR); - M_MakeDirectory(configdir); + return result; } else #endif /* #ifndef _WIN32 */ { -#if defined(_WIN32) && !defined(_WIN32_WCE) - //! - // @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\\"); - - M_MakeDirectory(configdir); - } - else -#endif - { - configdir = strdup(""); - } + return strdup(""); } } -#ifdef _WIN32_WCE - -static int SystemHasKeyboard(void) -{ - HKEY key; - DWORD valtype; - DWORD valsize; - DWORD result; - - if (RegOpenKeyExW(HKEY_CURRENT_USER, - L"\\Software\\Microsoft\\Shell", 0, - KEY_READ, &key) != ERROR_SUCCESS) - { - return 0; - } - - valtype = REG_SZ; - valsize = sizeof(DWORD); - - if (RegQueryValueExW(key, L"HasKeyboard", NULL, &valtype, - (LPBYTE) &result, &valsize) != ERROR_SUCCESS) - { - result = 0; - } - - // Close the key - - RegCloseKey(key); - - return result; -} - +// +// SetConfigDir: // -// Apply custom defaults for Windows CE. +// Sets the location of the configuration directory, where configuration +// files are stored - default.cfg, chocolate-doom.cfg, savegames, etc. // -static void M_ApplyWindowsCEDefaults(void) +void M_SetConfigDir(char *dir) { - // If the system doesn't have a keyboard, patch the default - // configuration to use the hardware keys. + // Use the directory that was passed, or find the default. - if (!SystemHasKeyboard()) + if (dir != NULL) { - key_use = KEY_F1; - key_fire = KEY_F2; - key_menu_activate = KEY_F3; - key_map_toggle = KEY_F4; - - key_menu_help = 0; - key_menu_save = 0; - key_menu_load = 0; - key_menu_volume = 0; - - key_menu_confirm = KEY_ENTER; - key_menu_back = KEY_F2; - key_menu_abort = KEY_F2; + configdir = dir; + } + else + { + configdir = GetDefaultConfigDir(); } -} -#endif + printf("Using %s for configuration and saves\n", configdir); -// -// Apply custom patches to the default values depending on the -// platform we are running on. -// + // Make the directory if it doesn't already exist: -void M_ApplyPlatformDefaults(void) -{ -#ifdef _WIN32_WCE - M_ApplyWindowsCEDefaults(); -#endif + M_MakeDirectory(configdir); } |