/* M_misc.c */ #ifdef __NeXT__ #include #else #include #include #include #include #include #include #endif #include #include "doomdef.h" #include "soundst.h" int myargc; char **myargv; extern char* gl_Driver; long do_fullscreen; long do_grabMouse; /* //--------------------------------------------------------------------------- // // 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); assert(file); 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); assert(myargv); 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 ============================================================================== */ long usemouse; long usejoystick; extern long key_right, key_left, key_up, key_down; extern long key_strafeleft, key_straferight; extern long key_fire, key_use, key_strafe, key_speed; extern long key_flyup, key_flydown, key_flycenter; extern long key_lookup, key_lookdown, key_lookcenter; extern long key_invleft, key_invright, key_useartifact; extern long mousebfire; extern long mousebstrafe; extern long mousebforward; extern long joybfire; extern long joybstrafe; extern long joybuse; extern long joybspeed; extern int viewwidth, viewheight; /* rhandeev: differentiated mouse X and Y sensitivity */ long mouseXSensitivity; long mouseYSensitivity; /* rhandeev: added mouse invert and mouse look features */ long mouseInvert; long mouseLook; extern long screenblocks; extern char *chat_macros[10]; #ifdef GL_HERETIC extern long usecoronas; extern long g_bMD2; extern long g_bMD2Light, g_bDynLight, g_bSmoothSprite, g_bMonsterLight, g_bPlayerLight; /* extern H_boolean g_bMD2Interpol; */ extern long g_iMaxImpacts; #endif typedef struct { char *name; long *location; long defaultvalue; int scantranslate; /* PC scan code hack */ int untranslated; /* lousy hack */ } default_t; extern long numChannels; #ifdef __DOSOUND__ extern long mb_used; #endif #if defined(__DOSOUND__) || defined(__DOMUSIC__) #include "i_sound.h" #endif #ifdef LINUX_MOUSE char* mousetype; char* mousedev; #endif #ifndef __NeXT__ extern long numChannels; 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[] = { #ifdef UNIX { "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_fire", &key_fire, KEY_RCTRL, 1 }, { "key_use", &key_use, ' ', 1 }, { "key_strafe", &key_strafe, KEY_RALT, 1 }, { "key_speed", &key_speed, KEY_RSHIFT, 1 }, { "key_flyup", &key_flyup, KEY_PAGEUP }, { "key_flydown", &key_flydown, KEY_INSERT }, { "key_flycenter", &key_flycenter, KEY_HOME }, { "key_lookup", &key_lookup, KEY_PAGEDOWN }, { "key_lookdown", &key_lookdown, KEY_DELETE }, { "key_lookcenter", &key_lookcenter, KEY_END }, #ifdef ORIG_INVKEYS { "key_invleft", &key_invleft, '[' }, { "key_invright", &key_invright, ']' }, #else { "key_invleft", &key_invleft, 'k' }, { "key_invright", &key_invright, 'l' }, #endif { "key_useartifact", &key_useartifact, KEY_ENTER }, #ifdef SNDSERV {"sndserver", (long *) &sndserver_filename, (long) "sndserver"}, {"sndopts", (long *) &sndserver_options, (long) "-quiet"}, #endif #ifdef __DOSOUND__ {"mb_used", &mb_used, 2}, #endif #ifdef MUSSERV {"musserver", (long *) &musserver_filename, (long) "musserver"}, {"musopts", (long *) &musserver_options, (long) ""}, #endif #endif #ifdef LINUX_MOUSE {"mousedev", (long *)&mousedev, (long) "/dev/mouse"}, {"mousetype", (long *)&mousetype, (long) "microsoft"}, #endif { "use_mouse", &usemouse, 1 }, { "mouseb_fire", &mousebfire, 0 }, { "mouseb_strafe", &mousebstrafe, 1 }, { "mouseb_forward", &mousebforward, 2 }, { "mouse_sensitivity", &mouseXSensitivity, 5 }, /* rhandeev: added mouse Y sensitivity default */ { "mouse_ysensitivity", &mouseYSensitivity, 5 }, /* rhandeev: added mouseLook, mouseInvert defaults */ { "mouse_look", &mouseLook, 1 }, { "mouse_invert", &mouseInvert, 0 }, {"grabMouse", &do_grabMouse, 1}, { "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", &numChannels, 3 }, #ifdef GL_HERETIC { "usegamma", &usegamma, 5 }, #else { "usegamma", &usegamma, 1 }, #endif {"fullscreen", &do_fullscreen, 1}, #ifdef GL_HERETIC {"smoothsprites", &g_bSmoothSprite, 0}, {"usecoronas", &usecoronas, 1}, {"useMD2", &g_bMD2, 0}, {"dynamiclighting", &g_bDynLight, 2}, {"MD2lighting", &g_bMD2Light, 2}, {"monsterlighting", &g_bMonsterLight,1}, {"playerlighting", &g_bPlayerLight,1}, /* {"MD2interpolated", &g_bMD2Interpol,1}, */ {"MaxImpacts", &g_iMaxImpacts,10}, {"gl_driver", (long *)&gl_Driver, (long) "libGL.so"}, #endif { "chatmacro0", (long *) &chat_macros[0], (long) HUSTR_CHATMACRO0 }, { "chatmacro1", (long *) &chat_macros[1], (long) HUSTR_CHATMACRO1 }, { "chatmacro2", (long *) &chat_macros[2], (long) HUSTR_CHATMACRO2 }, { "chatmacro3", (long *) &chat_macros[3], (long) HUSTR_CHATMACRO3 }, { "chatmacro4", (long *) &chat_macros[4], (long) HUSTR_CHATMACRO4 }, { "chatmacro5", (long *) &chat_macros[5], (long) HUSTR_CHATMACRO5 }, { "chatmacro6", (long *) &chat_macros[6], (long) HUSTR_CHATMACRO6 }, { "chatmacro7", (long *) &chat_macros[7], (long) HUSTR_CHATMACRO7 }, { "chatmacro8", (long *) &chat_macros[8], (long) HUSTR_CHATMACRO8 }, { "chatmacro9", (long *) &chat_macros[9], (long) 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]; /* changed from char *newstring */ char *newstring=NULL; 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