diff options
Diffstat (limited to 'src/heretic/m_misc.c')
-rw-r--r-- | src/heretic/m_misc.c | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/src/heretic/m_misc.c b/src/heretic/m_misc.c new file mode 100644 index 00000000..465d0fe1 --- /dev/null +++ b/src/heretic/m_misc.c @@ -0,0 +1,388 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA. +// +//----------------------------------------------------------------------------- + +// M_misc.c + +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <stdlib.h> + +#include <ctype.h> + +#include "doomdef.h" +#include "i_swap.h" +#include "i_video.h" +#include "m_argv.h" +#include "s_sound.h" + +//--------------------------------------------------------------------------- +// +// FUNC M_ValidEpisodeMap +// +//--------------------------------------------------------------------------- + +boolean M_ValidEpisodeMap(int episode, int map) +{ + if (episode < 1 || map < 1 || map > 9) + { + return false; + } + if (gamemode == shareware) + { // Shareware version checks + if (episode != 1) + { + return false; + } + } + else if (ExtendedWAD) + { // Extended version checks + if (episode == 6) + { + if (map > 3) + { + return false; + } + } + else if (episode > 5) + { + return false; + } + } + else + { // Registered version checks + if (episode == 4) + { + if (map != 1) + { + return false; + } + } + else if (episode > 3) + { + return false; + } + } + return true; +} + +//--------------------------------------------------------------------------- +// +// PROC M_ForceUppercase +// +// Change string to uppercase. +// +//--------------------------------------------------------------------------- + +void M_ForceUppercase(char *text) +{ + char c; + + while ((c = *text) != 0) + { + if (c >= 'a' && c <= 'z') + { + *text++ = c - ('a' - 'A'); + } + else + { + text++; + } + } +} + +/* +============================================================================== + + DEFAULTS + +============================================================================== +*/ + +int usemouse; +int usejoystick; + +extern int usegamma; +extern int key_right, key_left, key_up, key_down; +extern int key_strafeleft, key_straferight; +extern int key_fire, key_use, key_strafe, key_speed; +extern int key_flyup, key_flydown, key_flycenter; +extern int key_lookup, key_lookdown, key_lookcenter; +extern int key_invleft, key_invright, key_useartifact; + +extern int mousebfire; +extern int mousebstrafe; +extern int mousebforward; + +extern int joybfire; +extern int joybstrafe; +extern int joybuse; +extern int joybspeed; + +extern int viewwidth, viewheight; + +int mouseSensitivity; + +extern int screenblocks; + +extern char *chat_macros[10]; + +typedef struct +{ + char *name; + int *location; + int defaultvalue; + int scantranslate; // PC scan code hack + int untranslated; // lousy hack +} default_t; + +extern int snd_Channels; +extern int snd_DesiredMusicDevice, snd_DesiredSfxDevice; +extern int snd_MusicDevice, // current music card # (index to dmxCodes) + snd_SfxDevice; // current sfx card # (index to dmxCodes) + +extern int snd_SBport, snd_SBirq, snd_SBdma; // sound blaster variables +extern int snd_Mport; // midi variables + +default_t defaults[] = { + {"mouse_sensitivity", &mouseSensitivity, 5}, + + {"sfx_volume", &snd_MaxVolume, 10}, + {"music_volume", &snd_MusicVolume, 10}, + +#define SC_UPARROW 0x48 +#define SC_DOWNARROW 0x50 +#define SC_LEFTARROW 0x4b +#define SC_RIGHTARROW 0x4d +#define SC_RCTRL 0x1d +#define SC_RALT 0x38 +#define SC_RSHIFT 0x36 +#define SC_SPACE 0x39 +#define SC_COMMA 0x33 +#define SC_PERIOD 0x34 +#define SC_PAGEUP 0x49 +#define SC_INSERT 0x52 +#define SC_HOME 0x47 +#define SC_PAGEDOWN 0x51 +#define SC_DELETE 0x53 +#define SC_END 0x4f +#define SC_ENTER 0x1c + + {"key_right", &key_right, SC_RIGHTARROW, 1}, + {"key_left", &key_left, SC_LEFTARROW, 1}, + {"key_up", &key_up, SC_UPARROW, 1}, + {"key_down", &key_down, SC_DOWNARROW, 1}, + {"key_strafeleft", &key_strafeleft, SC_COMMA, 1}, + {"key_straferight", &key_straferight, SC_PERIOD, 1}, + {"key_flyup", &key_flyup, SC_PAGEUP, 1}, + {"key_flydown", &key_flydown, SC_INSERT, 1}, + {"key_flycenter", &key_flycenter, SC_HOME, 1}, + {"key_lookup", &key_lookup, SC_PAGEDOWN, 1}, + {"key_lookdown", &key_lookdown, SC_DELETE, 1}, + {"key_lookcenter", &key_lookcenter, SC_END, 1}, + {"key_invleft", &key_invleft, 0x1a, 1}, + {"key_invright", &key_invright, 0x1b, 1}, + {"key_useartifact", &key_useartifact, SC_ENTER, 1}, + + {"key_fire", &key_fire, SC_RCTRL, 1}, + {"key_use", &key_use, SC_SPACE, 1}, + {"key_strafe", &key_strafe, SC_RALT, 1}, + {"key_speed", &key_speed, SC_RSHIFT, 1}, + + {"use_mouse", &usemouse, 1}, + {"mouseb_fire", &mousebfire, 0}, + {"mouseb_strafe", &mousebstrafe, 1}, + {"mouseb_forward", &mousebforward, 2}, + + {"use_joystick", &usejoystick, 0}, + {"joyb_fire", &joybfire, 0}, + {"joyb_strafe", &joybstrafe, 1}, + {"joyb_use", &joybuse, 3}, + {"joyb_speed", &joybspeed, 2}, + + {"screenblocks", &screenblocks, 10}, + + {"snd_channels", &snd_Channels, 3}, + {"snd_musicdevice", &snd_DesiredMusicDevice, 0}, + {"snd_sfxdevice", &snd_DesiredSfxDevice, 0}, + {"snd_sbport", &snd_SBport, 544}, + {"snd_sbirq", &snd_SBirq, -1}, + {"snd_sbdma", &snd_SBdma, -1}, + {"snd_mport", &snd_Mport, -1}, + + {"usegamma", &usegamma, 0}, + + {"chatmacro0", (int *) &chat_macros[0], (int) HUSTR_CHATMACRO0}, + {"chatmacro1", (int *) &chat_macros[1], (int) HUSTR_CHATMACRO1}, + {"chatmacro2", (int *) &chat_macros[2], (int) HUSTR_CHATMACRO2}, + {"chatmacro3", (int *) &chat_macros[3], (int) HUSTR_CHATMACRO3}, + {"chatmacro4", (int *) &chat_macros[4], (int) HUSTR_CHATMACRO4}, + {"chatmacro5", (int *) &chat_macros[5], (int) HUSTR_CHATMACRO5}, + {"chatmacro6", (int *) &chat_macros[6], (int) HUSTR_CHATMACRO6}, + {"chatmacro7", (int *) &chat_macros[7], (int) HUSTR_CHATMACRO7}, + {"chatmacro8", (int *) &chat_macros[8], (int) HUSTR_CHATMACRO8}, + {"chatmacro9", (int *) &chat_macros[9], (int) HUSTR_CHATMACRO9} +}; + +int numdefaults; +char *defaultfile; + +/* +============== += += M_SaveDefaults += +============== +*/ + +void M_SaveDefaults(void) +{ + int i, v; + FILE *f; + + f = fopen(defaultfile, "w"); + if (!f) + return; // can't write the file, but don't complain + + for (i = 0; i < numdefaults; i++) + { +#ifdef __WATCOMC__ + if (defaults[i].scantranslate) + defaults[i].location = &defaults[i].untranslated; +#endif + if (defaults[i].defaultvalue > -0xfff + && defaults[i].defaultvalue < 0xfff) + { + v = *defaults[i].location; + fprintf(f, "%s\t\t%i\n", defaults[i].name, v); + } + else + { + fprintf(f, "%s\t\t\"%s\"\n", defaults[i].name, + *(char **) (defaults[i].location)); + } + } + + fclose(f); +} + + +/* +============== += += M_LoadDefaults += +============== +*/ + +extern byte scantokey[128]; +extern char *basedefault; + +void M_LoadDefaults(void) +{ + int i, len; + FILE *f; + char def[80]; + char strparm[100]; + char *newstring; + int parm; + boolean isstring; + +// +// set everything to base values +// + numdefaults = sizeof(defaults) / sizeof(defaults[0]); + for (i = 0; i < numdefaults; i++) + *defaults[i].location = defaults[i].defaultvalue; + +// +// check for a custom default file +// + i = M_CheckParm("-config"); + if (i && i < myargc - 1) + { + defaultfile = myargv[i + 1]; + printf("default file: %s\n", defaultfile); + } + else if (cdrom) + { + defaultfile = "c:\\heretic.cd\\heretic.cfg"; + } + else + { + defaultfile = basedefault; + } + +// +// read the file in, overriding any set defaults +// + f = fopen(defaultfile, "r"); + if (f) + { + while (!feof(f)) + { + isstring = false; + if (fscanf(f, "%79s %[^\n]\n", def, strparm) == 2) + { + if (strparm[0] == '"') + { + // get a string default + isstring = true; + len = strlen(strparm); + newstring = (char *) malloc(len); + strparm[len - 1] = 0; + strcpy(newstring, strparm + 1); + } + else if (strparm[0] == '0' && strparm[1] == 'x') + sscanf(strparm + 2, "%x", &parm); + else + sscanf(strparm, "%i", &parm); + for (i = 0; i < numdefaults; i++) + if (!strcmp(def, defaults[i].name)) + { + if (!isstring) + *defaults[i].location = parm; + else + *defaults[i].location = (int) newstring; + break; + } + } + } + + fclose(f); + } + + +#ifdef __WATCOMC__ + for (i = 0; i < numdefaults; i++) + { + if (defaults[i].scantranslate) + { + parm = *defaults[i].location; + defaults[i].untranslated = parm; + *defaults[i].location = scantokey[parm]; + } + } +#endif +} + |