This commit is contained in:
Christoph Oelckers 2014-05-03 12:29:18 +02:00
commit a4076ffe38
5 changed files with 62 additions and 5 deletions

View file

@ -1993,7 +1993,19 @@ static void D_DoomInit()
SetLanguageIDs (); SetLanguageIDs ();
const char *v = Args->CheckValue("-rngseed");
if (v)
{
rngseed = staticrngseed = atoi(v);
use_staticrng = true;
Printf("D_DoomInit: Static RNGseed %d set.\n", rngseed);
}
else
{
rngseed = I_MakeRNGSeed(); rngseed = I_MakeRNGSeed();
use_staticrng = false;
}
FRandom::StaticClearRandom (); FRandom::StaticClearRandom ();
Printf ("M_LoadDefaults: Load system defaults.\n"); Printf ("M_LoadDefaults: Load system defaults.\n");

View file

@ -408,9 +408,11 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
if (!savegamerestore) if (!savegamerestore)
{ {
if (!netgame) if (!netgame && !demorecording && !demoplayback)
{ // [RH] Change the random seed for each new single player game {
rngseed = rngseed + 1; // [RH] Change the random seed for each new single player game
// [ED850] The demo already sets the RNG.
rngseed = use_staticrng ? staticrngseed : (rngseed + 1);
} }
FRandom::StaticClearRandom (); FRandom::StaticClearRandom ();
P_ClearACSVars(true); P_ClearACSVars(true);

View file

@ -89,8 +89,11 @@ DEFINE_ACTION_FUNCTION(AActor, A_LightGoesOut)
sec->SetLightLevel(0); sec->SetLightLevel(0);
fixed_t oldtheight = sec->floorplane.Zat0();
newheight = sec->FindLowestFloorSurrounding(&spot); newheight = sec->FindLowestFloorSurrounding(&spot);
sec->floorplane.d = sec->floorplane.PointToDist (spot, newheight); sec->floorplane.d = sec->floorplane.PointToDist (spot, newheight);
fixed_t newtheight = sec->floorplane.Zat0();
sec->ChangePlaneTexZ(sector_t::floor, newtheight - oldtheight);
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {

View file

@ -96,6 +96,42 @@ FRandom M_Random;
// Global seed. This is modified predictably to initialize every RNG. // Global seed. This is modified predictably to initialize every RNG.
DWORD rngseed; DWORD rngseed;
// Static RNG marker. This is only used when the RNG is set for each new game.
DWORD staticrngseed;
bool use_staticrng;
// Allows checking or staticly setting the global seed.
CCMD(rngseed)
{
if (argv.argc() == 1)
{
Printf("Usage: rngseed get|set|clear\n");
return;
}
if (stricmp(argv[1], "get") == 0)
{
Printf("rngseed is %d\n", rngseed);
}
else if (stricmp(argv[1], "set") == 0)
{
if (argv.argc() == 2)
{
Printf("You need to specify a value to set\n");
}
else
{
staticrngseed = atoi(argv[2]);
use_staticrng = true;
Printf("Static rngseed %d will be set for next game\n", staticrngseed);
}
}
else if (stricmp(argv[1], "clear") == 0)
{
use_staticrng = false;
Printf("Static rngseed cleared\n");
}
}
// PRIVATE DATA DEFINITIONS ------------------------------------------------ // PRIVATE DATA DEFINITIONS ------------------------------------------------
FRandom *FRandom::RNGList; FRandom *FRandom::RNGList;

View file

@ -215,6 +215,10 @@ private:
extern DWORD rngseed; // The starting seed (not part of state) extern DWORD rngseed; // The starting seed (not part of state)
extern DWORD staticrngseed; // Static rngseed that can be set by the user
extern bool use_staticrng;
// M_Random can be used for numbers that do not affect gameplay // M_Random can be used for numbers that do not affect gameplay
extern FRandom M_Random; extern FRandom M_Random;