diff --git a/include/decl.h b/include/decl.h index 66bfd74c1..eb3c904c4 100644 --- a/include/decl.h +++ b/include/decl.h @@ -220,6 +220,7 @@ E NEARDATA boolean mrg_to_wielded; E NEARDATA boolean defer_see_monsters; E NEARDATA boolean in_steed_dismounting; +E NEARDATA boolean has_strong_rngseed; E const int shield_static[]; diff --git a/src/decl.c b/src/decl.c index 3e9fb82cc..2849418e6 100644 --- a/src/decl.c +++ b/src/decl.c @@ -120,6 +120,7 @@ NEARDATA boolean mrg_to_wielded = FALSE; /* weapon picked is merged with wielded one */ NEARDATA boolean in_steed_dismounting = FALSE; +NEARDATA boolean has_strong_rngseed = FALSE; NEARDATA coord bhitpos = DUMMY; NEARDATA coord doors[DOORMAX] = { DUMMY }; diff --git a/src/hacklib.c b/src/hacklib.c index 56e301ed2..60f492b37 100644 --- a/src/hacklib.c +++ b/src/hacklib.c @@ -899,8 +899,10 @@ init_random() void reseed_random() { - /* reseed */ - init_random(); + /* only reseed if we are certain that the seed generation is unguessable + * by the players. */ + if (has_strong_rngseed) + init_random(); } time_t diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 6b3cf5aea..0a1f469a7 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -776,6 +776,7 @@ sys_random_seed() fptr = fopen(DEV_RANDOM, "r"); if (fptr) { fread(&seed, sizeof(long), 1, fptr); + has_strong_rngseed = TRUE; } fclose(fptr); #else diff --git a/sys/winnt/winnt.c b/sys/winnt/winnt.c index 1a1fa710e..fc75071d8 100644 --- a/sys/winnt/winnt.c +++ b/sys/winnt/winnt.c @@ -708,6 +708,7 @@ sys_random_seed(VOID_ARGS) (ULONG) sizeof ourseed, 0); if (status == STATUS_SUCCESS) { BCryptCloseAlgorithmProvider(hRa,0); + has_strong_rngseed = TRUE; Plan_B = FALSE; } }