diff options
Diffstat (limited to 'src/m_config.c')
-rw-r--r-- | src/m_config.c | 1121 |
1 files changed, 615 insertions, 506 deletions
diff --git a/src/m_config.c b/src/m_config.c index d0fd5185..762e6eaf 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,46 +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 "SDL_mixer.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 "s_sound.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 @@ -76,144 +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_spy; - -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_prevweapon; -extern int key_nextweapon; - -extern int key_message_refresh; -extern int key_demo_quit; - -extern int key_multi_msg; -extern int key_multi_msgplayer[]; - -extern int mousebfire; -extern int mousebstrafe; -extern int mousebforward; - -extern int mousebstrafeleft; -extern int mousebstraferight; -extern int mousebbackward; -extern int mousebuse; - -extern int mousebprevweapon; -extern int mousebnextweapon; - -extern int dclick_use; - -extern int joybfire; -extern int joybstrafe; -extern int joybuse; -extern int joybspeed; -extern int joybstrafeleft; -extern int joybstraferight; - -extern int joybprevweapon; -extern int joybnextweapon; - -extern int viewwidth; -extern int viewheight; - -extern int mouseSensitivity; -extern int showMessages; - -// 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; -extern int opl_io_port; - -// 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; +char *configdir; + +// Default filenames for configuration files. + +static char *default_main_config; +static char *default_extra_config; typedef enum { @@ -227,10 +69,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; @@ -238,35 +80,39 @@ 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_GENERIC(name, variable, type) \ - { #name, &variable, type, 0, 0 } +#define CONFIG_VARIABLE_GENERIC(name, type) \ + { #name, NULL, type, 0, 0, false } -#define CONFIG_VARIABLE_KEY(name, variable) \ - CONFIG_VARIABLE_GENERIC(name, variable, DEFAULT_KEY) -#define CONFIG_VARIABLE_INT(name, variable) \ - CONFIG_VARIABLE_GENERIC(name, variable, DEFAULT_INT) -#define CONFIG_VARIABLE_INT_HEX(name, variable) \ - CONFIG_VARIABLE_GENERIC(name, variable, DEFAULT_INT_HEX) -#define CONFIG_VARIABLE_FLOAT(name, variable) \ - CONFIG_VARIABLE_GENERIC(name, variable, DEFAULT_FLOAT) -#define CONFIG_VARIABLE_STRING(name, variable) \ - CONFIG_VARIABLE_GENERIC(name, variable, DEFAULT_STRING) +#define CONFIG_VARIABLE_KEY(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_KEY) +#define CONFIG_VARIABLE_INT(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_INT) +#define CONFIG_VARIABLE_INT_HEX(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_INT_HEX) +#define CONFIG_VARIABLE_FLOAT(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_FLOAT) +#define CONFIG_VARIABLE_STRING(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_STRING) //! @begin_config_file default.cfg @@ -281,19 +127,32 @@ 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, dialogue text is displayed over characters' pictures + // when engaging actors who have voices. (Strife only) + // + + CONFIG_VARIABLE_INT(show_talk), + + //! + // Volume of voice sound effects, range 0-15. (Strife only) + // + + CONFIG_VARIABLE_INT(voice_volume), //! // If non-zero, messages are displayed on the heads-up display @@ -301,55 +160,193 @@ 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 use health. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_useHealth), + + //! + // 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 query inventory. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_invquery), + + //! + // Keyboard key to display mission objective. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_mission), + + //! + // Keyboard key to display inventory popup. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_invPop), + + //! + // Keyboard key to display keys popup. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_invKey), + + //! + // Keyboard key to jump to start of inventory. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_invHome), + + //! + // Keyboard key to jump to end of inventory. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_invEnd), + + //! + // 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 scroll left in the inventory. (Strife) + // + + CONFIG_VARIABLE_KEY(key_invLeft), + + //! + // Keyboard key to scroll right in the inventory. (Strife) + // + + CONFIG_VARIABLE_KEY(key_invRight), + + //! + // Keyboard key to use the current item in the inventory. + // + + CONFIG_VARIABLE_KEY(key_useartifact), + + //! + // Keyboard key to use inventory item. (Strife) + // + + CONFIG_VARIABLE_KEY(key_invUse), + + //! + // Keyboard key to drop an inventory item. (Strife only) + // + + CONFIG_VARIABLE_KEY(key_invDrop), + + //! + // Keyboard key to look up. (Strife) + // + + CONFIG_VARIABLE_KEY(key_lookUp), + + //! + // Keyboard key to look down. (Strife) + // + + CONFIG_VARIABLE_KEY(key_lookDown), //! // 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 @@ -357,63 +354,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. @@ -421,7 +424,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. @@ -431,27 +440,37 @@ static default_t doom_defaults_list[] = // status bar displayed. // - CONFIG_VARIABLE_INT(screenblocks, screenblocks), + CONFIG_VARIABLE_INT(screenblocks), + + //! + // Screen size, range 3-11. + // + // A value of 11 gives a full-screen view with the status bar not + // displayed. A value of 10 gives a full-screen view with the + // status bar displayed. (Strife only) + // + + CONFIG_VARIABLE_INT(screensize), //! // 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 @@ -460,31 +479,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 @@ -492,67 +511,99 @@ 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), + + //! + // Name of background flat used by view border. (Strife only) + // + + CONFIG_VARIABLE_STRING(back_flat), + + //! + // Multiplayer nickname (?). (Strife only) + // + + CONFIG_VARIABLE_STRING(nickname), //! // 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), + + //! + // Serial port number to use for SERSETUP.EXE (unused). + // (Strife only) + // + + CONFIG_VARIABLE_INT(comport), }; static default_collection_t doom_defaults = @@ -567,26 +618,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 @@ -595,7 +653,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 @@ -604,7 +662,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 @@ -613,13 +671,13 @@ static default_t extra_defaults_list[] = // will run. // - CONFIG_VARIABLE_INT(screen_height, screen_height), + CONFIG_VARIABLE_INT(screen_height), //! // Color depth of the screen, in bits. // - CONFIG_VARIABLE_INT(screen_bpp, screen_bpp), + CONFIG_VARIABLE_INT(screen_bpp), //! // If this is non-zero, the mouse will be "grabbed" when running @@ -627,7 +685,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 @@ -635,7 +693,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 @@ -643,7 +701,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 @@ -651,28 +709,35 @@ 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), + + //! + // Maximum number of bytes to allocate for caching converted sound + // effects in memory. If set to zero, there is no limit applied. + // + + CONFIG_VARIABLE_INT(snd_cachesize), //! // The I/O port to use to access the OPL chip. Only relevant when // using native OPL music playback. // - CONFIG_VARIABLE_INT_HEX(opl_io_port, opl_io_port), + CONFIG_VARIABLE_INT_HEX(opl_io_port), //! // 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 @@ -681,7 +746,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 @@ -690,7 +755,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 @@ -698,14 +763,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 @@ -714,7 +779,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 @@ -723,98 +788,98 @@ 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), //! // Joystick button to cycle to the previous weapon. // - CONFIG_VARIABLE_INT(joyb_prevweapon, joybprevweapon), + CONFIG_VARIABLE_INT(joyb_prevweapon), //! // Joystick button to cycle to the next weapon. // - CONFIG_VARIABLE_INT(joyb_nextweapon, joybnextweapon), + CONFIG_VARIABLE_INT(joyb_nextweapon), //! // 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), //! // Mouse button to cycle to the previous weapon. // - CONFIG_VARIABLE_INT(mouseb_prevweapon, mousebprevweapon), + CONFIG_VARIABLE_INT(mouseb_prevweapon), //! // Mouse button to cycle to the next weapon. // - CONFIG_VARIABLE_INT(mouseb_nextweapon, mousebnextweapon), + CONFIG_VARIABLE_INT(mouseb_nextweapon), //! // 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 @@ -831,7 +896,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 @@ -839,319 +904,343 @@ 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 switch view in multiplayer. // - CONFIG_VARIABLE_KEY(key_spy, key_spy), + CONFIG_VARIABLE_KEY(key_spy), //! // 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 cycle to the previous weapon. // - CONFIG_VARIABLE_KEY(key_prevweapon, key_prevweapon), + CONFIG_VARIABLE_KEY(key_prevweapon), //! // Key to cycle to the next weapon. // - CONFIG_VARIABLE_KEY(key_nextweapon, key_nextweapon), + CONFIG_VARIABLE_KEY(key_nextweapon), //! // Key to re-display last message. // - CONFIG_VARIABLE_KEY(key_message_refresh, key_message_refresh), + CONFIG_VARIABLE_KEY(key_message_refresh), //! // Key to quit the game when recording a demo. // - CONFIG_VARIABLE_KEY(key_demo_quit, key_demo_quit), + CONFIG_VARIABLE_KEY(key_demo_quit), //! // Key to send a message during multiplayer games. // - CONFIG_VARIABLE_KEY(key_multi_msg, key_multi_msg), + CONFIG_VARIABLE_KEY(key_multi_msg), + + //! + // Key to send a message to player 1 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer1), + + //! + // Key to send a message to player 2 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer2), + + //! + // Key to send a message to player 3 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer3), + + //! + // Key to send a message to player 4 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer4), //! - // Key to send a message to the green player during multiplayer games. + // Key to send a message to player 5 during multiplayer games. // - CONFIG_VARIABLE_KEY(key_multi_msgplayer1, key_multi_msgplayer[0]), + CONFIG_VARIABLE_KEY(key_multi_msgplayer5), //! - // Key to send a message to the indigo player during multiplayer games. + // Key to send a message to player 6 during multiplayer games. // - CONFIG_VARIABLE_KEY(key_multi_msgplayer2, key_multi_msgplayer[1]), + CONFIG_VARIABLE_KEY(key_multi_msgplayer6), //! - // Key to send a message to the brown player during multiplayer games. + // Key to send a message to player 7 during multiplayer games. // - CONFIG_VARIABLE_KEY(key_multi_msgplayer3, key_multi_msgplayer[2]), + CONFIG_VARIABLE_KEY(key_multi_msgplayer7), //! - // Key to send a message to the red player during multiplayer games. + // Key to send a message to player 8 during multiplayer games. // - CONFIG_VARIABLE_KEY(key_multi_msgplayer4, key_multi_msgplayer[3]), + CONFIG_VARIABLE_KEY(key_multi_msgplayer8), }; static default_collection_t extra_defaults = @@ -1161,6 +1250,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', @@ -1198,6 +1304,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); @@ -1294,18 +1407,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; } @@ -1329,67 +1444,68 @@ static void LoadDefaultCollection(default_collection_t *collection) // Find the setting in the list - for (i=0; i<collection->numdefaults; ++i) + def = SearchCollection(collection, defname); + + if (def == NULL || !def->bound) { - default_t *def = &collection->defaults[i]; - char *s; - int intparm; - - if (strcmp(defname, def->name) != 0) - { - // not this one - continue; - } - - // parameter found - - switch (def->type) - { - case DEFAULT_STRING: - s = strdup(strparm + 1); - s[strlen(s) - 1] = '\0'; - * (char **) def->location = s; - break; - - case DEFAULT_INT: - case DEFAULT_INT_HEX: - * (int *) def->location = ParseIntParameter(strparm); - break; - - case DEFAULT_KEY: - - // translate scancodes read from config - // file (save the old value in untranslated) - - intparm = ParseIntParameter(strparm); - defaults[i].untranslated = intparm; - if (intparm >= 0 && intparm < 128) - { - intparm = scantokey[intparm]; - } - else - { - intparm = 0; - } + // Unknown variable? Unbound variables are also treated + // as unknown. + + continue; + } + + // parameter found + + switch (def->type) + { + case DEFAULT_STRING: + s = strdup(strparm + 1); + s[strlen(s) - 1] = '\0'; + * (char **) def->location = s; + break; - defaults[i].original_translated = intparm; - * (int *) def->location = intparm; - break; + case DEFAULT_INT: + case DEFAULT_INT_HEX: + * (int *) def->location = ParseIntParameter(strparm); + break; + + case DEFAULT_KEY: - case DEFAULT_FLOAT: - * (float *) def->location = (float) atof(strparm); - break; - } + // translate scancodes read from config + // file (save the old value in untranslated) - // finish + intparm = ParseIntParameter(strparm); + def->untranslated = intparm; + if (intparm >= 0 && intparm < 128) + { + intparm = scantokey[intparm]; + } + else + { + intparm = 0; + } - break; + def->original_translated = intparm; + * (int *) def->location = intparm; + 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 // @@ -1400,6 +1516,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 @@ -1415,8 +1555,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_CheckParmWithArgs("-config", 1); @@ -1428,8 +1568,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); @@ -1437,8 +1578,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_CheckParmWithArgs("-extraconfig", 1); @@ -1452,23 +1593,58 @@ void M_LoadDefaults (void) else { extra_defaults.filename - = malloc(strlen(configdir) + strlen(PROGRAM_PREFIX) + 15); - sprintf(extra_defaults.filename, "%s%sdoom.cfg", - configdir, PROGRAM_PREFIX); + = 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) @@ -1477,6 +1653,7 @@ void M_SetConfigDir(void) // save in the current directory. char *homedir; + char *result; homedir = getenv("HOME"); @@ -1485,149 +1662,81 @@ 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 +// +// SetConfigDir: +// +// Sets the location of the configuration directory, where configuration +// files are stored - default.cfg, chocolate-doom.cfg, savegames, etc. +// -static int SystemHasKeyboard(void) +void M_SetConfigDir(char *dir) { - HKEY key; - DWORD valtype; - DWORD valsize; - DWORD result; - - if (RegOpenKeyExW(HKEY_CURRENT_USER, - L"\\Software\\Microsoft\\Shell", 0, - KEY_READ, &key) != ERROR_SUCCESS) + // Use the directory that was passed, or find the default. + + if (dir != NULL) { - return 0; + configdir = dir; } - - valtype = REG_SZ; - valsize = sizeof(DWORD); - - if (RegQueryValueExW(key, L"HasKeyboard", NULL, &valtype, - (LPBYTE) &result, &valsize) != ERROR_SUCCESS) + else { - result = 0; + configdir = GetDefaultConfigDir(); } - // Close the key - - RegCloseKey(key); - - return result; -} - -// -// Apply custom defaults for Windows CE. -// + printf("Using %s for configuration and saves\n", configdir); -static void M_ApplyWindowsCEDefaults(void) -{ - // If the system doesn't have a keyboard, patch the default - // configuration to use the hardware keys. + // Make the directory if it doesn't already exist: - if (!SystemHasKeyboard()) - { - 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; - } + M_MakeDirectory(configdir); } -#endif - // -// Apply custom patches to the default values depending on the -// platform we are running on. +// Calculate the path to the directory to use to store save games. +// Creates the directory as necessary. // -void M_ApplyPlatformDefaults(void) +char *M_GetSaveGameDir(char *iwadname) { -#ifdef _WIN32_WCE - M_ApplyWindowsCEDefaults(); -#endif + char *savegamedir; - // Before SDL_mixer version 1.2.11, MIDI music caused the game - // to crash when it looped. If this is an old SDL_mixer version, - // disable MIDI. + // If not "doing" a configuration directory (Windows), don't "do" + // a savegame directory, either. -#ifdef __MACOSX__ + if (!strcmp(configdir, "")) { - const SDL_version *v = Mix_Linked_Version(); - - if (SDL_VERSIONNUM(v->major, v->minor, v->patch) - < SDL_VERSIONNUM(1, 2, 11)) - { - snd_musicdevice = SNDDEVICE_NONE; - } + savegamedir = strdup(""); } -#endif + else + { + // ~/.chocolate-doom/savegames/ - // Windows Vista or later? Set screen color depth to - // 32 bits per pixel, as 8-bit palettized screen modes - // don't work properly in recent versions. + savegamedir = malloc(strlen(configdir) + 30); + sprintf(savegamedir, "%ssavegames%c", configdir, + DIR_SEPARATOR); -#if defined(_WIN32) && !defined(_WIN32_WCE) - { - OSVERSIONINFOEX version_info; + M_MakeDirectory(savegamedir); - ZeroMemory(&version_info, sizeof(OSVERSIONINFOEX)); - version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + // eg. ~/.chocolate-doom/savegames/doom2.wad/ - GetVersionEx((OSVERSIONINFO *) &version_info); + sprintf(savegamedir + strlen(savegamedir), "%s%c", + iwadname, DIR_SEPARATOR); - if (version_info.dwPlatformId == VER_PLATFORM_WIN32_NT - && version_info.dwMajorVersion >= 6) - { - screen_bpp = 32; - } + M_MakeDirectory(savegamedir); } -#endif + + return savegamedir; } |