void D_DoomMain(void) { I_Printf("I_Init\n"); I_Init(); I_Printf("Z_Init\n"); Z_Init(); I_Printf("W_Init\n"); W_Init(); I_Printf("R_Init\n"); R_Init(); I_Printf("P_Init\n"); P_Init(); I_Printf("ST_Init\n"); ST_Init(); I_Printf("S_Init\n"); S_Init(); gameaction = ga_nothing; gamestate = GS_NONE; gametic = 0; startskill = sk_medium; gameskill = sk_medium; startmap = 1; ticdup = 1; offsetms = 0; playeringame[0] = true; D_DebugParams(); D_SplashScreen(); D_DoomLoop(); }
/* ===================== NXC_Init ===================== */ BOOL NXC_Init( char *filename, program_t *program, char *name ) { //check arguments validity // if( !program || !filename || !name ) { return FALSE; } //load script // program->script = L_LoadScriptFile( filename, name ); //init interpretor // I_Init( program ); return TRUE; }
static void D_DoomMainSetup(void) { setbuf(stdout, NULL); M_LoadDefaults(); IdentifyVersion(); G_ReloadDefaults(); I_CalculateRes(640, 480); V_Init(); D_InitNetGame(); W_Init(); M_Init(); R_Init(); P_Init(); I_Init(); S_Init(snd_SfxVolume, snd_MusicVolume); HU_Init(); I_InitGraphics(); ST_Init(); G_InitNew(sk_none, 1, 1); }
// // D_DoomMain // void D_DoomMain (void) { int p; char file[256]; FindResponseFile (); IdentifyVersion (); setbuf (stdout, NULL); modifiedgame = false; nomonsters = M_CheckParm ("-nomonsters"); respawnparm = M_CheckParm ("-respawn"); fastparm = M_CheckParm ("-fast"); devparm = M_CheckParm ("-devparm"); if (M_CheckParm ("-altdeath")) deathmatch = 2; else if (M_CheckParm ("-deathmatch")) deathmatch = 1; switch ( gamemode ) { case retail: sprintf (title, " " "The Ultimate DOOM Startup v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; case shareware: sprintf (title, " " "DOOM Shareware Startup v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; case registered: sprintf (title, " " "DOOM Registered Startup v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; case commercial: sprintf (title, " " "DOOM 2: Hell on Earth v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; /*FIXME case pack_plut: sprintf (title, " " "DOOM 2: Plutonia Experiment v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; case pack_tnt: sprintf (title, " " "DOOM 2: TNT - Evilution v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; */ default: sprintf (title, " " "Public DOOM - v%i.%i" " ", VERSION_NUM/100,VERSION_NUM%100); break; } printf ("%s\n",title); if (devparm) printf(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; printf ("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; } // add any files specified on the command line with -file wadfile // to the wad list // // convenience hack to allow -wart e m to add a wad file // prepend a tilde to the filename so wadfile will be reloadable p = M_CheckParm ("-wart"); if (p) { myargv[p][4] = 'p'; // big hack, change to -warp // Map name handling. switch (gamemode ) { case shareware: case retail: case registered: sprintf (file,"~"DEVMAPS"E%cM%c.wad", myargv[p+1][0], myargv[p+2][0]); printf("Warping to Episode %s, Map %s.\n", myargv[p+1],myargv[p+2]); break; case commercial: default: p = atoi (myargv[p+1]); if (p<10) sprintf (file,"~"DEVMAPS"cdata/map0%i.wad", p); else sprintf (file,"~"DEVMAPS"cdata/map%i.wad", p); break; } D_AddFile (file); } p = M_CheckParm ("-file"); if (p) { // 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][0] != '-') D_AddFile (myargv[p]); } p = M_CheckParm ("-playdemo"); if (!p) p = M_CheckParm ("-timedemo"); if (p && p < myargc-1) { sprintf (file,"%s.lmp", myargv[p+1]); D_AddFile (file); printf("Playing demo %s.lmp.\n",myargv[p+1]); } // get skill / episode / map from parms startskill = sk_medium; startepisode = 1; startmap = 1; autostart = false; p = M_CheckParm ("-skill"); if (p && p < myargc-1) { startskill = myargv[p+1][0]-'1'; autostart = true; } p = M_CheckParm ("-episode"); if (p && p < myargc-1) { startepisode = myargv[p+1][0]-'0'; startmap = 1; autostart = true; } p = M_CheckParm ("-timer"); if (p && p < myargc-1 && deathmatch) { int time; time = atoi(myargv[p+1]); printf("Levels will end after %d minute",time); if (time>1) printf("s"); printf(".\n"); } p = M_CheckParm ("-avg"); if (p && p < myargc-1 && deathmatch) printf("Austin Virtual Gaming: Levels will end after 20 minutes\n"); p = M_CheckParm ("-warp"); if (p && p < myargc-1) { if (gamemode == commercial) startmap = atoi (myargv[p+1]); else { startepisode = myargv[p+1][0]-'0'; startmap = myargv[p+2][0]-'0'; } autostart = true; } // init subsystems printf ("V_Init: allocate screens.\n"); V_Init (); printf ("M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults (); // load before initing other systems printf ("Z_Init: Init zone memory allocation daemon. \n"); Z_Init (); printf ("W_Init: Init WADfiles.\n"); W_InitMultipleFiles (wadfiles); printf("added\n"); // Check for -file in shareware if (modifiedgame) { // These are the lumps that will be checked in IWAD, // if any one is not present, execution will be aborted. char name[23][8]= { "e2m1","e2m2","e2m3","e2m4","e2m5","e2m6","e2m7","e2m8","e2m9", "e3m1","e3m3","e3m3","e3m4","e3m5","e3m6","e3m7","e3m8","e3m9", "dphoof","bfgga0","heada1","cybra1","spida1d1" }; int i; if ( gamemode == shareware) I_Error("\nYou cannot -file with the shareware " "version. Register!"); // Check for fake IWAD with right name, // but w/o all the lumps of the registered version. if (gamemode == registered) for (i = 0;i < 23; i++) if (W_CheckNumForName(name[i])<0) I_Error("\nThis is not the registered version."); } // Iff additonal PWAD files are used, print modified banner if (modifiedgame) { /*m*/printf ( "===========================================================================\n" "ATTENTION: This version of DOOM has been modified. If you would like to\n" "get a copy of the original game, call 1-800-IDGAMES or see the readme file.\n" " You will not receive technical support for modified games.\n" " press enter to continue\n" "===========================================================================\n" ); } // Check and print which version is executed. switch ( gamemode ) { case shareware: case indetermined: printf ( "===========================================================================\n" " Shareware!\n" "===========================================================================\n" ); break; case registered: case retail: case commercial: printf ( "===========================================================================\n" " Commercial product - do not distribute!\n" " Please report software piracy to the SPA: 1-800-388-PIR8\n" "===========================================================================\n" ); break; default: // Ouch. break; } printf ("M_Init: Init miscellaneous info.\n"); M_Init (); printf ("R_Init: Init DOOM refresh daemon - "); R_Init (); printf ("\nP_Init: Init Playloop state.\n"); P_Init (); printf ("I_Init: Setting up machine state.\n"); I_Init (); printf ("D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame (); printf ("S_Init: Setting up sound.\n"); S_Init (snd_SfxVolume /* *8 */, snd_MusicVolume /* *8*/ ); printf ("HU_Init: Setting up heads up display.\n"); HU_Init (); printf ("ST_Init: Init status bar.\n"); ST_Init (); // check for a driver that wants intermission stats p = M_CheckParm ("-statcopy"); if (p && p<myargc-1) { // for statistics driver extern void* statcopy; statcopy = (void*)atoi(myargv[p+1]); printf ("External statistics registered.\n"); } // start the apropriate game based on parms p = M_CheckParm ("-record"); if (p && p < myargc-1) { G_RecordDemo (myargv[p+1]); autostart = true; } p = M_CheckParm ("-playdemo"); if (p && p < myargc-1) { singledemo = true; // quit after one demo G_DeferedPlayDemo (myargv[p+1]); D_DoomLoop (); // never returns } p = M_CheckParm ("-timedemo"); if (p && p < myargc-1) { G_TimeDemo (myargv[p+1]); D_DoomLoop (); // never returns } p = M_CheckParm ("-loadgame"); if (p && p < myargc-1) { if (M_CheckParm("-cdrom")) sprintf(file, "c:\\doomdata\\"SAVEGAMENAME"%c.dsg",myargv[p+1][0]); else sprintf(file, SAVEGAMENAME"%c.dsg",myargv[p+1][0]); G_LoadGame (file); } if ( gameaction != ga_loadgame ) { if (autostart || netgame) G_InitNew (startskill, startepisode, startmap); else D_StartTitle (); // start up intro loop } D_DoomLoop (); // never returns }
void D_DoomMainSetup(void) { int p; nomonsters = M_CheckParm ("-nomonsters"); respawnparm = M_CheckParm ("-respawn"); fastparm = M_CheckParm ("-fast"); devparm = M_CheckParm ("-devparm"); if (M_CheckParm ("-altdeath")) deathmatch = 2; else if (M_CheckParm ("-deathmatch")) deathmatch = 1; printf("Welcome to Rockdoom\n"); switch ( gamemode ) { case retail: printf ("The Ultimate DOOM Startup v%d.%d\n",DVERSION/100,DVERSION%100); break; case shareware: printf ("DOOM Shareware Startup v%d.%d\n",DVERSION/100,DVERSION%100); break; case registered: printf ("DOOM Registered Startup v%d.%d\n",DVERSION/100,DVERSION%100); break; case commercial: switch (gamemission) { case pack_plut: printf ("DOOM 2: Plutonia Experiment v%d.%d\n",DVERSION/100,DVERSION%100); break; case pack_tnt: printf ("DOOM 2: TNT - Evilution v%d.%d\n",DVERSION/100,DVERSION%100); break; default: printf ("DOOM 2: Hell on Earth v%d.%d\n",DVERSION/100,DVERSION%100); break; } break; default: printf ("Public DOOM v%d.%d\n",DVERSION/100,DVERSION%100); break; } if (devparm) printf(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; printf ("turbo scale: %d%%\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; } // get skill / episode / map from parms startskill = sk_medium; startepisode = 1; startmap = 1; autostart = false; p = M_CheckParm ("-skill"); if (p && p < myargc-1) { startskill = myargv[p+1][0]-'1'; autostart = true; } p = M_CheckParm ("-episode"); if (p && p < myargc-1) { startepisode = myargv[p+1][0]-'0'; startmap = 1; autostart = true; } p = M_CheckParm ("-warp"); if (p && p < myargc-1) { if (gamemode == commercial) startmap = atoi (myargv[p+1]); else { startepisode = myargv[p+1][0]-'0'; startmap = myargv[p+2][0]-'0'; } autostart = true; } // CPhipps - move up netgame init printf("D_InitNetGame: Checking for network game.\n"); D_InitNetGame(); // init subsystems printf ("V_Init: allocate screens.\n"); V_Init (); printf ("W_Init: Init WADfiles.\n"); W_Init(); if ((p = W_CheckNumForName("DEHACKED")) != -1) // cph - add dehacked-in-a-wad support ProcessDehFile(NULL, dehout ? "/dehlog.txt" : NULL, p); V_InitColorTranslation(); //jff 4/24/98 load color translation lumps // Check for -file in shareware if (modifiedgame) { // These are the lumps that will be checked in IWAD, // if any one is not present, execution will be aborted. const char name[23][8]= { "e2m1","e2m2","e2m3","e2m4","e2m5","e2m6","e2m7","e2m8","e2m9", "e3m1","e3m3","e3m3","e3m4","e3m5","e3m6","e3m7","e3m8","e3m9", "dphoof","bfgga0","heada1","cybra1","spida1d1" }; int i; if ( gamemode == shareware) I_Error("\nYou cannot -file with the shareware version. Register!\n"); // Check for fake IWAD with right name, // but w/o all the lumps of the registered version. if (gamemode == registered) for (i = 0;i < 23; i++) if (W_CheckNumForName(name[i])<0) I_Error("This is not the registered version.\n"); } // Iff additonal PWAD files are used, print modified banner if (modifiedgame) printf ("ATTENTION: This version of DOOM has been modified.\n"); // Check and print which version is executed. switch ( gamemode ) { case shareware: case indetermined: printf ("Shareware!\n"); break; case registered: case retail: case commercial: printf ("Commercial product - do not distribute!\n"); break; default: // Ouch. break; } printf ("M_Init: Init miscellaneous info.\n"); M_Init (); printf ("R_Init: Init DOOM refresh daemon - "); R_Init (); printf ("P_Init: Init Playloop state.\n"); P_Init (); printf ("I_Init: Setting up machine state.\n"); I_Init (); printf ("S_Init: Setting up sound.\n"); S_Init (snd_SfxVolume /* *8 */, snd_MusicVolume /* *8*/ ); printf ("HU_Init: Setting up heads up display.\n"); HU_Init (); I_InitGraphics (); printf ("ST_Init: Init status bar.\n"); ST_Init (); // check for a driver that wants intermission stats p = M_CheckParm ("-statcopy"); if (p && p<myargc-1) { // for statistics driver extern void* statcopy; statcopy = (void*)(intptr_t)atoi(myargv[p+1]); printf ("External statistics registered.\n"); } // start the apropriate game based on parms p = M_CheckParm ("-record"); if (p && p < myargc-1) { G_RecordDemo (myargv[p+1]); autostart = true; } p = M_CheckParm ("-loadgame"); if (p && p < myargc-1) G_LoadGame (atoi(myargv[p+1]), false); if ( gameaction != ga_loadgame ) { if (!singledemo) { /* killough 12/98 */ if (autostart || netgame) G_InitNew (startskill, startepisode, startmap); else D_StartTitle (); // start up intro loop } } }
// // D_DoomMain // void D_DoomMain (void) { unsigned p; extern std::string defdemoname; gamestate = GS_STARTUP; M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_ExecCmdLineParams (false, true); // [Nes] test for +logfile command Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); M_LoadDefaults (); // load before initing other systems C_ExecCmdLineParams (true, false); // [RH] do all +set commands on the command line const char* iwad = Args.CheckValue("-iwad"); if (!iwad) iwad = ""; std::vector<std::string> newwadfiles, newpatchfiles; newwadfiles.push_back(iwad); D_AddWadCommandLineFiles(newwadfiles); D_AddDehCommandLineFiles(newpatchfiles); D_LoadResourceFiles(newwadfiles, newpatchfiles); I_Init(); V_Init(); atterm(V_Close); #ifdef _WIN32 const char *sdlv = getenv("SDL_VIDEODRIVER"); Printf (PRINT_HIGH, "Using %s video driver.\n",sdlv); #endif C_InitConsole(screen->width, screen->height, true); atterm(C_ShutdownConsole); // SDL needs video mode set up first before input code can be used I_InitInput(); D_Init(); atterm(D_Shutdown); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks(); // [RH] User-configurable startup strings. Because BOOM does. if (GStrings(STARTUP1)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP1)); if (GStrings(STARTUP2)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP2)); if (GStrings(STARTUP3)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP3)); if (GStrings(STARTUP4)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP4)); if (GStrings(STARTUP5)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP5)); // Nomonsters sv_nomonsters = Args.CheckParm("-nomonsters"); // Respawn sv_monstersrespawn = Args.CheckParm("-respawn"); // Fast sv_fastmonsters = Args.CheckParm("-fast"); // developer mode devparm = Args.CheckParm ("-devparm"); // Record a vanilla demo p = Args.CheckParm ("-record"); if (p) { autorecord = true; autostart = true; demorecordfile = Args.GetArg (p+1); } // get skill / episode / map from parms strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); // Check for -playdemo, play a single demo then quit. p = Args.CheckParm ("-playdemo"); // Hack to check for +playdemo command, since if you just add it normally // it won't run because it's attempting to run a demo and still set up the // first map as normal. if (!p) p = Args.CheckParm ("+playdemo"); if (p && p < Args.NumArgs()-1) { Printf (PRINT_HIGH, "Playdemo parameter found on command line.\n"); singledemo = true; defdemoname = Args.GetArg (p+1); } // [SL] check for -timedemo (was removed at some point) p = Args.CheckParm("-timedemo"); if (p && p < Args.NumArgs() - 1) { singledemo = true; G_TimeDemo(Args.GetArg(p + 1)); } const char *val = Args.CheckValue ("-skill"); if (val) { sv_skill.Set (val[0]-'0'); } p = Args.CheckParm ("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi (Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy (startmap, CalcMapName (ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm ("+map"); if (p && p < Args.NumArgs()-1) { strncpy (startmap, Args.GetArg (p+1), 8); ((char *)Args.GetArg (p))[0] = '-'; autostart = true; } if (devparm) Printf (PRINT_HIGH, "%s", GStrings(D_DEVSTR)); // D_DEVSTR // [RH] Now that all text strings are set up, // insert them into the level and cluster data. G_SetLevelStrings(); // [RH] Parse through all loaded mapinfo lumps G_ParseMapInfo(); // [ML] Parse musinfo lump G_ParseMusInfo(); // [RH] Parse any SNDINFO lumps S_ParseSndInfo(); // NOTE(jsd): Set up local player color EXTERN_CVAR(cl_color); R_BuildPlayerTranslation (0, V_GetColorFromString (NULL, cl_color.cstring())); I_FinishClockCalibration (); Printf (PRINT_HIGH, "D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame (); // [RH] Initialize items. Still only used for the give command. :-( InitItems (); // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet (); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams (false, false); Printf_Bold("\n\35\36\36\36\36 Odamex Client Initialized \36\36\36\36\37\n"); if(gamestate != GS_CONNECTING) Printf(PRINT_HIGH, "Type connect <address> or use the Odamex Launcher to connect to a game.\n"); Printf(PRINT_HIGH, "\n"); setmodeneeded = false; // [Fly] we don't need to set a video mode here! //gamestate = GS_FULLCONSOLE; // [SL] allow the user to pass the name of a netdemo as the first argument. // This allows easy launching of netdemos from Windows Explorer or other GUIs. // [Xyltol] if (Args.GetArg(1)) { std::string demoarg = Args.GetArg(1); if (demoarg.find(".odd") != std::string::npos) CL_NetDemoPlay(demoarg); } p = Args.CheckParm("-netplay"); if (p) { if (Args.GetArg(p + 1)) { std::string filename = Args.GetArg(p + 1); CL_NetDemoPlay(filename); } else { Printf(PRINT_HIGH, "No netdemo filename specified.\n"); } } // denis - bring back the demos if ( gameaction != ga_loadgame ) { if (autostart || netgame || singledemo) { if (singledemo) G_DoPlayDemo(); else { if(autostart) { // single player warp (like in g_level) serverside = true; sv_allowexit = "1"; sv_freelook = "1"; sv_allowjump = "1"; sv_allowredscreen = "1"; sv_gametype = GM_COOP; players.clear(); players.push_back(player_t()); players.back().playerstate = PST_REBORN; consoleplayer_id = displayplayer_id = players.back().id = 1; } G_InitNew (startmap); if (autorecord) if (G_RecordDemo(demorecordfile.c_str())) G_BeginRecording(); } } else { if (gamestate != GS_CONNECTING) gamestate = GS_HIDECONSOLE; C_HideConsole(); if (gamemode == commercial_bfg) // DOOM 2 BFG Edtion AddCommandString("menu_main"); D_StartTitle (); // start up intro loop } } // denis - this will run a demo and quit p = Args.CheckParm ("+demotest"); if (p && p < Args.NumArgs()-1) { demotest = 1; defdemoname = Args.GetArg (p+1); G_DoPlayDemo(); while(demoplayback) { DObject::BeginFrame (); G_Ticker(); DObject::EndFrame (); gametic++; } } else { demotest = 0; D_DoomLoop (); // never returns } }
void D_DoomMain (void) { const char *iwad; M_ClearRandom(); gamestate = GS_STARTUP; M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_ExecCmdLineParams (false, true); // [Nes] test for +logfile command // Always log by default if (!LOG.is_open()) C_DoCommand("logfile"); Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); M_LoadDefaults (); // load before initing other systems C_ExecCmdLineParams (true, false); // [RH] do all +set commands on the command line iwad = Args.CheckValue("-iwad"); if(!iwad) iwad = ""; D_AddDefWads(iwad); D_AddCmdParameterFiles(); wadhashes = W_InitMultipleFiles (wadfiles); SV_InitMultipleFiles (wadfiles); // [RH] Initialize configurable strings. D_InitStrings (); D_DoDefDehackedPatch(); I_Init (); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks (); // [RH] User-configurable startup strings. Because BOOM does. if (STARTUP1[0]) Printf (PRINT_HIGH, "%s\n", STARTUP1); if (STARTUP2[0]) Printf (PRINT_HIGH, "%s\n", STARTUP2); if (STARTUP3[0]) Printf (PRINT_HIGH, "%s\n", STARTUP3); if (STARTUP4[0]) Printf (PRINT_HIGH, "%s\n", STARTUP4); if (STARTUP5[0]) Printf (PRINT_HIGH, "%s\n", STARTUP5); devparm = Args.CheckParm ("-devparm"); // get skill / episode / map from parms strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); const char *val = Args.CheckValue ("-skill"); if (val) { sv_skill.Set (val[0]-'0'); } if (devparm) Printf (PRINT_HIGH, "%s", Strings[0].builtin); // D_DEVSTR const char *v = Args.CheckValue ("-timer"); if (v) { double time = atof (v); Printf (PRINT_HIGH, "Levels will end after %g minute%s.\n", time, time > 1 ? "s" : ""); sv_timelimit.Set ((float)time); } const char *w = Args.CheckValue ("-avg"); if (w) { Printf (PRINT_HIGH, "Austin Virtual Gaming: Levels will end after 20 minutes\n"); sv_timelimit.Set (20); } // [RH] Now that all text strings are set up, // insert them into the level and cluster data. G_SetLevelStrings (); // [RH] Parse through all loaded mapinfo lumps G_ParseMapInfo (); // [RH] Parse any SNDINFO lumps S_ParseSndInfo(); // Check for -file in shareware if (modifiedgame && (gameinfo.flags & GI_SHAREWARE)) I_FatalError ("You cannot -file with the shareware version. Register!"); Printf (PRINT_HIGH, "R_Init: Init DOOM refresh daemon.\n"); R_Init (); Printf (PRINT_HIGH, "P_Init: Init Playloop state.\n"); P_Init (); Printf (PRINT_HIGH, "SV_InitNetwork: Checking network game status.\n"); SV_InitNetwork(); // [RH] Initialize items. Still only used for the give command. :-( InitItems (); // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet (); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams (false, false); Printf(PRINT_HIGH, "========== Odamex Server Initialized ==========\n"); #ifdef UNIX if (Args.CheckParm("-background")) daemon_init(); #endif // Use wads mentioned on the commandline to start with //std::vector<std::string> start_wads; //std::string custwad; //iwad = Args.CheckValue("-iwad"); //D_DoomWadReboot(start_wads); unsigned p = Args.CheckParm ("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi (Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy (startmap, CalcMapName (ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm ("+map"); if (p && p < Args.NumArgs()-1) { strncpy (startmap, Args.GetArg (p+1), 8); ((char *)Args.GetArg (p))[0] = '-'; autostart = true; } strncpy(level.mapname, startmap, sizeof(level.mapname)); G_ChangeMap (); D_DoomLoop (); // never returns }
void D_DoomMain (void) { M_ClearRandom(); gamestate = GS_STARTUP; if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_ExecCmdLineParams (false, true); // [Nes] test for +logfile command I_Init (); D_CheckNetGame (); M_LoadDefaults (); // load before initing other systems M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in C_ExecCmdLineParams (true, false); // [RH] do all +set commands on the command line //D_AddDefWads(); //SV_InitMultipleFiles (wadfiles); //wadhashes = W_InitMultipleFiles (wadfiles); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks (); // [RH] Initialize configurable strings. D_InitStrings (); // [RH] User-configurable startup strings. Because BOOM does. if (STARTUP1[0]) Printf (PRINT_HIGH, "%s\n", STARTUP1); if (STARTUP2[0]) Printf (PRINT_HIGH, "%s\n", STARTUP2); if (STARTUP3[0]) Printf (PRINT_HIGH, "%s\n", STARTUP3); if (STARTUP4[0]) Printf (PRINT_HIGH, "%s\n", STARTUP4); if (STARTUP5[0]) Printf (PRINT_HIGH, "%s\n", STARTUP5); devparm = Args.CheckParm ("-devparm"); // get skill / episode / map from parms strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); const char *val = Args.CheckValue ("-skill"); if (val) { skill.Set (val[0]-'0'); } unsigned p = Args.CheckParm ("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi (Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy (startmap, CalcMapName (ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm ("+map"); if (p && p < Args.NumArgs()-1) { strncpy (startmap, Args.GetArg (p+1), 8); ((char *)Args.GetArg (p))[0] = '-'; autostart = true; } if (devparm) Printf (PRINT_HIGH, "%s", Strings[0].builtin); // D_DEVSTR const char *v = Args.CheckValue ("-timer"); if (v) { double time = atof (v); Printf (PRINT_HIGH, "Levels will end after %g minute%s.\n", time, time > 1 ? "s" : ""); timelimit.Set ((float)time); } const char *w = Args.CheckValue ("-avg"); if (w) { Printf (PRINT_HIGH, "Austin Virtual Gaming: Levels will end after 20 minutes\n"); timelimit.Set (20); } // Check for -file in shareware if (modifiedgame && (gameinfo.flags & GI_SHAREWARE)) I_FatalError ("You cannot -file with the shareware version. Register!"); // [RH] Initialize items. Still only used for the give command. :-( InitItems (); // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet (); Printf(PRINT_HIGH, "========== Odamex Server Initialized ==========\n"); #ifdef UNIX if (Args.CheckParm("-background")) daemon_init(); #endif // Use wads mentioned on the commandline to start with std::vector<std::string> start_wads; std::string custwad; const char *iwadparm = Args.CheckValue ("-iwad"); if (iwadparm) { custwad = iwadparm; FixPathSeparator (custwad); start_wads.push_back(custwad); } DArgs files = Args.GatherFiles ("-file", ".wad", true); if (files.NumArgs() > 0) { modifiedgame = true; for (size_t i = 0; i < files.NumArgs(); i++) { start_wads.push_back(files.GetArg (i)); } } D_DoomWadReboot(start_wads); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams (false, false); strncpy(level.mapname, startmap, sizeof(level.mapname)); gamestate = GS_STARTUP; G_ChangeMap (); D_DoomLoop (); // never returns }
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 } }
// // D_DoomMain // void D_DoomMain (void) { int p; char file[256]; char demolumpname[9]; M_FindResponseFile (); // Undocumented "search for IWADs" parameter used by the setup // tool. if (M_CheckParm("-findiwads") > 0) { D_FindInstalledIWADs(); } // print banner PrintBanner(PACKAGE_STRING); DEH_printf("Z_Init: Init zone memory allocation daemon. \n"); Z_Init (); #ifdef FEATURE_MULTIPLAYER //! // @category net // // Start a dedicated server, routing packets but not participating // in the game itself. // if (M_CheckParm("-dedicated") > 0) { printf("Dedicated server mode.\n"); NET_DedicatedServer(); // Never returns } //! // @category net // // Query the Internet master server for a global list of active // servers. // if (M_CheckParm("-search")) { printf("\nSearching for servers on Internet ...\n"); p = NET_MasterQuery(NET_QueryPrintCallback, NULL); printf("\n%i server(s) found.\n", p); exit(0); } //! // @arg <address> // @category net // // Query the status of the server running on the given IP // address. // p = M_CheckParmWithArgs("-query", 1); if (p) { NET_QueryAddress(myargv[p+1]); exit(0); } //! // @category net // // Search the local LAN for running servers. // if (M_CheckParm("-localsearch")) { printf("\nSearching for servers on local LAN ...\n"); p = NET_LANQuery(NET_QueryPrintCallback, NULL); printf("\n%i server(s) found.\n", p); exit(0); } #endif #ifdef FEATURE_DEHACKED printf("DEH_Init: Init Dehacked support.\n"); DEH_Init(); #endif iwadfile = D_FindIWAD(); // *** PID BEGIN *** psdoom1wad = D_FindWADByName("psdoom1.wad"); psdoom2wad = D_FindWADByName("psdoom2.wad"); // *** PID END *** // None found? if (iwadfile == NULL) { I_Error("Game mode indeterminate. No IWAD file was found. Try\n" "specifying one with the '-iwad' command line parameter.\n"); } modifiedgame = false; //! // @vanilla // // Disable monsters. // nomonsters = M_CheckParm ("-nomonsters"); // This keeps a 'no monsters' that is persistant across new games // and level warps. if ( (nomonstersperiod = M_CheckParm("-nomonsters.") ) ) { nomonsters = true; } // This makes items respawn as in -altdeath (ie. no dropped items, // no invis, no invun) respawnitems = M_CheckParm("-respawnitems"); //! // @vanilla // // Monsters respawn after being killed. // respawnparm = M_CheckParm ("-respawn"); //! // @vanilla // // Monsters move faster. // fastparm = M_CheckParm ("-fast"); //! // @vanilla // // Developer mode. F1 saves a screenshot in the current working // directory. // devparm = M_CheckParm ("-devparm"); //! // @category net // @vanilla // // Start a deathmatch game. // if (M_CheckParm ("-deathmatch")) deathmatch = 1; //! // @category net // @vanilla // // Start a deathmatch 2.0 game. Weapons do not stay in place and // all items respawn after 30 seconds. // if (M_CheckParm ("-altdeath")) deathmatch = 2; if (devparm) DEH_printf(D_DEVSTR); // find which dir to use for config files M_SetConfigDir(); //! // @arg <x> // @vanilla // // Turbo mode. The player's speed is multiplied by x%. If unspecified, // x defaults to 200. Values are rounded up to 10 and down to 400. // 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; DEH_printf("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; } // init subsystems DEH_printf("V_Init: allocate screens.\n"); V_Init (); DEH_printf("M_LoadDefaults: Load system defaults.\n"); M_ApplyPlatformDefaults(); M_LoadDefaults (); // load before initing other systems DEH_printf("W_Init: Init WADfiles.\n"); D_AddFile(iwadfile); // *** PID BEGIN *** // If the command-line flag to suppress auto-loading of custom // ps management levels is *not* there, load the appropriate level. p = M_CheckParm ("-nopslev"); if (p) { // Add psdoom1.wad if this is registered (Doom 1) or retail (Ultimite Doom). // If we loaded it, set the flag to true so we can place the monsters in the // correct positions. if ( gamemode == registered || gamemode == retail ){ D_AddFile(iwadfile); ps_level_loaded = true; } // Add psdoom2.wad if this is commercial (Doom 2) and not an add-on pack. // If we loaded it, set the flag to true so we can place the monsters in the // correct positions. if ( gamemode == commercial && gamemission == doom2 ) { D_AddFile(iwadfile); ps_level_loaded = true; } } // *** PID END *** #ifdef FEATURE_WAD_MERGE // Merged PWADs are loaded first, because they are supposed to be // modified IWADs. //! // @arg <files> // @category mod // // Simulates the behavior of deutex's -merge option, merging a PWAD // into the main IWAD. Multiple files may be specified. // p = M_CheckParmWithArgs("-merge", 1); if (p > 0) { for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p) { char *filename; filename = D_TryFindWADByName(myargv[p]); printf(" merging %s\n", filename); W_MergeFile(filename); } } // NWT-style merging: // NWT's -merge option: //! // @arg <files> // @category mod // // Simulates the behavior of NWT's -merge option. Multiple files // may be specified. p = M_CheckParmWithArgs("-nwtmerge", 1); if (p > 0) { for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p) { char *filename; filename = D_TryFindWADByName(myargv[p]); printf(" performing NWT-style merge of %s\n", filename); W_NWTDashMerge(filename); } } // Add flats //! // @arg <files> // @category mod // // Simulates the behavior of NWT's -af option, merging flats into // the main IWAD directory. Multiple files may be specified. // p = M_CheckParmWithArgs("-af", 1); if (p > 0) { for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p) { char *filename; filename = D_TryFindWADByName(myargv[p]); printf(" merging flats from %s\n", filename); W_NWTMergeFile(filename, W_NWT_MERGE_FLATS); } } //! // @arg <files> // @category mod // // Simulates the behavior of NWT's -as option, merging sprites // into the main IWAD directory. Multiple files may be specified. // p = M_CheckParmWithArgs("-as", 1); if (p > 0) { for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p) { char *filename; filename = D_TryFindWADByName(myargv[p]); printf(" merging sprites from %s\n", filename); W_NWTMergeFile(filename, W_NWT_MERGE_SPRITES); } } //! // @arg <files> // @category mod // // Equivalent to "-af <files> -as <files>". // p = M_CheckParmWithArgs("-aa", 1); if (p > 0) { for (p = p + 1; p<myargc && myargv[p][0] != '-'; ++p) { char *filename; filename = D_TryFindWADByName(myargv[p]); printf(" merging sprites and flats from %s\n", filename); W_NWTMergeFile(filename, W_NWT_MERGE_SPRITES | W_NWT_MERGE_FLATS); } } #endif //! // @arg <files> // @vanilla // // Load the specified PWAD files. // p = M_CheckParmWithArgs("-file", 1); if (p) { // 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][0] != '-') { char *filename; filename = D_TryFindWADByName(myargv[p]); D_AddFile(filename); } } // Debug: // W_PrintDirectory(); //! // @arg <demo> // @category demo // @vanilla // // Play back the demo named demo.lmp. // p = M_CheckParmWithArgs ("-playdemo", 1); if (!p) { //! // @arg <demo> // @category demo // @vanilla // // Play back the demo named demo.lmp, determining the framerate // of the screen. // p = M_CheckParmWithArgs("-timedemo", 1); } if (p) { if (!strcasecmp(myargv[p+1] + strlen(myargv[p+1]) - 4, ".lmp")) { strcpy(file, myargv[p + 1]); } else { sprintf (file,"%s.lmp", myargv[p+1]); } if (D_AddFile (file)) { strncpy(demolumpname, lumpinfo[numlumps - 1].name, 8); demolumpname[8] = '\0'; printf("Playing demo %s.\n", file); } else { // If file failed to load, still continue trying to play // the demo in the same way as Vanilla Doom. This makes // tricks like "-playdemo demo1" possible. strncpy(demolumpname, myargv[p + 1], 8); demolumpname[8] = '\0'; } } // Generate the WAD hash table. Speed things up a bit. W_GenerateHashTable(); D_IdentifyVersion(); InitGameVersion(); LoadChexDeh(); LoadHacxDeh(); D_SetGameDescription(); D_SetSaveGameDir(); // Check for -file in shareware if (modifiedgame) { // These are the lumps that will be checked in IWAD, // if any one is not present, execution will be aborted. char name[23][8]= { "e2m1","e2m2","e2m3","e2m4","e2m5","e2m6","e2m7","e2m8","e2m9", "e3m1","e3m3","e3m3","e3m4","e3m5","e3m6","e3m7","e3m8","e3m9", "dphoof","bfgga0","heada1","cybra1","spida1d1" }; int i; if ( gamemode == shareware) I_Error(DEH_String("\nYou cannot -file with the shareware " "version. Register!")); // Check for fake IWAD with right name, // but w/o all the lumps of the registered version. if (gamemode == registered) for (i = 0;i < 23; i++) if (W_CheckNumForName(name[i])<0) I_Error(DEH_String("\nThis is not the registered version.")); } // get skill / episode / map from parms startskill = sk_medium; startepisode = 1; startmap = 1; autostart = false; //! // @arg <skill> // @vanilla // // Set the game skill, 1-5 (1: easiest, 5: hardest). A skill of // 0 disables all monsters. // p = M_CheckParmWithArgs("-skill", 1); if (p) { startskill = myargv[p+1][0]-'1'; autostart = true; } //! // @arg <n> // @vanilla // // Start playing on episode n (1-4) // p = M_CheckParmWithArgs("-episode", 1); if (p) { startepisode = myargv[p+1][0]-'0'; startmap = 1; autostart = true; } timelimit = 0; //! // @arg <n> // @category net // @vanilla // // For multiplayer games: exit each level after n minutes. // p = M_CheckParmWithArgs("-timer", 1); if (p) { timelimit = atoi(myargv[p+1]); } //! // @category net // @vanilla // // Austin Virtual Gaming: end levels after 20 minutes. // p = M_CheckParm ("-avg"); if (p) { timelimit = 20; } //! // @arg [<x> <y> | <xy>] // @vanilla // // Start a game immediately, warping to ExMy (Doom 1) or MAPxy // (Doom 2) // p = M_CheckParmWithArgs("-warp", 1); if (p) { if (gamemode == commercial) startmap = atoi (myargv[p+1]); else { startepisode = myargv[p+1][0]-'0'; if (p + 2 < myargc) { startmap = myargv[p+2][0]-'0'; } else { startmap = 1; } } autostart = true; } // Undocumented: // Invoked by setup to test the controls. p = M_CheckParm("-testcontrols"); if (p > 0) { startepisode = 1; startmap = 1; autostart = true; testcontrols = true; } // Check for load game parameter // We do this here and save the slot number, so that the network code // can override it or send the load slot to other players. //! // @arg <s> // @vanilla // // Load the game in slot s. // p = M_CheckParmWithArgs("-loadgame", 1); if (p) { startloadgame = atoi(myargv[p+1]); } else { // Not loading a game startloadgame = -1; } //! // @category video // // Disable vertical mouse movement. // if (M_CheckParm("-novert")) novert = true; //! // @category video // // Enable vertical mouse movement. // if (M_CheckParm("-nonovert")) novert = false; if (W_CheckNumForName("SS_START") >= 0 || W_CheckNumForName("FF_END") >= 0) { printf ("===========================================================================\n"); printf(" WARNING: The loaded WAD file contains modified sprites or\n" " floor textures. You may want to use the '-merge' command\n" " line option instead of '-file'.\n"); } printf ("===========================================================================\n"); PrintBanner(gamedescription); printf ( "===========================================================================\n" " " PACKAGE_NAME " is free software, covered by the GNU General Public\n" " License. There is NO warranty; not even for MERCHANTABILITY or FITNESS\n" " FOR A PARTICULAR PURPOSE. You are welcome to change and distribute\n" " copies under certain conditions. See the source for more information.\n" "===========================================================================\n" ); PrintDehackedBanners(); DEH_printf("M_Init: Init miscellaneous info.\n"); M_Init (); DEH_printf("R_Init: Init DOOM refresh daemon - "); R_Init (); DEH_printf("\nP_Init: Init Playloop state.\n"); P_Init (); DEH_printf("I_Init: Setting up machine state.\n"); I_Init (); #ifdef FEATURE_MULTIPLAYER printf ("NET_Init: Init network subsystem.\n"); NET_Init (); #endif DEH_printf("S_Init: Setting up sound.\n"); S_Init (sfxVolume * 8, musicVolume * 8); DEH_printf("D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame (); PrintGameVersion(); DEH_printf("HU_Init: Setting up heads up display.\n"); HU_Init (); DEH_printf("ST_Init: Init status bar.\n"); ST_Init (); // If Doom II without a MAP01 lump, this is a store demo. // Moved this here so that MAP01 isn't constantly looked up // in the main loop. if (gamemode == commercial && W_CheckNumForName("map01") < 0) storedemo = true; //! // @arg <x> // @category demo // @vanilla // // Record a demo named x.lmp. // p = M_CheckParmWithArgs("-record", 1); if (p) { G_RecordDemo (myargv[p+1]); autostart = true; } p = M_CheckParmWithArgs("-playdemo", 1); if (p) { singledemo = true; // quit after one demo G_DeferedPlayDemo (demolumpname); D_DoomLoop (); // never returns } p = M_CheckParmWithArgs("-timedemo", 1); if (p) { G_TimeDemo (demolumpname); D_DoomLoop (); // never returns } if (startloadgame >= 0) { strcpy(file, P_SaveGameFile(startloadgame)); G_LoadGame (file); } if (gameaction != ga_loadgame ) { if (autostart || netgame) G_InitNew (startskill, startepisode, startmap); else D_StartTitle (); // start up intro loop } D_DoomLoop (); // never returns }
// // D_DoomMain // void D_DoomMain (void) { unsigned p; const char *iwad; extern std::string defdemoname; M_ClearRandom(); gamestate = GS_STARTUP; SetLanguageIDs (); M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_ExecCmdLineParams (false, true); // [Nes] test for +logfile command Printf (PRINT_HIGH, "Heapsize: %u megabytes\n", got_heapsize); M_LoadDefaults (); // load before initing other systems C_ExecCmdLineParams (true, false); // [RH] do all +set commands on the command line iwad = Args.CheckValue("-iwad"); if(!iwad) iwad = ""; D_AddDefWads(iwad); D_AddCmdParameterFiles(); wadhashes = W_InitMultipleFiles (wadfiles); // [RH] Initialize localizable strings. GStrings.LoadStrings (W_GetNumForName ("LANGUAGE"), STRING_TABLE_SIZE, false); GStrings.Compact (); // [RH] Initialize configurable strings. //D_InitStrings (); D_DoDefDehackedPatch (); // [RH] Moved these up here so that we can do most of our // startup output in a fullscreen console. HU_Init (); I_Init (); V_Init (); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks (); // [RH] User-configurable startup strings. Because BOOM does. if (GStrings(STARTUP1)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP1)); if (GStrings(STARTUP2)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP2)); if (GStrings(STARTUP3)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP3)); if (GStrings(STARTUP4)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP4)); if (GStrings(STARTUP5)[0]) Printf (PRINT_HIGH, "%s\n", GStrings(STARTUP5)); // Nomonsters sv_nomonsters = Args.CheckParm("-nomonsters"); // Respawn sv_monstersrespawn = Args.CheckParm("-respawn"); // Fast sv_fastmonsters = Args.CheckParm("-fast"); // developer mode devparm = Args.CheckParm ("-devparm"); // Record a vanilla demo p = Args.CheckParm ("-record"); if (p) { autorecord = true; autostart = true; demorecordfile = Args.GetArg (p+1); } // get skill / episode / map from parms strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); // Check for -playdemo, play a single demo then quit. p = Args.CheckParm ("-playdemo"); // Hack to check for +playdemo command, since if you just add it normally // it won't run because it's attempting to run a demo and still set up the // first map as normal. if (!p) p = Args.CheckParm ("+playdemo"); if (p && p < Args.NumArgs()-1) { Printf (PRINT_HIGH, "Playdemo parameter found on command line.\n"); singledemo = true; defdemoname = Args.GetArg (p+1); } const char *val = Args.CheckValue ("-skill"); if (val) { sv_skill.Set (val[0]-'0'); } p = Args.CheckParm ("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi (Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy (startmap, CalcMapName (ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm ("+map"); if (p && p < Args.NumArgs()-1) { strncpy (startmap, Args.GetArg (p+1), 8); ((char *)Args.GetArg (p))[0] = '-'; autostart = true; } if (devparm) Printf (PRINT_HIGH, "%s", GStrings(D_DEVSTR)); // D_DEVSTR // [RH] Now that all text strings are set up, // insert them into the level and cluster data. G_SetLevelStrings (); // [RH] Parse through all loaded mapinfo lumps G_ParseMapInfo (); // [ML] Parse musinfo lump G_ParseMusInfo (); // [RH] Parse any SNDINFO lumps S_ParseSndInfo(); // Check for -file in shareware if (modifiedgame && (gameinfo.flags & GI_SHAREWARE)) I_Error ("You cannot -file with the shareware version. Register!"); #ifdef WIN32 const char *sdlv = getenv("SDL_VIDEODRIVER"); Printf (PRINT_HIGH, "Using %s video driver.\n",sdlv); #endif Printf (PRINT_HIGH, "M_Init: Init miscellaneous info.\n"); M_Init (); Printf (PRINT_HIGH, "R_Init: Init DOOM refresh daemon.\n"); R_Init (); Printf (PRINT_HIGH, "P_Init: Init Playloop state.\n"); P_InitEffects(); // [ML] Do this here so we don't have to put particle crap in server P_Init (); Printf (PRINT_HIGH, "S_Init: Setting up sound.\n"); Printf (PRINT_HIGH, "S_Init: default sfx volume is %g\n", (float)snd_sfxvolume); Printf (PRINT_HIGH, "S_Init: default music volume is %g\n", (float)snd_musicvolume); S_Init (snd_sfxvolume, snd_musicvolume); I_FinishClockCalibration (); Printf (PRINT_HIGH, "D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame (); Printf (PRINT_HIGH, "ST_Init: Init status bar.\n"); ST_Init (); // [RH] Initialize items. Still only used for the give command. :-( InitItems (); // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet (); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams (false, false); Printf_Bold("\n\35\36\36\36\36 Odamex Client Initialized \36\36\36\36\37\n"); if(gamestate != GS_CONNECTING) Printf(PRINT_HIGH, "Type connect <address> or use the Odamex Launcher to connect to a game.\n"); Printf(PRINT_HIGH, "\n"); setmodeneeded = false; // [Fly] we don't need to set a video mode here! //gamestate = GS_FULLCONSOLE; // [SL] allow the user to pass the name of a netdemo as the first argument. // This allows easy launching of netdemos from Windows Explorer or other GUIs. // [Xyltol] if (Args.GetArg(1)) { std::string demoarg = Args.GetArg(1); if (demoarg.find(".odd") != std::string::npos) CL_NetDemoPlay(demoarg); } p = Args.CheckParm("-netplay"); if (p) { if (Args.GetArg(p + 1)) { std::string filename = Args.GetArg(p + 1); CL_NetDemoPlay(filename); } else { Printf(PRINT_HIGH, "No netdemo filename specified.\n"); } } // denis - bring back the demos if ( gameaction != ga_loadgame ) { if (autostart || netgame || singledemo) { if (singledemo) G_DoPlayDemo(); else { if(autostart) { // single player warp (like in g_level) serverside = true; sv_allowexit = "1"; sv_freelook = "1"; sv_allowjump = "1"; sv_allowredscreen = "1"; sv_gametype = GM_COOP; players.clear(); players.push_back(player_t()); players.back().playerstate = PST_REBORN; consoleplayer_id = displayplayer_id = players.back().id = 1; } G_InitNew (startmap); if (autorecord) if (G_RecordDemo(demorecordfile.c_str())) G_BeginRecording(); } } else { if (gamestate != GS_CONNECTING) gamestate = GS_HIDECONSOLE; C_ToggleConsole(); D_StartTitle (); // start up intro loop } } // denis - this will run a demo and quit p = Args.CheckParm ("+demotest"); if (p && p < Args.NumArgs()-1) { demotest = 1; defdemoname = Args.GetArg (p+1); G_DoPlayDemo(); while(demoplayback) { DObject::BeginFrame (); G_Ticker(); DObject::EndFrame (); gametic++; } } else { demotest = 0; D_DoomLoop (); // never returns } }
// // D_DoomMain // void D_DoomMain (void) { int p; char file[256]; FindResponseFile (); IdentifyVersion (); setbuf (stdout, NULL); modifiedgame = false; nomonsters = M_CheckParm ("-nomonsters"); respawnparm = M_CheckParm ("-respawn"); fastparm = M_CheckParm ("-fast"); devparm = M_CheckParm ("-devparm"); if (M_CheckParm ("-altdeath")) deathmatch = 2; else if (M_CheckParm ("-deathmatch")) deathmatch = 1; switch ( gamemode ) { case retail: sprintf (title, " " "The Ultimate DOOM Startup v%i.%i" " ", VERSION/100,VERSION%100); break; case shareware: sprintf (title, " " "DOOM Shareware Startup v%i.%i" " ", VERSION/100,VERSION%100); break; case registered: sprintf (title, " " "DOOM Registered Startup v%i.%i" " ", VERSION/100,VERSION%100); break; case commercial: sprintf (title, " " "DOOM 2: Hell on Earth v%i.%i" " ", VERSION/100,VERSION%100); break; /*FIXME case pack_plut: sprintf (title, " " "DOOM 2: Plutonia Experiment v%i.%i" " ", VERSION/100,VERSION%100); break; case pack_tnt: sprintf (title, " " "DOOM 2: TNT - Evilution v%i.%i" " ", VERSION/100,VERSION%100); break; */ default: sprintf (title, " " "Public DOOM - v%i.%i" " ", VERSION/100,VERSION%100); break; } printf ("%s\n",title); if (devparm) printf(D_DEVSTR); if (M_CheckParm("-cdrom")) { printf(D_CDROM); mkdir("c:\\doomdata",0); strcpy (basedefault,"c:/doomdata/default.cfg"); } // 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; printf ("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; } // add any files specified on the command line with -file wadfile // to the wad list // // convenience hack to allow -wart e m to add a wad file // prepend a tilde to the filename so wadfile will be reloadable p = M_CheckParm ("-wart"); if (p) { myargv[p][4] = 'p'; // big hack, change to -warp // Map name handling. switch (gamemode ) { case shareware: case retail: case registered: sprintf (file,"~"DEVMAPS"E%cM%c.wad", myargv[p+1][0], myargv[p+2][0]); printf("Warping to Episode %s, Map %s.\n", myargv[p+1],myargv[p+2]); break; case commercial: default: p = atoi (myargv[p+1]); if (p<10) sprintf (file,"~"DEVMAPS"cdata/map0%i.wad", p); else sprintf (file,"~"DEVMAPS"cdata/map%i.wad", p); break; } D_AddFile (file); } p = M_CheckParm ("-file"); if (p) { // 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][0] != '-') D_AddFile (myargv[p]); } p = M_CheckParm ("-playdemo"); if (!p) p = M_CheckParm ("-timedemo"); if (p && p < myargc-1) { sprintf (file,"%s.lmp", myargv[p+1]); W_AddFileAs (file,"D#DEMO"); printf("Playing demo %s.lmp.\n",myargv[p+1]); } // get skill / episode / map from parms startskill = sk_medium; startepisode = 1; startmap = 1; autostart = false; p = M_CheckParm ("-skill"); if (p && p < myargc-1) { startskill = myargv[p+1][0]-'1'; autostart = true; } p = M_CheckParm ("-episode"); if (p && p < myargc-1) { startepisode = myargv[p+1][0]-'0'; startmap = 1; autostart = true; } p = M_CheckParm ("-timer"); if (p && p < myargc-1 && deathmatch) { int time; time = atoi(myargv[p+1]); printf("Levels will end after %d minute",time); if (time>1) printf("s"); printf(".\n"); } p = M_CheckParm ("-avg"); if (p && p < myargc-1 && deathmatch) printf("Austin Virtual Gaming: Levels will end after 20 minutes\n"); p = M_CheckParm ("-warp"); if (p && p < myargc-1) { if (gamemode == commercial) startmap = atoi (myargv[p+1]); else { startepisode = myargv[p+1][0]-'0'; startmap = myargv[p+2][0]-'0'; } autostart = true; } // init subsystems printf ("V_Init: allocate screens.\n"); V_Init (); printf ("M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults (); // load before initing other systems printf ("Z_Init: Init zone memory allocation daemon. \n"); Z_Init (); printf ("W_Init: Init WADfiles.\n"); W_InitMultipleFiles (wadfiles); // Check and print which version is executed. switch ( gamemode ) { case shareware: case indetermined: printf ( "===========================================================================\n" " Shareware!\n" "===========================================================================\n" ); break; case registered: case retail: case commercial: printf ( "===========================================================================\n" " Commercial product - do not distribute!\n" " Please report software piracy to the SPA: 1-800-388-PIR8\n" "===========================================================================\n" ); break; default: // Ouch. break; } B_InitLumps(); printf ("M_Init: Init miscellaneous info.\n"); M_Init (); printf ("R_Init: Init DOOM refresh daemon - "); R_Init (); printf ("\nP_Init: Init Playloop state.\n"); P_Init (); printf ("I_Init: Setting up machine state.\n"); I_Init (); printf ("D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame (); printf ("S_Init: Setting up sound.\n"); S_Init (snd_SfxVolume /* *8 */, snd_MusicVolume /* *8*/ ); printf ("HU_Init: Setting up heads up display.\n"); HU_Init (); printf ("ST_Init: Init status bar.\n"); ST_Init (); // check for a driver that wants intermission stats p = M_CheckParm ("-statcopy"); if (p && p<myargc-1) { // for statistics driver extern char* statcopy; statcopy = myargv[p+1]; printf ("External statistics registered.\n"); } // start the apropriate game based on parms p = M_CheckParm ("-record"); if (p && p < myargc-1) { G_RecordDemo (myargv[p+1]); autostart = true; } p = M_CheckParm("-fastforward"); if (p && p < myargc-1) { fastforward = atoi(myargv[p+1]); } p = M_CheckParm ("-playdemo"); if (p && p < myargc-1) { singledemo = true; // quit after one demo G_DeferedPlayDemo ("D#DEMO"); D_DoomLoop (); // never returns } p = M_CheckParm ("-timedemo"); if (p && p < myargc-1) { G_TimeDemo (myargv[p+1]); D_DoomLoop (); // never returns } p = M_CheckParm ("-loadgame"); if (p && p < myargc-1) { if (M_CheckParm("-cdrom")) sprintf(file, "c:\\doomdata\\"SAVEGAMENAME"%c.dsg",myargv[p+1][0]); else sprintf(file, SAVEGAMENAME"%c.dsg",myargv[p+1][0]); G_LoadGame (file); } if ( gameaction != ga_loadgame ) { if (autostart || netgame) G_InitNew (startskill, startepisode, startmap); else D_StartTitle (); // start up intro loop } D_DoomLoop (); // never returns }
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; }
// // D_DoomMainSetup // // CPhipps - the old contents of D_DoomMain, but moved out of the main // line of execution so its stack space can be freed static void D_DoomMainSetup(void) { int p; char file[256]; int temp; int choseniwad; SDL_Init(0); M_FindResponseFile(); iwadfile = D_FindIWAD(); modifiedgame = false; nomonsters = M_CheckParm("-nomonsters"); respawnparm = M_CheckParm("-respawn"); fastparm = M_CheckParm("-fast"); devparm = M_CheckParm("-devparm"); if (M_CheckParm("-altdeath")) deathmatch = 2; else if (M_CheckParm("-deathmatch")) deathmatch = 1; M_SetConfigDir(); // turbo option p = M_CheckParm("-turbo"); if (p) { 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; forwardmove[0] = forwardmove[0] * scale / 100; forwardmove[1] = forwardmove[1] * scale / 100; sidemove[0] = sidemove[0] * scale / 100; sidemove[1] = sidemove[1] * scale / 100; } // init subsystems V_Init(); // Load configuration files before initialising other subsystems. M_LoadDefaults(); if (!M_FileExists("doomretro.wad")) if (!M_FileExists("doomretro.wad.temp")) I_Error("Can't find doomretro.wad."); if (iwadfile) { if (D_AddFile(iwadfile)) if (runcount < RUNCOUNT_MAX) runcount++; } else { if (!runcount) D_FirstUse(); rename("doomretro.wad", "doomretro.wad.temp"); do { choseniwad = D_ChooseIWAD(); if (choseniwad == -1) { rename("doomretro.wad.temp", "doomretro.wad"); I_Quit(false); } else if (!choseniwad) PlaySound((LPCTSTR)SND_ALIAS_SYSTEMHAND, NULL, SND_ALIAS_ID | SND_ASYNC); } while (!choseniwad); rename("doomretro.wad.temp", "doomretro.wad"); if (runcount < RUNCOUNT_MAX) runcount++; } M_SaveDefaults(); if (!W_MergeFile("doomretro.wad")) if (!W_MergeFile("doomretro.wad.temp")) I_Error("Can't find doomretro.wad."); if (W_CheckNumForName("BLD2A0") < 0 || W_CheckNumForName("MEDBA0") < 0 || W_CheckNumForName("STBAR2") < 0) I_Error("Wrong version of doomretro.wad."); p = M_CheckParmsWithArgs("-file", "-pwad", 1); if (p > 0) { for (p = p + 1; p < myargc && myargv[p][0] != '-'; ++p) { char *filename = uppercase(D_TryFindWADByName(myargv[p])); if (W_MergeFile(filename)) { modifiedgame = true; if (D_CheckFilename(filename, "NERVE.WAD")) nerve = true; } } } if (FREEDOOM && W_CheckNumForName("FREEDM") < 0 && !modifiedgame) I_Error("FREEDOOM requires a BOOM-compatible source port, and is therefore" "unable to be opened by DOOM RETRO."); DMENUPIC = (W_CheckNumForName("DMENUPIC") >= 0); M_DOOM = (W_CheckMultipleLumps("M_DOOM") > 1); M_EPISOD = (W_CheckMultipleLumps("M_EPISOD") > 1); M_GDHIGH = (W_CheckMultipleLumps("M_GDHIGH") > 1); M_GDLOW = (W_CheckMultipleLumps("M_GDLOW") > 1); M_LOADG = (W_CheckMultipleLumps("M_LOADG") > 1); M_LSCNTR = (W_CheckMultipleLumps("M_LSCNTR") > 1); M_MSENS = (W_CheckMultipleLumps("M_MSENS") > 1); M_MSGOFF = (W_CheckMultipleLumps("M_MSGOFF") > 1); M_MSGON = (W_CheckMultipleLumps("M_MSGON") > 1); M_NEWG = (W_CheckMultipleLumps("M_NEWG") > 1); M_NMARE = (W_CheckMultipleLumps("M_NMARE") > 1); M_OPTTTL = (W_CheckMultipleLumps("M_OPTTTL") > 1); M_PAUSE = (W_CheckMultipleLumps("M_PAUSE") > 1); M_SAVEG = (W_CheckMultipleLumps("M_SAVEG") > 1); M_SKILL = (W_CheckMultipleLumps("M_SKILL") > 1); M_SKULL1 = (W_CheckMultipleLumps("M_SKULL1") > 1); M_SVOL = (W_CheckMultipleLumps("M_SVOL") > 1); STARMS = (W_CheckMultipleLumps("STARMS") > 2); STBAR = (W_CheckMultipleLumps("STBAR") > 2); STCFN034 = (W_CheckMultipleLumps("STCFN034") > 1); STCFN039 = (W_CheckMultipleLumps("STCFN039") > 1); STCFN121 = (W_CheckMultipleLumps("STCFN121") > 1); STYSNUM0 = (W_CheckMultipleLumps("STYSNUM0") > 1); TITLEPIC = (W_CheckNumForName("TITLEPIC") >= 0); WISCRT2 = (W_CheckMultipleLumps("WISCRT2") > 1); bfgedition = (DMENUPIC && W_CheckNumForName("M_ACPT") >= 0); // Generate the WAD hash table. Speed things up a bit. W_GenerateHashTable(); D_IdentifyVersion(); InitGameVersion(); D_SetGameDescription(); D_SetSaveGameDir(); // Check for -file in shareware if (modifiedgame) { // These are the lumps that will be checked in IWAD, // if any one is not present, execution will be aborted. char name[23][9] = { "e2m1", "e2m2", "e2m3", "e2m4", "e2m5", "e2m6", "e2m7", "e2m8", "e2m9", "e3m1", "e3m3", "e3m3", "e3m4", "e3m5", "e3m6", "e3m7", "e3m8", "e3m9", "dphoof", "bfgga0", "heada1", "cybra1", "spida1d1" }; int i; if (gamemode == shareware) I_Error("You cannot use -FILE with the shareware version.\n" "Please purchase the full version."); // Check for fake IWAD with right name, // but w/o all the lumps of the registered version. if (gamemode == registered) for (i = 0; i < 23; i++) if (W_CheckNumForName(name[i]) < 0) I_Error("This is not the registered version."); } // get skill / episode / map from parms startskill = sk_medium; startepisode = 1; startmap = 1; autostart = false; p = M_CheckParmWithArgs("-skill", 1); if (p) { temp = myargv[p + 1][0] - '1'; if (temp >= sk_baby && temp <= sk_nightmare) { startskill = (skill_t)temp; autostart = true; } } p = M_CheckParmWithArgs("-episode", 1); if (p) { temp = myargv[p + 1][0] - '0'; if ((gamemode == shareware && temp == 1) || (temp >= 1 && ((gamemode == registered && temp <= 3) || (gamemode == retail && temp <= 4)))) { startepisode = temp; startmap = 1; autostart = true; } } p = M_CheckParmWithArgs("-expansion", 1); if (p) { temp = myargv[p + 1][0] - '0'; if (gamemode == commercial && temp <= (nerve ? 2 : 1)) { gamemission = (temp == 1 ? doom2 : pack_nerve); selectedexpansion = temp - 1; startepisode = 1; startmap = 1; autostart = true; } } timelimit = 0; p = M_CheckParmWithArgs("-timer", 1); if (p) timelimit = atoi(myargv[p + 1]); p = M_CheckParm("-avg"); if (p) timelimit = 20; p = M_CheckParmWithArgs("-warp", 1); if (p) { static char lumpname[6]; if (gamemode == commercial) { if (strlen(myargv[p + 1]) == 5 && toupper(myargv[p + 1][0]) == 'M' && toupper(myargv[p + 1][1]) == 'A' && toupper(myargv[p + 1][2]) == 'P') startmap = (myargv[p + 1][3] - '0') * 10 + myargv[p + 1][4] - '0'; else startmap = atoi(myargv[p + 1]); sprintf(lumpname, "MAP%02i", startmap); } else { if (strlen(myargv[p + 1]) == 4 && toupper(myargv[p + 1][0]) == 'E' && toupper(myargv[p + 1][2]) == 'M') { startepisode = myargv[p + 1][1] - '0'; startmap = myargv[p + 1][3] - '0'; } else { startepisode = myargv[p + 1][0] - '0'; if (p + 2 < myargc) startmap = myargv[p + 2][0] - '0'; else startmap = 1; } sprintf(lumpname, "E%iM%i", startepisode, startmap); } if (W_CheckNumForName(lumpname) >= 0) autostart = true; } p = M_CheckParmWithArgs("-loadgame", 1); if (p) startloadgame = atoi(myargv[p + 1]); else startloadgame = -1; if (mouseSensitivity < MOUSESENSITIVITY_MIN || mouseSensitivity > MOUSESENSITIVITY_MAX) mouseSensitivity = MOUSESENSITIVITY_DEFAULT; if (mouseSensitivity == MOUSESENSITIVITY_MIN) mouseSensitivity = -5; gamepadSensitivity = (!mouseSensitivity ? 0.0f : (2.0f + mouseSensitivity / (float)MOUSESENSITIVITY_MAX)); if (sfxVolume < SFXVOLUME_MIN || sfxVolume > SFXVOLUME_MAX) sfxVolume = SFXVOLUME_DEFAULT; if (musicVolume < MUSICVOLUME_MIN || musicVolume > MUSICVOLUME_MAX) musicVolume = MUSICVOLUME_DEFAULT; if (screensize < SCREENSIZE_MIN || screensize > SCREENSIZE_MAX) screensize = SCREENSIZE_DEFAULT; if (widescreen && !fullscreen) { widescreen = false; screensize = SCREENSIZE_MAX; } if (!widescreen) hud = true; if (fullscreen && screensize == SCREENSIZE_MAX) { widescreen = true; screensize = SCREENSIZE_MAX - 1; } if (widescreen) { returntowidescreen = true; widescreen = false; } if (screenwidth && screenheight && (screenwidth < SCREENWIDTH || screenheight < SCREENHEIGHT * 3 / 4)) { screenwidth = SCREENWIDTH; screenheight = SCREENWIDTH * 3 / 4; } if (windowwidth < SCREENWIDTH || windowheight < SCREENWIDTH * 3 / 4) { windowwidth = SCREENWIDTH; windowheight = SCREENWIDTH * 3 / 4; } if (gammalevel < GAMMALEVEL_MIN || gammalevel > GAMMALEVEL_MAX) gammalevel = GAMMALEVEL_DEFAULT; gammalevelindex = 0; while (gammalevelindex < GAMMALEVELS) if (gammalevels[gammalevelindex++] == gammalevel) break; if (gammalevelindex == GAMMALEVELS) { gammalevelindex = 0; while (gammalevels[gammalevelindex++] != GAMMALEVEL_DEFAULT); } gammalevelindex--; if (bloodsplats < BLOODSPLATS_MIN || bloodsplats > BLOODSPLATS_MAX) bloodsplats = BLOODSPLATS_DEFAULT; bloodSplatSpawner = ((bloodsplats == UNLIMITED ? P_SpawnBloodSplat : (bloodsplats ? P_SpawnBloodSplat2 : P_SpawnBloodSplat3))); if (pixelwidth < PIXELWIDTH_MIN || pixelwidth > PIXELWIDTH_MAX) pixelwidth = PIXELWIDTH_DEFAULT; while (SCREENWIDTH % pixelwidth) pixelwidth--; if (pixelheight < PIXELHEIGHT_MIN || pixelheight > PIXELHEIGHT_MAX) pixelheight = PIXELHEIGHT_DEFAULT; while (SCREENHEIGHT % pixelheight) pixelheight--; M_Init(); R_Init(); P_Init(); I_Init(); S_Init((int)(sfxVolume * (127.0f / 15.0f)), (int)(musicVolume * (127.0f / 15.0f))); D_CheckNetGame(); HU_Init(); ST_Init(); AM_Init(); if (startloadgame >= 0) { M_StringCopy(file, P_SaveGameFile(startloadgame), sizeof(file)); G_LoadGame(file); } if (gameaction != ga_loadgame) { if (autostart || netgame) G_DeferredInitNew(startskill, startepisode, startmap); else D_StartTitle(); // start up intro loop } }
// // D_DoomMain // // [NightFang] - Cause I cant call ArgsSet from g_level.cpp // [ML] 23/1/07 - Add Response file support back in // void D_DoomMain() { unsigned int p; gamestate = GS_STARTUP; // init console so it can capture all of the startup messages C_InitConsole(); atterm(C_ShutdownConsole); W_SetupFileIdentifiers(); // [RH] Initialize items. Still only used for the give command. :-( InitItems(); M_FindResponseFile(); // [ML] 23/1/07 - Add Response file support back in if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError("Could not initialize LZO routines"); C_ExecCmdLineParams(false, true); // [Nes] test for +logfile command // Always log by default if (!LOG.is_open()) C_DoCommand("logfile"); M_LoadDefaults(); // load before initing other systems C_ExecCmdLineParams(true, false); // [RH] do all +set commands on the command line std::vector<std::string> newwadfiles, newpatchfiles; const char* iwad_filename_cstr = Args.CheckValue("-iwad"); if (iwad_filename_cstr) { std::string iwad_filename(iwad_filename_cstr); M_AppendExtension(iwad_filename, ".WAD"); newwadfiles.push_back(iwad_filename); } D_AddWadCommandLineFiles(newwadfiles); D_AddDehCommandLineFiles(newpatchfiles); D_LoadResourceFiles(newwadfiles, newpatchfiles); Printf(PRINT_HIGH, "I_Init: Init hardware.\n"); I_Init(); // [SL] Call init routines that need to be reinitialized every time WAD changes D_Init(); atterm(D_Shutdown); Printf(PRINT_HIGH, "SV_InitNetwork: Checking network game status.\n"); SV_InitNetwork(); // Base systems have been inited; enable cvar callbacks cvar_t::EnableCallbacks(); // [RH] User-configurable startup strings. Because BOOM does. if (GStrings(STARTUP1)[0]) Printf(PRINT_HIGH, "%s\n", GStrings(STARTUP1)); if (GStrings(STARTUP2)[0]) Printf(PRINT_HIGH, "%s\n", GStrings(STARTUP2)); if (GStrings(STARTUP3)[0]) Printf(PRINT_HIGH, "%s\n", GStrings(STARTUP3)); if (GStrings(STARTUP4)[0]) Printf(PRINT_HIGH, "%s\n", GStrings(STARTUP4)); if (GStrings(STARTUP5)[0]) Printf(PRINT_HIGH, "%s\n", GStrings(STARTUP5)); // developer mode devparm = Args.CheckParm("-devparm"); if (devparm) Printf (PRINT_HIGH, "%s", GStrings(D_DEVSTR)); // D_DEVSTR // Nomonsters if (Args.CheckParm("-nomonsters")) sv_nomonsters = 1; // Respawn if (Args.CheckParm("-respawn")) sv_monstersrespawn = 1; // Fast if (Args.CheckParm("-fast")) sv_fastmonsters = 1; // get skill / episode / map from parms strcpy(startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); const char* val = Args.CheckValue("-skill"); if (val) sv_skill.Set(val[0] - '0'); p = Args.CheckParm("-timer"); if (p && p < Args.NumArgs() - 1) { float time = atof(Args.GetArg(p + 1)); Printf(PRINT_HIGH, "Levels will end after %g minute%s.\n", time, time > 1 ? "s" : ""); sv_timelimit.Set(time); } if (Args.CheckValue("-avg")) { Printf(PRINT_HIGH, "Austin Virtual Gaming: Levels will end after 20 minutes\n"); sv_timelimit.Set(20); } // [RH] Lock any cvars that should be locked now that we're // about to begin the game. cvar_t::EnableNoSet(); // [RH] Now that all game subsystems have been initialized, // do all commands on the command line other than +set C_ExecCmdLineParams(false, false); // [AM] Initialize banlist SV_InitBanlist(); Printf(PRINT_HIGH, "========== Odamex Server Initialized ==========\n"); #ifdef UNIX if (Args.CheckParm("-fork")) daemon_init(); #endif p = Args.CheckParm("-warp"); if (p && p < Args.NumArgs() - (1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; if (gameinfo.flags & GI_MAPxx) { ep = 1; map = atoi(Args.GetArg(p+1)); } else { ep = Args.GetArg(p+1)[0]-'0'; map = Args.GetArg(p+2)[0]-'0'; } strncpy(startmap, CalcMapName(ep, map), 8); autostart = true; } // [RH] Hack to handle +map p = Args.CheckParm("+map"); if (p && p < Args.NumArgs() - 1) { strncpy(startmap, Args.GetArg(p + 1), 8); ((char*)Args.GetArg(p))[0] = '-'; autostart = true; } strncpy(level.mapname, startmap, sizeof(level.mapname)); G_ChangeMap(); D_DoomLoop(); // never returns }
// // D_DoomMain // void D_DoomMain(void) { int p; char file[256]; // *** PID BEGIN *** // Pointer to environment variable string to determine username. char *whoami = NULL; // Value to check whether there were any userlist-related flags // given on the command line. Used to determine whether to // set up default userlist parameters. boolean userlist_arg_given = false; // *** PID END *** FindResponseFile(); IdentifyVersion(); // add xdoom.wad with the extensions // *** PID BEGIN *** // Ok, this doesn't have to do with psdoom, but an abort message here // would be good if we can't find xdoom.wad. If this weren't here, // the game crashes later on with a more obscure error message. if (!access(xdoomwad, R_OK)) { D_AddFile(xdoomwad); } else { I_Error("Cannot load mandatory xdoom.wad\n"); } // old code: // if (!access(xdoomwad, R_OK)) // D_AddFile(xdoomwad); // If the command-line flag to suppress auto-loading of custom // ps management levels is *not* there, load the appropriate level. if ( !M_CheckParm("-nopslev") ) { // Add psdoom1.wad if this is registered (Doom 1) or retail (Ultimite Doom). // If we loaded it, set the flag to true so we can place the monsters in the // correct positions. if ( gamemode == registered || gamemode == retail ){ if (!access(psdoom1wad, R_OK)) { D_AddFile(psdoom1wad); ps_level_loaded = true; } } // Add psdoom2.wad if this is commercial (Doom 2) and not an add-on pack. // If we loaded it, set the flag to true so we can place the monsters in the // correct positions. if ( gamemode == commercial && gamemission == doom2 ) { if (!access(psdoom2wad, R_OK)) { D_AddFile(psdoom2wad); ps_level_loaded = true; } } } // end if auto-load suppression flag isn't there // *** PID END *** setbuf(stdout, NULL); modifiedgame = false; nomonsters = M_CheckParm("-nomonsters"); // *** PID BEGIN *** // This keeps a 'no monsters' that is persistant across new games // and level warps. if ( (nomonstersperiod = M_CheckParm("-nomonsters.") ) ) { nomonsters = true; } // This makes items respawn as in -altdeath (ie. no dropped items, // no invis, no invun) respawnitems = M_CheckParm("-respawnitems"); // Get flag to determine whether to run the 'ps' portion of the program. nopsmon = M_CheckParm("-nopsmon"); // Get flag to determine whether to execute the actual re-nice and kill // of processes. nopsact = M_CheckParm("-nopsact"); // Get flag to determine whether pid monsters can be hurt and killed by // things other than a player. They can be hurt if this flag is true. nopssafety = M_CheckParm("-nopssafety"); // Get flag to tell if we show all users' processes. userlist_arg_given // is assigned so we don't set defaults later on since we specified // at least one user-related option. psallusers = userlist_arg_given = M_CheckParm("-psallusers"); // Set up list of users whose processes to include. p = M_CheckParm("-psuser"); if (p) { // Keeps track if any specific usernames are given. If not, // use the current user's name. boolean user_name_given = false; userlist_arg_given = true; // Don't set defaults later on... // the parms after p are user names, // until end of parms or another - preceded parm while (++p != myargc && myargv[p][0] != '-') { user_name_given = true; add_to_ps_userlist(psuser, myargv[p]); } // If there were no arguments to the -psuser flag, // add current username to the list if ( !user_name_given ) { if ( whoami == NULL ) { // Need to get username // Get username of the person running the program. // PSDOOMUSER, LOGNAME, USER, and USERNAME in the environment // are checked with getenv(), in that order. If none of // these are set, abort with a message to set one of them. if ( (whoami=getenv("PSDOOMUSER")) == NULL ) if ( (whoami=getenv("LOGNAME")) == NULL ) if ( (whoami=getenv("USER")) == NULL ) if ( (whoami=getenv("USERNAME")) == NULL ) { // Error! Need to have at least one of these set in // the environment so we can determine current username. I_Error("Could not determine your username.\nNeed to have PSDOOMUSER, LOGNAME, USER, or USERNAME set in the environment.\n"); } } // end 'if whoami is not set' add_to_ps_userlist(psuser, whoami); } // end 'if we default in current username' } // end -psuser // Set up list of users whose processes to exclude. p = M_CheckParm("-psnotuser"); if (p) { // Keeps track if any specific usernames are given. If not, // use the current user's name. boolean user_name_given = false; userlist_arg_given = true; // Don't set defaults later on... // the parms after p are user names, // until end of parms or another - preceded parm while (++p != myargc && myargv[p][0] != '-') { user_name_given = true; add_to_ps_userlist(psnotuser, myargv[p]); } // If there were no arguments to the -psnotuser flag, // add current username to the list if ( !user_name_given ) { if ( whoami == NULL ) { // Need to get username // Get username of the person running the program. // PSDOOMUSER, LOGNAME, USER, and USERNAME in the environment // are checked with getenv(), in that order. If none of // these are set, abort with a message to set one of them. if ( (whoami=getenv("PSDOOMUSER")) == NULL ) if ( (whoami=getenv("LOGNAME")) == NULL ) if ( (whoami=getenv("USER")) == NULL ) if ( (whoami=getenv("USERNAME")) == NULL ) { // Error! Need to have at least one of these set in // the environment so we can determine current username. I_Error("Could not determine your username.\nNeed to have PSDOOMUSER, LOGNAME, USER, or USERNAME set in the environment.\n"); } } // end 'if whoami is not set' add_to_ps_userlist(psnotuser, whoami); } // end 'if we default in the current username' } // end -psnotuser // If none of the user-related flags were given on the command line, // set defaults depending on whether the current user is root or not. if ( !userlist_arg_given ) { if ( whoami == NULL ) { // Need to get username // Get username of the person running the program. // PSDOOMUSER, LOGNAME, USER, and USERNAME in the environment // are checked with getenv(), in that order. If none of // these are set, abort with a message to set one of them. if ( (whoami=getenv("PSDOOMUSER")) == NULL ) if ( (whoami=getenv("LOGNAME")) == NULL ) if ( (whoami=getenv("USER")) == NULL ) if ( (whoami=getenv("USERNAME")) == NULL ) { // Error! Need to have at least one of these set in // the environment so we can determine current username. I_Error("Could not determine your username.\nNeed to have PSDOOMUSER, LOGNAME, USER, or USERNAME set in the environment.\n"); } } // end 'if whoami is not set' if ( !strcmp(whoami,"root") ) { // username is "root". show all user processes. psallusers = true; } else { // username is not "root". show only current user's processes. add_to_ps_userlist(psuser, whoami); } } // end if !userlist_arg_given // *** PID END *** respawnparm = M_CheckParm("-respawn"); fastparm = M_CheckParm("-fast"); devparm = M_CheckParm("-devparm"); nosound = M_CheckParm("-nosound"); nomusic = M_CheckParm("-nomusic"); cdaudio = M_CheckParm("-cdaudio"); showkey = M_CheckParm("-showkeysym"); notranslu = M_CheckParm("-notrans"); noendtxt = M_CheckParm("-noendtxt"); if (M_CheckParm("-altdeath")) deathmatch = 2; else if (M_CheckParm("-deathmatch")) deathmatch = 1; else if (M_CheckParm("-altcoop")) altcoop = 1; stripextbits = M_CheckParm("-stripextbits"); // remember state of smoke trails in the state tables smoketrail = states[S_ROCKET].action; switch (gamemode) { case retail: sprintf(title, " " "The Ultimate DOOM Startup v%i.%i" " ", VERSION/100,VERSION%100); break; case shareware: sprintf(title, " " "DOOM Shareware Startup v%i.%i" " ", VERSION/100,VERSION%100); break; case registered: sprintf(title, " " "DOOM Registered Startup v%i.%i" " ", VERSION/100,VERSION%100); break; case commercial: switch (gamemission) { case doom2: sprintf(title, " " "DOOM 2: Hell on Earth v%i.%i" " ", VERSION/100,VERSION%100); break; case pack_plut: sprintf(title, " " "DOOM 2: Plutonia Experiment v%i.%i" " ", VERSION/100,VERSION%100); break; case pack_tnt: sprintf(title, " " "DOOM 2: TNT - Evilution v%i.%i" " ", VERSION/100,VERSION%100); break; default: sprintf(title, " " "Unknown Title"); break; } break; default: sprintf(title, " " "Public DOOM - v%i.%i" " ", VERSION/100,VERSION%100); break; } printf("%s\n",title); // *** PID BEGIN *** printf(" psDooM version - %s\n", PSVERSION); printf(" based on:\n"); // *** PID END *** printf(" XDoom build %i\n\n", BUILD); // *** PID BEGIN *** printf("\tpsDooM is released under the GNU General Public License 2.0.\n"); // old code: // printf("\tXDoom is released under the GNU General Public License 2.0.\n"); // *** PID END *** printf("\tYou are welcome to redistribute it under certain conditions.\n"); printf("\tIt comes with ABSOLUTELY NO WARRANTY. See file COPYING for" " details.\n\n"); if (devparm) printf(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; printf("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; } // add any files specified on the command line with -file wadfile // to the wad list // // convenience hack to allow -wart e m to add a wad file // prepend a tilde to the filename so wadfile will be reloadable p = M_CheckParm("-wart"); if (p) { myargv[p][4] = 'p'; // big hack, change to -warp // Map name handling. switch (gamemode) { case shareware: case retail: case registered: sprintf(file, "~"DEVMAPS"E%cM%c.wad", myargv[p + 1][0], myargv[p + 2][0]); printf("Warping to Episode %s, Map %s.\n", myargv[p + 1], myargv[p + 2]); break; case commercial: default: p = atoi(myargv[p + 1]); if (p < 10) sprintf(file, "~"DEVMAPS"cdata/map0%i.wad", p); else sprintf(file, "~"DEVMAPS"cdata/map%i.wad", p); break; } D_AddFile(file); } p = M_CheckParm("-file"); if (p) { // 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][0] != '-') D_AddFile(myargv[p]); } p = M_CheckParm("-playdemo"); if (!p) { p = M_CheckParm("-timedemo"); if (p) { #ifndef SNDSERV nosound = true; #endif noendtxt = true; } } if (p && p < myargc - 1) { sprintf(file,"%s.lmp", myargv[p + 1]); D_AddFile(file); printf("Playing demo %s.lmp.\n", myargv[p + 1]); } // get skill / episode / map from parms startskill = sk_medium; startepisode = 1; startmap = 1; autostart = false; p = M_CheckParm("-skill"); if (p && p < myargc - 1) { startskill = myargv[p + 1][0] - '1'; autostart = true; } p = M_CheckParm("-episode"); if (p && p < myargc - 1) { startepisode = myargv[p + 1][0] - '0'; startmap = 1; autostart = true; } p = M_CheckParm("-timer"); if (p && p < myargc - 1 && deathmatch) { int time = atoi(myargv[p + 1]); printf("Levels will end after %d minute", time); if (time > 1) printf("s"); printf(".\n"); } p = M_CheckParm("-avg"); if (p && p < myargc - 1 && deathmatch) printf("Austin Virtual Gaming: Levels will end after 20 minutes\n"); p = M_CheckParm("-warp"); if (p && p < myargc - 1) { if (gamemode == commercial) startmap = atoi(myargv[p + 1]); else { startepisode = myargv[p + 1][0] - '0'; startmap = myargv[p + 2][0] - '0'; } autostart = true; } // init subsystems printf("V_Init: allocate screens.\n"); V_Init(); printf("M_LoadDefaults: Load system defaults.\n"); M_LoadDefaults(); // load before initing other systems printf("Z_Init: Init zone memory allocation daemon. \n"); Z_Init(); printf("W_Init: Init WADfiles.\n"); W_InitMultipleFiles(wadfiles); // Check for Ultimate Doom if (gamemode == registered) { if (W_CheckNumForName("e4m1") != -1) { gamemode = retail; printf("=== This is Ultimate Doom! ===\n"); } } // Check for -file in shareware if (modifiedgame) { // These are the lumps that will be checked in IWAD, // if any one is not present, execution will be aborted. char name[23][8] = { "e2m1","e2m2","e2m3","e2m4","e2m5","e2m6","e2m7","e2m8","e2m9", "e3m1","e3m3","e3m3","e3m4","e3m5","e3m6","e3m7","e3m8","e3m9", "dphoof","bfgga0","heada1","cybra1","spida1d1" }; int i; if (gamemode == shareware) I_Error("\nYou cannot -file with the shareware version. Register!"); // Check for fake IWAD with right name, // but w/o all the lumps of the registered version. if (gamemode == registered) for (i = 0; i < 23; i++) if (W_CheckNumForName(name[i]) < 0) I_Error("\nThis is not the registered version."); } #if 0 // If additional PWAD files are used, print modified banner if (modifiedgame) { printf ( "===========================================================================\n" "ATTENTION: This version of DOOM has been modified. If you would like to\n" "get a copy of the original game, call 1-800-IDGAMES or see the readme file.\n" " You will not receive technical support for modified games.\n" " press enter to continue\n" "===========================================================================\n" ); getchar(); } #endif #if 0 // Check and print which version is executed. switch (gamemode) { case shareware: case indetermined: printf( "===========================================================================\n" " Shareware!\n" "===========================================================================\n" ); break; case registered: case retail: case commercial: printf( "===========================================================================\n" " Commercial product - do not distribute!\n" " Please report software piracy to the SPA: 1-800-388-PIR8\n" "===========================================================================\n" ); break; default: // Ouch. break; } #endif printf("M_Init: Init miscellaneous info.\n"); M_Init(); printf("R_Init: Init DOOM refresh daemon - "); R_Init(); printf("\nP_Init: Init Playloop state.\n"); P_Init(); printf("I_Init: Setting up machine state.\n"); I_Init(); printf("D_CheckNetGame: Checking network game status.\n"); D_CheckNetGame(); if (!nosound) { printf("S_Init: Setting up sound.\n"); S_Init(snd_SfxVolume, snd_MusicVolume, snd_CdVolume); } printf("HU_Init: Setting up heads up display.\n"); HU_Init(); printf("ST_Init: Init status bar.\n"); ST_Init(); // check for a driver that wants intermission stats p = M_CheckParm("-statcopy"); if (p && p < myargc - 1) { // for statistics driver extern void *statcopy; statcopy = (void*)atoi(myargv[p + 1]); printf("External statistics registered.\n"); } // start the apropriate game based on parms p = M_CheckParm("-record"); if (p && p < myargc - 1) { G_RecordDemo(myargv[p + 1]); autostart = true; } p = M_CheckParm("-playdemo"); if (p && p < myargc - 1) { singledemo = true; // quit after one demo G_DeferedPlayDemo(myargv[p+1]); D_DoomLoop(); // never returns } p = M_CheckParm("-timedemo"); if (p && p < myargc - 1) { G_TimeDemo(myargv[p + 1]); D_DoomLoop(); // never returns } p = M_CheckParm("-loadgame"); if (p && p < myargc - 1) { // *** PID BEGIN *** // Make a ~/.psdoom directory for savegames, configs, etc. sprintf(file, "%s/.psdoom/"SAVEGAMENAME"%c.dsg", home, myargv[p + 1][0]); // old code: // sprintf(file, "%s/.xdoom/"SAVEGAMENAME"%c.dsg", home, // myargv[p + 1][0]); // *** PID END *** G_LoadGame(file); } if (gameaction != ga_loadgame) { if (autostart || netgame) G_InitNew(startskill, startepisode, startmap); else D_StartTitle(); // start up intro loop } D_DoomLoop(); // never returns }