summaryrefslogtreecommitdiff
path: root/src/m_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/m_config.c')
-rw-r--r--src/m_config.c1121
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;
}