From 0df2cb80cf03d7259746834220d209b306a8c503 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Thu, 4 Sep 2008 23:15:36 +0000 Subject: Add GPLed Heretic/Hexen source. Subversion-branch: /branches/raven-branch Subversion-revision: 1195 --- src/heretic/m_misc.c | 798 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 798 insertions(+) create mode 100644 src/heretic/m_misc.c (limited to 'src/heretic/m_misc.c') diff --git a/src/heretic/m_misc.c b/src/heretic/m_misc.c new file mode 100644 index 00000000..6e465e90 --- /dev/null +++ b/src/heretic/m_misc.c @@ -0,0 +1,798 @@ + +// M_misc.c + +#ifdef __NeXT__ +#include +#else +#include +#include +#include +#include +#include +#endif + +#include + +#include "DoomDef.h" +#include "soundst.h" + +int myargc; +char **myargv; + +//--------------------------------------------------------------------------- +// +// FUNC M_ValidEpisodeMap +// +//--------------------------------------------------------------------------- + +boolean M_ValidEpisodeMap(int episode, int map) +{ + if(episode < 1 || map < 1 || map > 9) + { + return false; + } + if(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; +} + +/* +================= += += M_CheckParm += += Checks for the given parameter in the program's command line arguments += += Returns the argument number (1 to argc-1) or 0 if not present += +================= +*/ + +int M_CheckParm (char *check) +{ + int i; + + for (i = 1;ibox[BOXRIGHT]) + box[BOXRIGHT] = x; + if (ybox[BOXTOP]) + box[BOXTOP] = y; +} + + + +/* +================== += += M_WriteFile += +================== +*/ + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +boolean M_WriteFile (char const *name, void *source, int length) +{ + int handle, count; + + handle = open (name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + if (handle == -1) + return false; + count = write (handle, source, length); + close (handle); + + if (count < length) + return false; + + return true; +} + + +/* +================== += += M_ReadFile += +================== +*/ + +int M_ReadFile (char const *name, byte **buffer) +{ + int handle, count, length; + struct stat fileinfo; + byte *buf; + + handle = open (name, O_RDONLY | O_BINARY, 0666); + if (handle == -1) + I_Error ("Couldn't read file %s", name); + if (fstat (handle,&fileinfo) == -1) + I_Error ("Couldn't read file %s", name); + length = fileinfo.st_size; + buf = Z_Malloc (length, PU_STATIC, NULL); + count = read (handle, buf, length); + close (handle); + + if (count < length) + I_Error ("Couldn't read file %s", name); + + *buffer = buf; + return length; +} + +//--------------------------------------------------------------------------- +// +// PROC M_FindResponseFile +// +//--------------------------------------------------------------------------- + +#define MAXARGVS 100 + +void M_FindResponseFile(void) +{ + int i; + + for(i = 1; i < myargc; i++) + { + if(myargv[i][0] == '@') + { + FILE *handle; + int size; + int k; + int index; + int indexinfile; + char *infile; + char *file; + char *moreargs[20]; + char *firstargv; + + // READ THE RESPONSE FILE INTO MEMORY + handle = fopen(&myargv[i][1], "rb"); + if(!handle) + { + printf("\nNo such response file!"); + exit(1); + } + printf("Found response file %s!\n",&myargv[i][1]); + fseek (handle,0,SEEK_END); + size = ftell(handle); + fseek (handle,0,SEEK_SET); + file = malloc (size); + fread (file,size,1,handle); + fclose (handle); + + // KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG + for (index = 0,k = i+1; k < myargc; k++) + moreargs[index++] = myargv[k]; + + firstargv = myargv[0]; + myargv = malloc(sizeof(char *)*MAXARGVS); + memset(myargv,0,sizeof(char *)*MAXARGVS); + myargv[0] = firstargv; + + infile = file; + indexinfile = k = 0; + indexinfile++; // SKIP PAST ARGV[0] (KEEP IT) + do + { + myargv[indexinfile++] = infile+k; + while(k < size && + + ((*(infile+k)>= ' '+1) && (*(infile+k)<='z'))) + k++; + *(infile+k) = 0; + while(k < size && + ((*(infile+k)<= ' ') || (*(infile+k)>'z'))) + k++; + } while(k < size); + + for (k = 0;k < index;k++) + myargv[indexinfile++] = moreargs[k]; + myargc = indexinfile; + // DISPLAY ARGS + if(M_CheckParm("-debug")) + { + printf("%d command-line args:\n", myargc); + for(k = 1; k < myargc; k++) + { + printf("%s\n", myargv[k]); + } + } + break; + } + } +} + +//--------------------------------------------------------------------------- +// +// 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 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; + +#ifndef __NeXT__ +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 +#endif + +default_t defaults[] = +{ + { "mouse_sensitivity", &mouseSensitivity, 5 }, + +#ifndef __NeXT__ + { "sfx_volume", &snd_MaxVolume, 10}, + { "music_volume", &snd_MusicVolume, 10}, +#endif + +#ifdef __WATCOMC__ +#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 }, +#endif + +#ifdef __NeXT__ + { "key_right", &key_right, KEY_RIGHTARROW }, + { "key_left", &key_left, KEY_LEFTARROW }, + { "key_up", &key_up, KEY_UPARROW }, + { "key_down", &key_down, KEY_DOWNARROW }, + { "key_strafeleft", &key_strafeleft, ',' }, + { "key_straferight", &key_straferight, '.' }, + { "key_flyup", &key_flyup, 'u' }, + { "key_flydown", &key_flydown, 'j' }, + { "key_flycenter", &key_flycenter, 'k' }, + { "key_lookup", &key_lookup, 'm' }, + { "key_lookdown", &key_lookdown, 'b' }, + { "key_lookcenter", &key_lookcenter, 'n' }, + { "key_invleft", &key_invleft, '[' }, + { "key_invright", &key_invright, ']' }, + { "key_useartifact", &key_useartifact, 13 }, + + { "key_fire", &key_fire, ' ', 1 }, + { "key_use", &key_use, 'x', 1 }, + { "key_strafe", &key_strafe, 'c', 1 }, + { "key_speed", &key_speed, 'z', 1 }, +#endif + + { "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 }, + +#ifndef __NeXT__ + { "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 }, +#endif + + { "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 -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 ; imanufacturer = 0x0a; // PCX id + pcx->version = 5; // 256 color + pcx->encoding = 1; // uncompressed + pcx->bits_per_pixel = 8; // 256 color + pcx->xmin = 0; + pcx->ymin = 0; + pcx->xmax = SHORT(width-1); + pcx->ymax = SHORT(height-1); + pcx->hres = SHORT(width); + pcx->vres = SHORT(height); + memset (pcx->palette,0,sizeof(pcx->palette)); + pcx->color_planes = 1; // chunky image + pcx->bytes_per_line = SHORT(width); + pcx->palette_type = SHORT(2); // not a grey scale + memset (pcx->filler,0,sizeof(pcx->filler)); + +// +// pack the image +// + pack = &pcx->data; + + for (i=0 ; i