diff --git a/include/extern.h b/include/extern.h index 1733f17f8..24ca8369b 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2123,7 +2123,7 @@ E boolean FDECL(validrole, (int)); E boolean FDECL(validrace, (int, int)); E boolean FDECL(validgend, (int, int, int)); E boolean FDECL(validalign, (int, int, int)); -E int NDECL(randrole); +E int FDECL(randrole, (BOOLEAN_P)); E int FDECL(randrace, (int)); E int FDECL(randgend, (int, int)); E int FDECL(randalign, (int, int)); diff --git a/include/integer.h b/include/integer.h index c6983e544..b420a708f 100644 --- a/include/integer.h +++ b/include/integer.h @@ -7,7 +7,7 @@ #ifndef INTEGER_H #define INTEGER_H -#if defined(__STDC__) && __STDC_VERSION__ >= 199101L +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) /* The compiler claims to conform to C99. Use stdint.h */ #include #define SKIP_STDINT_WORKAROUND diff --git a/src/pray.c b/src/pray.c index b03a509a3..3a1de4ae7 100644 --- a/src/pray.c +++ b/src/pray.c @@ -2090,15 +2090,13 @@ aligntyp alignment; if (!Hallucination) return align_gname(alignment); - /* Count the roles, so that we can pick one at random. */ - int rolecount = 0; - while (roles[rolecount].filecode) - rolecount++; - - /* The priest may not have initialized god names. If this is the - case, and we roll priest, we need to try again. */ + /* Some roles (Priest) don't have a pantheon unless we're playing as + that role, so keep trying until we get a role which does have one. + [If playing a Priest, the current pantheon will be twice as likely + to get picked as any of the others. That's not significant enough + to bother dealing with.] */ do - which = rn2_on_display_rng(rolecount); + which = randrole(TRUE); while (!roles[which].lgod); switch (rn2_on_display_rng(9)) { diff --git a/src/rnd.c b/src/rnd.c index fa8ce0e20..8f92e42ab 100644 --- a/src/rnd.c +++ b/src/rnd.c @@ -17,16 +17,16 @@ struct rnglist_t { isaac64_ctx rng_state; }; -enum {CORE = 0, DISP}; +enum { CORE = 0, DISP = 1 }; static struct rnglist_t rnglist[] = { - {rn2, FALSE, {0}}, /* CORE */ - {rn2_on_display_rng, FALSE, {0}}, /* DISP */ + { rn2, FALSE, { 0 } }, /* CORE */ + { rn2_on_display_rng, FALSE, { 0 } }, /* DISP */ }; int whichrng(fn) -int (*fn)(int); +int FDECL((*fn), (int)); { int i; @@ -39,19 +39,21 @@ int (*fn)(int); void init_isaac64(seed, fn) unsigned long seed; -int FDECL((*fn),(int)); +int FDECL((*fn), (int)); { - unsigned char new_rng_state[sizeof(seed)]; - int i, rngindx = whichrng(fn); + unsigned char new_rng_state[sizeof seed]; + unsigned i; + int rngindx = whichrng(fn); if (rngindx < 0) panic("Bad rng function passed to init_isaac64()."); - for (i=0; i>= 8; } - isaac64_init(&rnglist[rngindx].rng_state, new_rng_state, sizeof(seed)); + isaac64_init(&rnglist[rngindx].rng_state, new_rng_state, + (int) sizeof seed); } static int diff --git a/src/role.c b/src/role.c index 8f2fa255f..08a181b6f 100644 --- a/src/role.c +++ b/src/role.c @@ -728,9 +728,16 @@ int rolenum; } int -randrole() +randrole(for_display) +boolean for_display; { - return rn2(SIZE(roles) - 1); + int res = SIZE(roles) - 1; + + if (for_display) + res = rn2_on_display_rng(res); + else + res = rn2(res); + return res; } STATIC_OVL int @@ -746,7 +753,7 @@ randrole_filtered() && ok_gend(i, ROLE_NONE, ROLE_RANDOM, ROLE_NONE) && ok_align(i, ROLE_NONE, ROLE_NONE, ROLE_RANDOM)) set[n++] = i; - return n ? set[rn2(n)] : randrole(); + return n ? set[rn2(n)] : randrole(FALSE); } int @@ -2021,7 +2028,7 @@ role_init() if (flags.pantheon == -1) { /* new game */ flags.pantheon = flags.initrole; /* use own gods */ while (!roles[flags.pantheon].lgod) /* unless they're missing */ - flags.pantheon = randrole(); + flags.pantheon = randrole(FALSE); } if (!g.urole.lgod) { g.urole.lgod = roles[flags.pantheon].lgod; diff --git a/sys/amiga/winami.c b/sys/amiga/winami.c index b4e116789..e1f5c7eb3 100644 --- a/sys/amiga/winami.c +++ b/sys/amiga/winami.c @@ -451,7 +451,7 @@ amii_player_selection() if (validrole(flags.initrole)) return; else { - flags.initrole=randrole(); + flags.initrole = randrole(FALSE); return; } #if 0 /* Don't query the user ... instead give random character -jhsa */ @@ -518,7 +518,7 @@ amii_player_selection() } else if( code == ' ' || code == '\n' || code == '\r' ) { - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); #if 0 /* OBSOLETE */ strcpy( g.pl_character, roles[ rnd( 11 ) ] ); #endif @@ -543,7 +543,7 @@ amii_player_selection() switch( gd->GadgetID ) { case 1: /* Random Character */ - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); #if 0 /* OBSOLETE */ strcpy( g.pl_character, roles[ rnd( 11 ) ] ); #endif @@ -1380,7 +1380,7 @@ amii_player_selection() flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { amii_putstr(WIN_MESSAGE, 0, "Incompatible role!"); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* Prompt for a role */ @@ -1416,7 +1416,7 @@ amii_player_selection() any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ diff --git a/sys/mac/macmenu.c b/sys/mac/macmenu.c index a1c4fe946..331bb2d9a 100644 --- a/sys/mac/macmenu.c +++ b/sys/mac/macmenu.c @@ -549,7 +549,7 @@ mac_askname() currrole = flags.initrole; /* Check for backward compatibility */ else if ((currrole = str2role(g.pl_character)) < 0) - currrole = randrole(); + currrole = randrole(FALSE); /* Initialize the race popup menu */ if (!(askmenu[RSRC_ASK_RACE] = NewMenu(RSRC_ASK_RACE, "\p"))) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index cc593b954..18d1b3aac 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -768,18 +768,18 @@ error: unsigned long sys_random_seed() { - unsigned long seed; + unsigned long seed = 0L; unsigned long pid = (unsigned long) getpid(); boolean no_seed = TRUE; #ifdef DEV_RANDOM - FILE *fptr = NULL; + FILE *fptr; fptr = fopen(DEV_RANDOM, "r"); if (fptr) { - fread(&seed, sizeof(long), 1, fptr); + fread(&seed, sizeof (long), 1, fptr); has_strong_rngseed = TRUE; /* decl.c */ no_seed = FALSE; - fclose(fptr); + (void) fclose(fptr); } else { /* leaves clue, doesn't exit */ paniclog("sys_random_seed", "falling back to weak seed"); diff --git a/sys/wince/mswproc.c b/sys/wince/mswproc.c index 3cd734f1a..9236ccd7d 100644 --- a/sys/wince/mswproc.c +++ b/sys/wince/mswproc.c @@ -225,7 +225,7 @@ mswin_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { raw_print("Incompatible role!"); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } @@ -358,7 +358,7 @@ prompt_for_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* tty_clear_nhwindow(BASE_WINDOW); */ @@ -396,7 +396,7 @@ prompt_for_player_selection(void) any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ diff --git a/util/makedefs.c b/util/makedefs.c index 8ea91a9f2..53015a2a0 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -1615,6 +1615,27 @@ static const char *build_opts[] = { #endif /* pattern matching method will be substituted by nethack at run time */ "pattern matching via :PATMATCH:", +#ifdef USE_ISAAC64 + "pseudo random numbers generated by ISAAC64", +#ifdef DEV_RANDOM +#ifdef __STDC__ + /* include which specific one */ + "strong PRNG seed available from " DEV_RANDOM, +#else + "strong PRNG seed available from DEV_RANDOM", +#endif +#else +#ifdef WIN32 + "strong PRNG seed available from CNG BCryptGenRandom()", +#endif +#endif /* DEV_RANDOM */ +#else /* ISAAC64 */ +#ifdef RANDOM + "pseudo random numbers generated by random()", +#else + "pseudo random numbers generated by C rand()", +#endif +#endif #ifdef SELECTSAVED "restore saved games via menu", #endif diff --git a/win/curses/cursinit.c b/win/curses/cursinit.c index 39f38980b..09326635c 100644 --- a/win/curses/cursinit.c +++ b/win/curses/cursinit.c @@ -543,7 +543,7 @@ curses_choose_character() sel = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (sel < 0) - sel = randrole(); + sel = randrole(FALSE); } flags.initrole = sel; diff --git a/win/gem/wingem.c b/win/gem/wingem.c index a337eed2e..4d3143837 100644 --- a/win/gem/wingem.c +++ b/win/gem/wingem.c @@ -234,7 +234,7 @@ Gem_player_selection() if (flags.initrole < 0) { mar_add_message("Incompatible role!"); mar_display_nhwindow(WIN_MESSAGE); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* Prompt for a role */ @@ -256,7 +256,7 @@ Gem_player_selection() any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */ diff --git a/win/gnome/gnbind.c b/win/gnome/gnbind.c index 44e09ee6a..0b85b30d1 100644 --- a/win/gnome/gnbind.c +++ b/win/gnome/gnbind.c @@ -159,7 +159,7 @@ gnome_player_selection() sel = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (sel < 0) - sel = randrole(); + sel = randrole(FALSE); } flags.initrole = sel; diff --git a/win/tty/wintty.c b/win/tty/wintty.c index eb5579f5d..52e57a6b4 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -510,7 +510,7 @@ tty_player_selection() k = pick_role(RACE, GEND, ALGN, PICK_RANDOM); if (k < 0) { tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); - k = randrole(); + k = randrole(FALSE); } } else { /* Prompt for a role */ @@ -572,7 +572,7 @@ tty_player_selection() } else if (choice == ROLE_RANDOM) { k = pick_role(RACE, GEND, ALGN, PICK_RANDOM); if (k < 0) - k = randrole(); + k = randrole(FALSE); } else { k = choice - 1; } diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index d7731366b..1d9907b42 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -271,7 +271,7 @@ mswin_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { raw_print("Incompatible role!"); - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } @@ -395,7 +395,7 @@ prompt_for_player_selection(void) flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ - flags.initrole = randrole(); + flags.initrole = randrole(FALSE); } } else { /* tty_clear_nhwindow(BASE_WINDOW); */ @@ -433,7 +433,7 @@ prompt_for_player_selection(void) any.a_int = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM) + 1; if (any.a_int == 0) /* must be non-zero */ - any.a_int = randrole() + 1; + any.a_int = randrole(FALSE) + 1; add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random", MENU_UNSELECTED); any.a_int = i + 1; /* must be non-zero */