Seed command fully implemented but apparently buggy.

Dwarf appearance is not yet reproducible.
This commit is contained in:
Eric S. Raymond 2017-05-24 09:06:41 -04:00
parent 65c081a0ac
commit cf219e920b
4 changed files with 19 additions and 9 deletions

View file

@ -625,6 +625,14 @@ L8340: if(!AT(RESER) && LOC != FIXED[RESER]-1) return(2011);
RSPEAK(241); RSPEAK(241);
return(2); return(2);
L8350: printf("I see a SEED command. %s\n", raw_input); /* Seed. Expected in game logs to replicate the LCG state */
L8350: {
long sv;
int n;
n = sscanf(raw_input, "seed %ld\n", &sv);
if (n >= 1)
set_seed(sv);
return(2); return(2);
} }
}

5
main.c
View file

@ -58,6 +58,7 @@ static void do_command(FILE *);
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int ch; int ch;
time_t starttime = time(NULL);
/* Adventure (rev 2: 20 treasures) */ /* Adventure (rev 2: 20 treasures) */
@ -101,7 +102,7 @@ int main(int argc, char *argv[]) {
lcgstate.a = 1093; lcgstate.a = 1093;
lcgstate.c = 221587; lcgstate.c = 221587;
lcgstate.m = 1048576; lcgstate.m = 1048576;
set_seed_from_time(); set_seed((long)starttime);
/* Read the database if we have not yet done so */ /* Read the database if we have not yet done so */
@ -134,6 +135,8 @@ L1: SETUP= -1;
LIMIT=330; LIMIT=330;
if(NOVICE)LIMIT=1000; if(NOVICE)LIMIT=1000;
if (logfp)
fprintf(logfp, "seed %ld\n", starttime);
for (;;) { for (;;) {
do_command(stdin); do_command(stdin);
} }

7
misc.c
View file

@ -723,7 +723,7 @@ L2: ATDWRF=I;
/* Utility routines (SETBIT, TSTBIT, set_seed_from_time, get_next_lcg_value, randrange, RNDVOC, BUG) */ /* Utility routines (SETBIT, TSTBIT, set_seed, get_next_lcg_value, randrange, RNDVOC, BUG) */
#undef SETBIT #undef SETBIT
long fSETBIT(long BIT) { long fSETBIT(long BIT) {
@ -758,10 +758,9 @@ long TSTBIT;
#define TSTBIT(MASK,BIT) fTSTBIT(MASK,BIT) #define TSTBIT(MASK,BIT) fTSTBIT(MASK,BIT)
void set_seed_from_time(void) void set_seed(long seedval)
{ {
/* Use the current system time to get seed the ISO rand() function, from which we get a seed for the LCG. */ srand(seedval);
srand(time(NULL));
lcgstate.x = (unsigned long) rand() % lcgstate.m; lcgstate.x = (unsigned long) rand() % lcgstate.m;
} }

2
misc.h
View file

@ -72,6 +72,6 @@ extern long fIABS(long);
#define IABS(N) fIABS(N) #define IABS(N) fIABS(N)
extern long fMOD(long,long); extern long fMOD(long,long);
#define MOD(N,M) fMOD(N,M) #define MOD(N,M) fMOD(N,M)
extern void set_seed_from_time(void); extern void set_seed(long);
extern unsigned long get_next_lcg_value(void); extern unsigned long get_next_lcg_value(void);
extern long randrange(long); extern long randrange(long);