/* * FindIWADFIle * * Search for one of the standard IWADs * CPhipps - static, proper prototype * - 12/1999 - rewritten to use I_FindFile */ static char *FindIWADFile(void) { int i; char * iwad = NULL; i = M_CheckParm("-iwad"); if (i && (++i < myargc)) { iwad = I_FindFile(myargv[i], ".wad"); } else { for (i=0; !iwad && i<nstandard_iwads; i++) iwad = I_FindFile(standard_iwads[i], ".wad"); } return iwad; }
int CheckDemoExDemo(void) { int result = false; int p; M_ChangeDemoExtendedFormat(); p = IsDemoPlayback(); if (!p) { p = IsDemoContinue(); } if (p) { char *demoname, *filename; filename = malloc(strlen(myargv[p + 1]) + 16); strcpy(filename, myargv[p + 1]); AddDefaultExtension(filename, ".lmp"); demoname = I_FindFile(filename, NULL); if (demoname) { result = G_ReadDemoFooter(demoname); free(demoname); } free(filename); } return result; }
/* * FindIWADFIle * * Search for one of the standard IWADs * CPhipps - static, proper prototype * - 12/1999 - rewritten to use I_FindFile */ static char *FindIWADFile(void) { int i, x; char * iwad = NULL; i = M_CheckParm("-iwad"); lprintf(LO_ALWAYS, "i: %d\n", i); for(x = 0; x < 32; x++) lprintf(LO_ALWAYS, "myargv[%d]: %s\n", x, myargv[x]); if (i && (++i < myargc)) { iwad = I_FindFile(myargv[i], ".wad"); } else { for (i=0; !iwad && i<nstandard_iwads; i++) iwad = I_FindFile(standard_iwads[i], ".wad"); } return iwad; }
int IsDemoContinue(void) { int p; if ((p = M_CheckParm("-recordfromto")) && (p < myargc - 2) && I_FindFile(myargv[p + 1], ".lmp")) { return p; } return 0; }
/* ======================= StartupWithIWADandPWAD ======================= */ void StartupWithCorrectWads( int mission ) { // Look for the iwad file corresponding to the current mission. char iwad[ 1024 ]; char expansion[ 1024 ]; iphoneFindIWADFile( static_cast<iphoneMissionPack_t>(mission), expansion ); I_FindFile( expansion, ".wad", iwad ); // Look for the pwad corresponding to the current mission. Will be NULL if we don't // need a pwad for the mission. char mission_pwad[ 1024 ]; iphoneFindPWADFile( static_cast<iphoneMissionPack_t>(mission), mission_pwad ); char full_pwad[ 1024 ]; if ( mission_pwad[0] != '\0' ) { I_FindFile( mission_pwad, ".wad", full_pwad ); iphoneDoomStartup( iwad, full_pwad ); } else { iphoneDoomStartup( iwad, NULL ); } }
static char *FindIWADFile(void) { int i; char *iwad = NULL; for (i = 0; !iwad && i < nstandard_iwads; i++) iwad = I_FindFile(standard_iwads[i], ".wad"); return iwad; }
static void D_DoomMainSetup(void) { int p,slot; L_SetupConsoleMasks(); setbuf(stdout,NULL); // proff 04/05/2000: Added support for include response files /* proff 2001/7/1 - Moved up, so -config can be in response files */ { boolean rsp_found; int i; do { rsp_found=false; for (i=0; i<myargc; i++) if (myargv[i][0]=='@') rsp_found=true; FindResponseFile(); } while (rsp_found==true); } lprintf(LO_INFO,"M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults(); // load before initing other systems // figgi 09/18/00-- added switch to force classic bsp nodes if (M_CheckParm ("-forceoldbsp")) { extern boolean forceOldBsp; forceOldBsp = true; } DoLooseFiles(); // Ty 08/29/98 - handle "loose" files on command line IdentifyVersion(); // e6y: DEH files preloaded in wrong order // http://sourceforge.net/tracker/index.php?func=detail&aid=1418158&group_id=148658&atid=772943 // The dachaked stuff has been moved below an autoload // jff 1/24/98 set both working and command line value of play parms nomonsters = clnomonsters = M_CheckParm ("-nomonsters"); respawnparm = clrespawnparm = M_CheckParm ("-respawn"); fastparm = clfastparm = M_CheckParm ("-fast"); // jff 1/24/98 end of set to both working and command line value devparm = M_CheckParm ("-devparm"); if (M_CheckParm ("-altdeath")) deathmatch = 2; else if (M_CheckParm ("-deathmatch")) deathmatch = 1; { // CPhipps - localise title variable // print title for every printed line // cph - code cleaned and made smaller const char* doomverstr; switch ( gamemode ) { case retail: doomverstr = "The Ultimate DOOM"; break; case shareware: doomverstr = "DOOM Shareware"; break; case registered: doomverstr = "DOOM Registered"; break; case commercial: // Ty 08/27/98 - fixed gamemode vs gamemission switch (gamemission) { case pack_plut: doomverstr = "DOOM 2: Plutonia Experiment"; break; case pack_tnt: doomverstr = "DOOM 2: TNT - Evilution"; break; default: doomverstr = "DOOM 2: Hell on Earth"; break; } break; default: doomverstr = "Public DOOM"; break; } /* cphipps - the main display. This shows the build date, copyright, and game type */ lprintf(LO_ALWAYS,"PrBoom (built %s), playing: %s\n" "PrBoom is released under the GNU General Public license v2.0.\n" "You are welcome to redistribute it under certain conditions.\n" "It comes with ABSOLUTELY NO WARRANTY. See the file COPYING for details.\n", version_date, doomverstr); } if (devparm) //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"%s",D_DEVSTR); // turbo option if ((p=M_CheckParm ("-turbo"))) { int scale = 200; extern int forwardmove[2]; extern int sidemove[2]; if (p<myargc-1) scale = atoi(myargv[p+1]); if (scale < 10) scale = 10; if (scale > 400) scale = 400; //jff 9/3/98 use logical output routine lprintf (LO_CONFIRM,"turbo scale: %i%%\n",scale); forwardmove[0] = forwardmove[0]*scale/100; forwardmove[1] = forwardmove[1]*scale/100; sidemove[0] = sidemove[0]*scale/100; sidemove[1] = sidemove[1]*scale/100; } modifiedgame = false; // get skill / episode / map from parms startskill = sk_none; // jff 3/24/98 was sk_medium, just note not picked startepisode = 1; startmap = 1; autostart = false; if ((p = M_CheckParm ("-skill")) && p < myargc-1) { startskill = myargv[p+1][0]-'1'; autostart = true; } if ((p = M_CheckParm ("-episode")) && p < myargc-1) { startepisode = myargv[p+1][0]-'0'; startmap = 1; autostart = true; } if ((p = M_CheckParm ("-timer")) && p < myargc-1 && deathmatch) { int time = atoi(myargv[p+1]); //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"Levels will end after %d minute%s.\n", time, time>1 ? "s" : ""); } if ((p = M_CheckParm ("-avg")) && p < myargc-1 && deathmatch) //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"Austin Virtual Gaming: Levels will end after 20 minutes\n"); if ((p = M_CheckParm ("-warp")) || // killough 5/2/98 (p = M_CheckParm ("-wart"))) // Ty 08/29/98 - moved this check later so we can have -warp alone: && p < myargc-1) { startmap = 0; // Ty 08/29/98 - allow "-warp x" to go to first map in wad(s) autostart = true; // Ty 08/29/98 - move outside the decision tree if (gamemode == commercial) { if (p < myargc-1) startmap = atoi(myargv[p+1]); // Ty 08/29/98 - add test if last parm } else // 1/25/98 killough: fix -warp xxx from crashing Doom 1 / UD { if (p < myargc-2) { startepisode = atoi(myargv[++p]); startmap = atoi(myargv[p+1]); } } } // Ty 08/29/98 - later we'll check for startmap=0 and autostart=true // as a special case that -warp * was used. Actually -warp with any // non-numeric will do that but we'll only document "*" //jff 1/22/98 add command line parms to disable sound and music { int nosound = M_CheckParm("-nosound"); nomusicparm = nosound || M_CheckParm("-nomusic"); nosfxparm = nosound || M_CheckParm("-nosfx"); } //jff end of sound/music command line parms // killough 3/2/98: allow -nodraw -noblit generally nodrawers = M_CheckParm ("-nodraw"); noblit = M_CheckParm ("-noblit"); //proff 11/22/98: Added setting of viewangleoffset p = M_CheckParm("-viewangle"); if (p) { viewangleoffset = atoi(myargv[p+1]); viewangleoffset = viewangleoffset<0 ? 0 : (viewangleoffset>7 ? 7 : viewangleoffset); viewangleoffset = (8-viewangleoffset) * ANG45; } // init subsystems G_ReloadDefaults(); // killough 3/4/98: set defaults just loaded. // jff 3/24/98 this sets startskill if it was -1 // Video stuff if ((p = M_CheckParm("-width"))) if (myargv[p+1]) desired_screenwidth = atoi(myargv[p+1]); if ((p = M_CheckParm("-height"))) if (myargv[p+1]) desired_screenheight = atoi(myargv[p+1]); if ((p = M_CheckParm("-fullscreen"))) use_fullscreen = 1; if ((p = M_CheckParm("-nofullscreen"))) use_fullscreen = 0; // e6y // New command-line options for setting a window (-window) // or fullscreen (-nowindow) mode temporarily which is not saved in cfg. // It works like "-geom" switch desired_fullscreen = use_fullscreen; if ((p = M_CheckParm("-window"))) desired_fullscreen = 0; if ((p = M_CheckParm("-nowindow"))) desired_fullscreen = 1; { // -geometry handling, change screen size for this session only // e6y: new code by me int w, h; if (!(p = M_CheckParm("-geom"))) p = M_CheckParm("-geometry"); if (!(p && (p+1<myargc) && sscanf(myargv[p+1], "%dx%d", &w, &h) == 2)) { w = desired_screenwidth; h = desired_screenheight; } I_CalculateRes(w, h); } #ifdef GL_DOOM // proff 04/05/2000: for GL-specific switches gld_InitCommandLine(); #endif //jff 9/3/98 use logical output routine lprintf(LO_INFO,"V_Init: allocate screens.\n"); V_Init(); // CPhipps - autoloading of wads // Designed to be general, instead of specific to boomlump.wad // Some people might find this useful // cph - support MBF -noload parameter if (!M_CheckParm("-noload")) { int i; for (i=0; i<MAXLOADFILES*2; i++) { const char *fname = (i < MAXLOADFILES) ? wad_files[i] : deh_files[i - MAXLOADFILES]; char *fpath; if (!(fname && *fname)) continue; // Filename is now stored as a zero terminated string fpath = I_FindFile(fname, (i < MAXLOADFILES) ? ".wad" : ".bex"); if (!fpath) lprintf(LO_WARN, "Failed to autoload %s\n", fname); else { if (i >= MAXLOADFILES) ProcessDehFile(fpath, D_dehout(), 0); else { D_AddFile(fpath,source_auto_load); } modifiedgame = true; free(fpath); } } } // e6y: DEH files preloaded in wrong order // http://sourceforge.net/tracker/index.php?func=detail&aid=1418158&group_id=148658&atid=772943 // The dachaked stuff has been moved from above // ty 03/09/98 do dehacked stuff // Note: do this before any other since it is expected by // the deh patch author that this is actually part of the EXE itself // Using -deh in BOOM, others use -dehacked. // Ty 03/18/98 also allow .bex extension. .bex overrides if both exist. D_BuildBEXTables(); // haleyjd p = M_CheckParm ("-deh"); if (p) { char file[PATH_MAX+1]; // cph - localised // the parms after p are deh/bex file names, // until end of parms or another - preceded parm // Ty 04/11/98 - Allow multiple -deh files in a row while (++p != myargc && *myargv[p] != '-') { AddDefaultExtension(strcpy(file, myargv[p]), ".bex"); if (access(file, F_OK)) // nope { AddDefaultExtension(strcpy(file, myargv[p]), ".deh"); if (access(file, F_OK)) // still nope I_Error("D_DoomMainSetup: Cannot find .deh or .bex file named %s",myargv[p]); } // during the beta we have debug output to dehout.txt ProcessDehFile(file,D_dehout(),0); } } // ty 03/09/98 end of do dehacked stuff // add any files specified on the command line with -file wadfile // to the wad list // killough 1/31/98, 5/2/98: reload hack removed, -wart same as -warp now. if ((p = M_CheckParm ("-file"))) { // the parms after p are wadfile/lump names, // until end of parms or another - preceded parm modifiedgame = true; // homebrew levels while (++p != myargc && *myargv[p] != '-') D_AddFile(myargv[p],source_pwad); } if (!(p = M_CheckParm("-playdemo")) || p >= myargc-1) { /* killough */ if ((p = M_CheckParm ("-fastdemo")) && p < myargc-1) /* killough */ fastdemo = true; // run at fastest speed possible else p = M_CheckParm ("-timedemo"); } if (p && p < myargc-1) { char file[PATH_MAX+1]; // cph - localised strcpy(file,myargv[p+1]); AddDefaultExtension(file,".lmp"); // killough D_AddFile (file,source_lmp); //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"Playing demo %s\n",file); if ((p = M_CheckParm ("-ffmap")) && p < myargc-1) { ffmap = atoi(myargv[p+1]); } } // internal translucency set to config file value // phares general_translucency = default_translucency; // phares // 1/18/98 killough: Z_Init() call moved to i_main.c // CPhipps - move up netgame init //jff 9/3/98 use logical output routine lprintf(LO_INFO,"D_InitNetGame: Checking for network game.\n"); D_InitNetGame(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"W_Init: Init WADfiles.\n"); W_Init(); // CPhipps - handling of wadfiles init changed lprintf(LO_INFO,"\n"); // killough 3/6/98: add a newline, by popular demand :) // e6y // option to disable automatic loading of dehacked-in-wad lump if (!M_CheckParm ("-nodeh")) if ((p = W_CheckNumForName("DEHACKED")) != -1) // cph - add dehacked-in-a-wad support ProcessDehFile(NULL, D_dehout(), p); V_InitColorTranslation(); //jff 4/24/98 load color translation lumps // killough 2/22/98: copyright / "modified game" / SPA banners removed // Ty 04/08/98 - Add 5 lines of misc. data, only if nonblank // The expectation is that these will be set in a .bex file //jff 9/3/98 use logical output routine if (*startup1) lprintf(LO_INFO,"%s",startup1); if (*startup2) lprintf(LO_INFO,"%s",startup2); if (*startup3) lprintf(LO_INFO,"%s",startup3); if (*startup4) lprintf(LO_INFO,"%s",startup4); if (*startup5) lprintf(LO_INFO,"%s",startup5); // End new startup strings //jff 9/3/98 use logical output routine lprintf(LO_INFO,"M_Init: Init miscellaneous info.\n"); M_Init(); #ifdef HAVE_NET // CPhipps - now wait for netgame start D_CheckNetGame(); #endif //jff 9/3/98 use logical output routine lprintf(LO_INFO,"R_Init: Init DOOM refresh daemon - "); R_Init(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"\nP_Init: Init Playloop state.\n"); P_Init(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"I_Init: Setting up machine state.\n"); I_Init(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"S_Init: Setting up sound.\n"); S_Init(snd_SfxVolume /* *8 */, snd_MusicVolume /* *8*/ ); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"HU_Init: Setting up heads up display.\n"); HU_Init(); if (!(M_CheckParm("-nodraw") && M_CheckParm("-nosound"))) I_InitGraphics(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"ST_Init: Init status bar.\n"); ST_Init(); idmusnum = -1; //jff 3/17/98 insure idmus number is blank // CPhipps - auto screenshots if ((p = M_CheckParm("-autoshot")) && (p < myargc-2)) if ((auto_shot_count = auto_shot_time = atoi(myargv[p+1]))) auto_shot_fname = myargv[p+2]; // start the apropriate game based on parms // killough 12/98: // Support -loadgame with -record and reimplement -recordfrom. if ((slot = M_CheckParm("-recordfrom")) && (p = slot+2) < myargc) G_RecordDemo(myargv[p]); else { slot = M_CheckParm("-loadgame"); if ((p = M_CheckParm("-record")) && ++p < myargc) { autostart = true; G_RecordDemo(myargv[p]); } } if ((p = M_CheckParm ("-checksum")) && ++p < myargc) { P_RecordChecksum (myargv[p]); } if ((p = M_CheckParm ("-fastdemo")) && ++p < myargc) { // killough fastdemo = true; // run at fastest speed possible timingdemo = true; // show stats after quit G_DeferedPlayDemo(myargv[p]); singledemo = true; // quit after one demo } else if ((p = M_CheckParm("-timedemo")) && ++p < myargc) { singletics = true; timingdemo = true; // show stats after quit G_DeferedPlayDemo(myargv[p]); singledemo = true; // quit after one demo } else if ((p = M_CheckParm("-playdemo")) && ++p < myargc) { G_DeferedPlayDemo(myargv[p]); singledemo = true; // quit after one demo } if (slot && ++slot < myargc) { slot = atoi(myargv[slot]); // killough 3/16/98: add slot info G_LoadGame(slot, true); // killough 5/15/98: add command flag // cph - no filename } else if (!singledemo) { /* killough 12/98 */ if (autostart || netgame) { G_InitNew(startskill, startepisode, startmap); if (demorecording) G_BeginRecording(); } else D_StartTitle(); // start up intro loop } }
static void R_DemoEx_AddParams(wadtbl_t *wadtbl) { size_t i; int p; char buf[200]; char* filename_p; char* fileext_p; char *files = NULL; char *iwad = NULL; char *pwads = NULL; char *dehs = NULL; char **item; //iwad and pwads for (i = 0; i < numwadfiles; i++) { filename_p = PathFindFileName(wadfiles[i].name); fileext_p = filename_p + strlen(filename_p) - 1; while (fileext_p != filename_p && *(fileext_p - 1) != '.') fileext_p--; if (fileext_p == filename_p) continue; item = NULL; if (wadfiles[i].src == source_iwad && !iwad && !strcasecmp(fileext_p, "wad")) item = &iwad; if (wadfiles[i].src == source_pwad && !strcasecmp(fileext_p, "wad")) item = &pwads; if (item) { AddString(item, "\""); AddString(item, filename_p); AddString(item, "\" "); } } //dehs p = M_CheckParm ("-deh"); if (p) { while (++p != myargc && *myargv[p] != '-') { char *file = NULL; if ((file = I_FindFile(myargv[p], ".bex")) || (file = I_FindFile(myargv[p], ".deh"))) { filename_p = PathFindFileName(file); AddString(&dehs, "\""); AddString(&dehs, filename_p); AddString(&dehs, "\" "); free(file); } } } if (iwad) { AddString(&files, "-iwad "); AddString(&files, iwad); } if (pwads) { AddString(&files, "-file "); AddString(&files, pwads); } if (dehs) { AddString(&files, "-deh "); AddString(&files, dehs); } //add complevel for formats which do not have it in header if (demo_compatibility) { sprintf(buf, "-complevel %d ", compatibility_level); AddString(&files, buf); } //for recording or playback using "single-player coop" mode if (M_CheckParm("-solo-net")) { sprintf(buf, "-solo-net "); AddString(&files, buf); } if ((p = M_CheckParm("-emulate")) && (p < myargc - 1)) { sprintf(buf, "-emulate %s", myargv[p + 1]); AddString(&files, buf); } // doom 1.2 does not store these params in header if (compatibility_level == doom_12_compatibility) { if (M_CheckParm("-respawn")) { sprintf(buf, "-respawn "); AddString(&files, buf); } if (M_CheckParm("-fast")) { sprintf(buf, "-fast "); AddString(&files, buf); } if (M_CheckParm("-nomonsters")) { sprintf(buf, "-nomonsters "); AddString(&files, buf); } } if (spechit_baseaddr != 0 && spechit_baseaddr != DEFAULT_SPECHIT_MAGIC) { sprintf(buf, "-spechit %d ", spechit_baseaddr); AddString(&files, buf); } //overflows { overrun_list_t overflow; for (overflow = 0; overflow < OVERFLOW_MAX; overflow++) { if (overflows[overflow].shit_happens) { sprintf(buf, "-set %s=%d ", overflow_cfgname[overflow], overflows[overflow].emulate); AddString(&files, buf); } } } if (files) { W_AddLump(wadtbl, DEMOEX_PARAMS_LUMPNAME, (const byte*)files, strlen(files)); } }
static void R_DemoEx_GetParams(const byte *pwad_p, waddata_t *waddata) { int lump; size_t size; char *str; const char *data; char **params; int i, p, paramscount; lump = W_CheckNumForName(DEMOEX_PARAMS_LUMPNAME); if (lump == -1) return; size = W_LumpLength(lump); if (size <= 0) return; str = calloc(size + 1, 1); if (!str) return; data = W_CacheLumpNum(lump); strncpy(str, data, size); M_ParseCmdLine(str, NULL, NULL, ¶mscount, &i); params = malloc(paramscount * sizeof(char*) + i * sizeof(char) + 1); if (params) { struct { const char *param; wad_source_t source; } files[] = { {"-iwad" , source_iwad}, {"-file" , source_pwad}, {"-deh" , source_deh}, {NULL} }; M_ParseCmdLine(str, params, ((char*)params) + sizeof(char*) * paramscount, ¶mscount, &i); if (!M_CheckParm("-iwad") && !M_CheckParm("-file")) { i = 0; while (files[i].param) { p = M_CheckParmEx(files[i].param, params, paramscount); if (p >= 0) { while (++p != paramscount && *params[p] != '-') { char *filename; //something is wrong here filename = I_FindFile(params[p], ".wad"); if (!filename) { filename = strdup(params[p]); } WadDataAddItem(waddata, filename, files[i].source, 0); free(filename); } } i++; } } if (!M_CheckParm("-complevel")) { p = M_CheckParmEx("-complevel", params, paramscount); if (p >= 0 && p < (int)paramscount - 1) { M_AddParam("-complevel"); M_AddParam(strdup(params[p + 1])); } } //for recording or playback using "single-player coop" mode if (!M_CheckParm("-solo-net")) { p = M_CheckParmEx("-solo-net", params, paramscount); if (p >= 0) { M_AddParam("-solo-net"); } } if (!M_CheckParm("-emulate")) { p = M_CheckParmEx("-emulate", params, paramscount); if (p >= 0 && p < (int)paramscount - 1) { M_AddParam("-emulate"); M_AddParam(strdup(params[p + 1])); } } // for doom 1.2 if (!M_CheckParm("-respawn")) { p = M_CheckParmEx("-respawn", params, paramscount); if (p >= 0) { M_AddParam("-respawn"); } } // for doom 1.2 if (!M_CheckParm("-fast")) { p = M_CheckParmEx("-fast", params, paramscount); if (p >= 0) { M_AddParam("-fast"); } } // for doom 1.2 if (!M_CheckParm("-nomonsters")) { p = M_CheckParmEx("-nomonsters", params, paramscount); if (p >= 0) { M_AddParam("-nomonsters"); } } p = M_CheckParmEx("-spechit", params, paramscount); if (p >= 0 && p < (int)paramscount - 1) { spechit_baseaddr = atoi(params[p + 1]); } //overflows { overrun_list_t overflow; for (overflow = 0; overflow < OVERFLOW_MAX; overflow++) { int value; char *pstr, *mask; mask = malloc(strlen(overflow_cfgname[overflow]) + 16); if (mask) { sprintf(mask, "-set %s", overflow_cfgname[overflow]); pstr = strstr(str, mask); if (pstr) { strcat(mask, " = %d"); if (sscanf(pstr, mask, &value) == 1) { overflows[overflow].tmp_emulate = value; } } free(mask); } } } free(params); } W_UnlockLumpNum(lump); free(str); }
dboolean D_TryGetWad(const char* name) { #ifndef __CELLOS_LV2__ dboolean result = false; char wadname[PATH_MAX]; char* cmdline = NULL; char* wadname_p = NULL; char* msg = NULL; const char* format = "The necessary wad has not been found\n" "Do you want to search for \'%s\'?\n\n" "Command line:\n%s\n\n" "Be careful! Execution of an unknown program is unsafe."; if (!getwad_cmdline || !name || !(*getwad_cmdline) || !(*name)) return false; strncpy(wadname, PathFindFileName(name), sizeof(wadname) - 4); AddDefaultExtension(wadname, ".wad"); cmdline = malloc(strlen(getwad_cmdline) + strlen(wadname) + 2); wadname_p = strstr(getwad_cmdline, "%wadname%"); if (wadname_p) { strncpy(cmdline, getwad_cmdline, wadname_p - getwad_cmdline); strcat(cmdline, wadname); strcat(cmdline, wadname_p + strlen("%wadname%")); } else { sprintf(cmdline, "%s %s", getwad_cmdline, wadname); } msg = malloc(strlen(format) + strlen(wadname) + strlen(cmdline)); sprintf(msg, format, wadname, cmdline); if (PRB_IDYES == I_MessageBox(msg, PRB_MB_DEFBUTTON2 | PRB_MB_YESNO)) { int ret; lprintf(LO_INFO, "D_TryGetWad: Trying to get %s from somewhere\n", name); ret = system(cmdline); if (ret != 0) { lprintf(LO_ERROR, "D_TryGetWad: Execution failed - %s\n", strerror(errno)); } else { char *str = I_FindFile(name, ".wad"); if (str) { lprintf(LO_INFO, "D_TryGetWad: Successfully received\n"); free(str); result = true; } } } free(msg); free(cmdline); return result; #else return false; #endif }
void WadDataToWadFiles(waddata_t *waddata) { void ProcessDehFile(const char *filename, const char *outfilename, int lumpnum); const char *D_dehout(void); int i, iwadindex = -1; wadfile_info_t *old_wadfiles=NULL; size_t old_numwadfiles = numwadfiles; old_numwadfiles = numwadfiles; old_wadfiles = malloc(sizeof(*(wadfiles)) * numwadfiles); memcpy(old_wadfiles, wadfiles, sizeof(*(wadfiles)) * numwadfiles); free(wadfiles); wadfiles = NULL; numwadfiles = 0; for (i = 0; (size_t)i < waddata->numwadfiles; i++) { if (waddata->wadfiles[i].src == source_iwad) { AddIWAD(I_FindFile(waddata->wadfiles[i].name, ".wad")); iwadindex = i; break; } } if (iwadindex == -1) { I_Error("WadDataToWadFiles: IWAD not found\n"); } for (i = 0; (size_t)i < old_numwadfiles; i++) { if (old_wadfiles[i].src == source_auto_load || old_wadfiles[i].src == source_pre) { wadfiles = realloc(wadfiles, sizeof(*wadfiles)*(numwadfiles+1)); wadfiles[numwadfiles].name = strdup(old_wadfiles[i].name); wadfiles[numwadfiles].src = old_wadfiles[i].src; wadfiles[numwadfiles].handle = old_wadfiles[i].handle; numwadfiles++; } } for (i = 0; (size_t)i < waddata->numwadfiles; i++) { if (waddata->wadfiles[i].src == source_auto_load) { wadfiles = realloc(wadfiles, sizeof(*wadfiles)*(numwadfiles+1)); wadfiles[numwadfiles].name = strdup(waddata->wadfiles[i].name); wadfiles[numwadfiles].src = waddata->wadfiles[i].src; wadfiles[numwadfiles].handle = waddata->wadfiles[i].handle; numwadfiles++; } } for (i = 0; (size_t)i < waddata->numwadfiles; i++) { if (waddata->wadfiles[i].src == source_iwad && i != iwadindex) { D_AddFile(waddata->wadfiles[i].name, source_pwad); modifiedgame = true; } if (waddata->wadfiles[i].src == source_pwad) { const char *file = I_FindFile2(waddata->wadfiles[i].name, ".wad"); if (!file && D_TryGetWad(waddata->wadfiles[i].name)) { file = I_FindFile2(waddata->wadfiles[i].name, ".wad"); if (file) { free(waddata->wadfiles[i].name); waddata->wadfiles[i].name = strdup(file); } } if (file) { D_AddFile(waddata->wadfiles[i].name, source_pwad); modifiedgame = true; } } if (waddata->wadfiles[i].src == source_deh) { ProcessDehFile(waddata->wadfiles[i].name, D_dehout(), 0); } } for (i = 0; (size_t)i < waddata->numwadfiles; i++) { if (waddata->wadfiles[i].src == source_lmp || waddata->wadfiles[i].src == source_net) D_AddFile(waddata->wadfiles[i].name, waddata->wadfiles[i].src); } free(old_wadfiles); }
int ParseDemoPattern(const char *str, waddata_t* waddata, char **missed, dboolean trytodownload) { int processed = 0; wadfile_info_t *wadfiles = NULL; size_t numwadfiles = 0; char *pStr = strdup(str); char *pToken = pStr; if (missed) { *missed = NULL; } for (;(pToken = strtok(pToken,"|"));pToken = NULL) { char *token = NULL; processed++; if (trytodownload && !I_FindFile2(pToken, ".wad")) { D_TryGetWad(pToken); } #ifdef _MSC_VER token = malloc(PATH_MAX); if (GetFullPath(pToken, ".wad", token, PATH_MAX)) #else if ((token = I_FindFile(pToken, ".wad"))) #endif { wadfiles = realloc(wadfiles, sizeof(*wadfiles)*(numwadfiles+1)); wadfiles[numwadfiles].name = token; wadfiles[numwadfiles].handle = 0; if (pToken == pStr) { wadfiles[numwadfiles].src = source_iwad; } else { char *p = (char*)wadfiles[numwadfiles].name; int len = strlen(p); if (!strcasecmp(&p[len-4],".wad")) wadfiles[numwadfiles].src = source_pwad; if (!strcasecmp(&p[len-4],".deh") || !strcasecmp(&p[len-4],".bex")) wadfiles[numwadfiles].src = source_deh; } numwadfiles++; } else { if (missed) { int len = (*missed ? strlen(*missed) : 0); *missed = realloc(*missed, len + strlen(pToken) + 100); sprintf(*missed + len, " %s not found\n", pToken); } } } WadDataFree(waddata); waddata->wadfiles = wadfiles; waddata->numwadfiles = numwadfiles; free(pStr); return processed; }
bool D_DoomMainSetup(void) { int p; setbuf(stdout,NULL); // proff 04/05/2000: Added support for include response files /* proff 2001/7/1 - Moved up, so -config can be in response files */ { boolean rsp_found; int i; do { rsp_found=FALSE; for (i=0; i<myargc; i++) if (myargv[i][0]=='@') rsp_found=TRUE; if (!FindResponseFile()) goto failed; } while (rsp_found==TRUE); } lprintf(LO_INFO,"M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults(); // load before initing other systems // figgi 09/18/00-- added switch to force classic bsp nodes if (M_CheckParm ("-forceoldbsp")) { extern boolean forceOldBsp; forceOldBsp = TRUE; } D_BuildBEXTables(); // haleyjd DoLooseFiles(); // Ty 08/29/98 - handle "loose" files on command line if (!IdentifyVersion()) goto failed; // Load prboom.wad after IWAD but before everything else { char *data_wad_path = I_FindFile(PACKAGE ".wad", ".wad"); if (!data_wad_path) { I_Error(PACKAGE ".wad not found - cannot continue"); goto failed; } D_AddFile(data_wad_path, source_pre); free(data_wad_path); } // e6y: DEH files preloaded in wrong order // http://sourceforge.net/tracker/index.php?func=detail&aid=1418158&group_id=148658&atid=772943 // The dachaked stuff has been moved below an autoload // jff 1/24/98 set both working and command line value of play parms nomonsters = clnomonsters = M_CheckParm ("-nomonsters"); respawnparm = clrespawnparm = M_CheckParm ("-respawn"); fastparm = clfastparm = M_CheckParm ("-fast"); // jff 1/24/98 end of set to both working and command line value if (M_CheckParm ("-altdeath")) deathmatch = 2; else if (M_CheckParm ("-deathmatch")) deathmatch = 1; { // CPhipps - localise title variable // print title for every printed line // cph - code cleaned and made smaller const char* doomverstr; switch ( gamemode ) { case retail: doomverstr = "The Ultimate DOOM"; break; case shareware: doomverstr = "DOOM Shareware"; break; case registered: doomverstr = "DOOM Registered"; break; case commercial: // Ty 08/27/98 - fixed gamemode vs gamemission switch (gamemission) { case pack_plut: doomverstr = "DOOM 2: Plutonia Experiment"; break; case pack_tnt: doomverstr = "DOOM 2: TNT - Evilution"; break; default: doomverstr = "DOOM 2: Hell on Earth"; break; } break; default: doomverstr = "Public DOOM"; break; } /* cphipps - the main display. This shows the build date, copyright, and game type */ lprintf(LO_ALWAYS,"PrBoom, playing: %s\n" "PrBoom is released under the GNU General Public license v2.0.\n" "You are welcome to redistribute it under certain conditions.\n" "It comes with ABSOLUTELY NO WARRANTY. See the file COPYING for details.\n", doomverstr); } modifiedgame = FALSE; // get skill / episode / map from parms startskill = sk_none; // jff 3/24/98 was sk_medium, just note not picked startepisode = 1; startmap = 1; autostart = FALSE; if ((p = M_CheckParm ("-skill")) && p < myargc-1) { startskill = myargv[p+1][0]-'1'; autostart = TRUE; } if ((p = M_CheckParm ("-episode")) && p < myargc-1) { startepisode = myargv[p+1][0]-'0'; startmap = 1; autostart = TRUE; } if ((p = M_CheckParm ("-warp")) || // killough 5/2/98 (p = M_CheckParm ("-wart"))) // Ty 08/29/98 - moved this check later so we can have -warp alone: && p < myargc-1) { startmap = 0; // Ty 08/29/98 - allow "-warp x" to go to first map in wad(s) autostart = TRUE; // Ty 08/29/98 - move outside the decision tree if (gamemode == commercial) { if (p < myargc-1) startmap = atoi(myargv[p+1]); // Ty 08/29/98 - add test if last parm } else // 1/25/98 killough: fix -warp xxx from crashing Doom 1 / UD { if (p < myargc-2) { startepisode = atoi(myargv[++p]); startmap = atoi(myargv[p+1]); } } } // Ty 08/29/98 - later we'll check for startmap=0 and autostart=TRUE // as a special case that -warp * was used. Actually -warp with any // non-numeric will do that but we'll only document "*" //jff 1/22/98 add command line parms to disable sound and music { int nosound = M_CheckParm("-nosound"); nomusicparm = nosound || M_CheckParm("-nomusic"); nosfxparm = nosound || M_CheckParm("-nosfx"); } //jff end of sound/music command line parms //proff 11/22/98: Added setting of viewangleoffset p = M_CheckParm("-viewangle"); if (p) { viewangleoffset = atoi(myargv[p+1]); viewangleoffset = viewangleoffset<0 ? 0 : (viewangleoffset>7 ? 7 : viewangleoffset); viewangleoffset = (8-viewangleoffset) * ANG45; } // init subsystems G_ReloadDefaults(); // killough 3/4/98: set defaults just loaded. // jff 3/24/98 this sets startskill if it was -1 //jff 9/3/98 use logical output routine lprintf(LO_INFO,"V_Init: allocate screens.\n"); V_Init(); // CPhipps - autoloading of wads // Designed to be general, instead of specific to boomlump.wad // Some people might find this useful // cph - support MBF -noload parameter if (!M_CheckParm("-noload")) { // only autoloaded wads here - autoloaded patches moved down below W_Init int i; for (i=0; i<MAXLOADFILES; i++) { const char *fname = wad_files[i]; char *fpath; if (!(fname && *fname)) continue; // Filename is now stored as a zero terminated string fpath = I_FindFile(fname, ".wad"); if (!fpath) lprintf(LO_WARN, "Failed to autoload %s\n", fname); else { D_AddFile(fpath,source_auto_load); modifiedgame = TRUE; free(fpath); } } } // add any files specified on the command line with -file wadfile // to the wad list // killough 1/31/98, 5/2/98: reload hack removed, -wart same as -warp now. if ((p = M_CheckParm ("-file"))) { // the parms after p are wadfile/lump names, // until end of parms or another - preceded parm modifiedgame = TRUE; // homebrew levels while (++p != myargc && *myargv[p] != '-') D_AddFile(myargv[p],source_pwad); } if (p && p < myargc-1) { char file[PATH_MAX+1]; // cph - localised strcpy(file,myargv[p+1]); AddDefaultExtension(file,".lmp"); // killough D_AddFile (file,source_lmp); //jff 9/3/98 use logical output routine lprintf(LO_CONFIRM,"Playing demo %s\n",file); if ((p = M_CheckParm ("-ffmap")) && p < myargc-1) { ffmap = atoi(myargv[p+1]); } } // 1/18/98 killough: Z_Init() call moved to i_main.c // CPhipps - move up netgame init //jff 9/3/98 use logical output routine lprintf(LO_INFO,"D_InitNetGame: Checking for network game.\n"); D_InitNetGame(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"W_Init: Init WADfiles.\n"); W_Init(); // CPhipps - handling of wadfiles init changed lprintf(LO_INFO,"\n"); // killough 3/6/98: add a newline, by popular demand :) // e6y // option to disable automatic loading of dehacked-in-wad lump if (!M_CheckParm ("-nodeh")) // MBF-style DeHackEd in wad support: load all lumps, not just the last one for (p = -1; (p = W_ListNumFromName("DEHACKED", p)) >= 0; ) // Split loading DEHACKED lumps into IWAD/autoload and PWADs/others if (lumpinfo[p].source == source_iwad || lumpinfo[p].source == source_pre || lumpinfo[p].source == source_auto_load) ProcessDehFile(NULL, D_dehout(), p); // cph - add dehacked-in-a-wad support if (bfgedition) { int lump = (W_CheckNumForName)("BFGDEH", ns_prboom); if (lump != -1) { ProcessDehFile(NULL, D_dehout(), lump); } } if (!M_CheckParm("-noload")) { // now do autoloaded dehacked patches, after IWAD patches but before PWAD int i; for (i=0; i<MAXLOADFILES; i++) { const char *fname = deh_files[i]; char *fpath; if (!(fname && *fname)) continue; // Filename is now stored as a zero terminated string fpath = I_FindFile(fname, ".bex"); if (!fpath) lprintf(LO_WARN, "Failed to autoload %s\n", fname); else { ProcessDehFile(fpath, D_dehout(), 0); // this used to set modifiedgame here, but patches shouldn't free(fpath); } } } if (!M_CheckParm ("-nodeh")) for (p = -1; (p = W_ListNumFromName("DEHACKED", p)) >= 0; ) if (!(lumpinfo[p].source == source_iwad || lumpinfo[p].source == source_pre || lumpinfo[p].source == source_auto_load)) ProcessDehFile(NULL, D_dehout(), p); // Load command line dehacked patches after WAD dehacked patches // e6y: DEH files preloaded in wrong order // http://sourceforge.net/tracker/index.php?func=detail&aid=1418158&group_id=148658&atid=772943 // ty 03/09/98 do dehacked stuff // Using -deh in BOOM, others use -dehacked. // Ty 03/18/98 also allow .bex extension. .bex overrides if both exist. p = M_CheckParm ("-deh"); if (p) { char file[PATH_MAX+1]; // cph - localised // the parms after p are deh/bex file names, // until end of parms or another - preceded parm // Ty 04/11/98 - Allow multiple -deh files in a row while (++p != myargc && *myargv[p] != '-') { int stillnotfound = 1; FILE *fp; AddDefaultExtension(strcpy(file, myargv[p]), ".bex"); fp = fopen(file, "rb"); if (fp == NULL) stillnotfound = 1; else stillnotfound = 0; fclose(fp); if (stillnotfound) // nope { AddDefaultExtension(strcpy(file, myargv[p]), ".deh"); fp = fopen(file, "rb"); if (fp == NULL) // still nope I_Error("D_DoomMainSetup: Cannot find .deh or .bex file named %s", myargv[p]); fclose(fp); } // during the beta we have debug output to dehout.txt ProcessDehFile(file,D_dehout(),0); } } V_InitColorTranslation(); //jff 4/24/98 load color translation lumps // killough 2/22/98: copyright / "modified game" / SPA banners removed // Ty 04/08/98 - Add 5 lines of misc. data, only if nonblank // The expectation is that these will be set in a .bex file //jff 9/3/98 use logical output routine if (*startup1) lprintf(LO_INFO,"%s",startup1); if (*startup2) lprintf(LO_INFO,"%s",startup2); if (*startup3) lprintf(LO_INFO,"%s",startup3); if (*startup4) lprintf(LO_INFO,"%s",startup4); if (*startup5) lprintf(LO_INFO,"%s",startup5); // End new startup strings //jff 9/3/98 use logical output routine lprintf(LO_INFO,"M_Init: Init miscellaneous info.\n"); M_Init(); #ifdef HAVE_NET // CPhipps - now wait for netgame start D_CheckNetGame(); #endif //jff 9/3/98 use logical output routine lprintf(LO_INFO,"R_Init: Init DOOM refresh daemon - "); R_Init(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"\nP_Init: Init Playloop state.\n"); P_Init(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"I_Init: Setting up machine state.\n"); I_Init(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"S_Init: Setting up sound.\n"); S_Init(snd_SfxVolume /* *8 */, snd_MusicVolume /* *8*/ ); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"HU_Init: Setting up heads up display.\n"); HU_Init(); if (!(M_CheckParm("-nodraw") && M_CheckParm("-nosound"))) I_InitGraphics(); //jff 9/3/98 use logical output routine lprintf(LO_INFO,"ST_Init: Init status bar.\n"); ST_Init(); idmusnum = -1; //jff 3/17/98 insure idmus number is blank // start the apropriate game based on parms // killough 12/98: if ((p = M_CheckParm ("-checksum")) && ++p < myargc) { P_RecordChecksum (myargv[p]); } #if 0 if (slot && ++slot < myargc) { slot = atoi(myargv[slot]); // killough 3/16/98: add slot info G_LoadGame(slot, TRUE); // killough 5/15/98: add command flag // cph - no filename } else #endif #ifdef HAVE_NET if (autostart || netgame) #else if (autostart) #endif { // sets first map and first episode if unknown GetFirstMap(&startepisode, &startmap); G_InitNew(startskill, startepisode, startmap); } else D_StartTitle(); // start up intro loop return true; failed: return false; }