diff --git a/src/doomstat.h b/src/doomstat.h index bbb323c7e..70869b5a2 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -71,6 +71,9 @@ extern bool netgame; // Bot game? Like netgame, but doesn't involve network communication. extern bool multiplayer; +// [SP] MPMap implementation - invokes fake multiplayer without bots +extern bool multiplayernext; + // Flag: true only if started as net deathmatch. EXTERN_CVAR (Int, deathmatch) diff --git a/src/g_game.cpp b/src/g_game.cpp index b0c8775fc..2c827e639 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -164,6 +164,7 @@ bool viewactive; bool netgame; // only true if packets are broadcast bool multiplayer; +bool multiplayernext = false; // [SP] MPMap implementation player_t players[MAXPLAYERS]; bool playeringame[MAXPLAYERS]; diff --git a/src/g_level.cpp b/src/g_level.cpp index d3a8c4015..05a85ba63 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -268,6 +268,119 @@ CCMD (open) } } +//========================================================================== +// +// +//========================================================================== + +CCMD (mpmap) +{ + if (netgame) + { + Printf ("Use " TEXTCOLOR_BOLD "changemap" TEXTCOLOR_NORMAL " instead. " TEXTCOLOR_BOLD "Map" + TEXTCOLOR_NORMAL " is for single-player only.\n"); + return; + } + if (argv.argc() > 1) + { + try + { + if (!P_CheckMapData(argv[1])) + { + Printf ("No map %s\n", argv[1]); + } + else + { + multiplayernext = true; + G_DeferedInitNew (argv[1]); + } + } + catch(CRecoverableError &error) + { + if (error.GetMessage()) + Printf("%s", error.GetMessage()); + } + } + else + { + Printf ("Usage: mpmap \n"); + } +} + +//========================================================================== +// +// +//========================================================================== + +CCMD(mprecordmap) +{ + if (netgame) + { + Printf("You cannot record a new game while in a netgame."); + return; + } + if (argv.argc() > 2) + { + try + { + if (!P_CheckMapData(argv[2])) + { + Printf("No map %s\n", argv[2]); + } + else + { + multiplayernext = true; + G_DeferedInitNew(argv[2]); + gameaction = ga_recordgame; + newdemoname = argv[1]; + newdemomap = argv[2]; + } + } + catch (CRecoverableError &error) + { + if (error.GetMessage()) + Printf("%s", error.GetMessage()); + } + } + else + { + Printf("Usage: mprecordmap \n"); + } +} + +//========================================================================== +// +// +//========================================================================== + +CCMD (mpopen) +{ + if (netgame) + { + Printf ("You cannot use open in multiplayer games.\n"); + return; + } + if (argv.argc() > 1) + { + d_mapname = "file:"; + d_mapname += argv[1]; + if (!P_CheckMapData(d_mapname)) + { + Printf ("No map %s\n", d_mapname.GetChars()); + } + else + { + gameaction = ga_newgame2; + d_skill = -1; + multiplayernext = true; + } + } + else + { + Printf ("Usage: mpopen \n"); + } +} + //========================================================================== // @@ -293,7 +406,8 @@ void G_NewInit () G_ClearSnapshots (); ST_SetNeedRefresh(); netgame = false; - multiplayer = false; + multiplayer = multiplayernext; + multiplayernext = false; if (demoplayback) { C_RestoreCVars ();