Merge branch 'NetHack-3.6.2'

This commit is contained in:
nhmall
2019-01-29 22:34:07 -05:00
15 changed files with 74 additions and 46 deletions
+1 -1
View File
@@ -2123,7 +2123,7 @@ E boolean FDECL(validrole, (int));
E boolean FDECL(validrace, (int, int)); E boolean FDECL(validrace, (int, int));
E boolean FDECL(validgend, (int, int, int)); E boolean FDECL(validgend, (int, int, int));
E boolean FDECL(validalign, (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(randrace, (int));
E int FDECL(randgend, (int, int)); E int FDECL(randgend, (int, int));
E int FDECL(randalign, (int, int)); E int FDECL(randalign, (int, int));
+1 -1
View File
@@ -7,7 +7,7 @@
#ifndef INTEGER_H #ifndef INTEGER_H
#define 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 */ /* The compiler claims to conform to C99. Use stdint.h */
#include <stdint.h> #include <stdint.h>
#define SKIP_STDINT_WORKAROUND #define SKIP_STDINT_WORKAROUND
+6 -8
View File
@@ -2090,15 +2090,13 @@ aligntyp alignment;
if (!Hallucination) if (!Hallucination)
return align_gname(alignment); return align_gname(alignment);
/* Count the roles, so that we can pick one at random. */ /* Some roles (Priest) don't have a pantheon unless we're playing as
int rolecount = 0; that role, so keep trying until we get a role which does have one.
while (roles[rolecount].filecode) [If playing a Priest, the current pantheon will be twice as likely
rolecount++; to get picked as any of the others. That's not significant enough
to bother dealing with.] */
/* The priest may not have initialized god names. If this is the
case, and we roll priest, we need to try again. */
do do
which = rn2_on_display_rng(rolecount); which = randrole(TRUE);
while (!roles[which].lgod); while (!roles[which].lgod);
switch (rn2_on_display_rng(9)) { switch (rn2_on_display_rng(9)) {
+12 -10
View File
@@ -17,16 +17,16 @@ struct rnglist_t {
isaac64_ctx rng_state; isaac64_ctx rng_state;
}; };
enum {CORE = 0, DISP}; enum { CORE = 0, DISP = 1 };
static struct rnglist_t rnglist[] = { static struct rnglist_t rnglist[] = {
{rn2, FALSE, {0}}, /* CORE */ { rn2, FALSE, { 0 } }, /* CORE */
{rn2_on_display_rng, FALSE, {0}}, /* DISP */ { rn2_on_display_rng, FALSE, { 0 } }, /* DISP */
}; };
int int
whichrng(fn) whichrng(fn)
int (*fn)(int); int FDECL((*fn), (int));
{ {
int i; int i;
@@ -39,19 +39,21 @@ int (*fn)(int);
void void
init_isaac64(seed, fn) init_isaac64(seed, fn)
unsigned long seed; unsigned long seed;
int FDECL((*fn),(int)); int FDECL((*fn), (int));
{ {
unsigned char new_rng_state[sizeof(seed)]; unsigned char new_rng_state[sizeof seed];
int i, rngindx = whichrng(fn); unsigned i;
int rngindx = whichrng(fn);
if (rngindx < 0) if (rngindx < 0)
panic("Bad rng function passed to init_isaac64()."); panic("Bad rng function passed to init_isaac64().");
for (i=0; i<sizeof(seed); i++) { for (i = 0; i < sizeof seed; i++) {
new_rng_state[i]= (unsigned char)(seed & 0xFF); new_rng_state[i] = (unsigned char) (seed & 0xFF);
seed >>= 8; seed >>= 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 static int
+11 -4
View File
@@ -728,9 +728,16 @@ int rolenum;
} }
int 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 STATIC_OVL int
@@ -746,7 +753,7 @@ randrole_filtered()
&& ok_gend(i, ROLE_NONE, ROLE_RANDOM, ROLE_NONE) && ok_gend(i, ROLE_NONE, ROLE_RANDOM, ROLE_NONE)
&& ok_align(i, ROLE_NONE, ROLE_NONE, ROLE_RANDOM)) && ok_align(i, ROLE_NONE, ROLE_NONE, ROLE_RANDOM))
set[n++] = i; set[n++] = i;
return n ? set[rn2(n)] : randrole(); return n ? set[rn2(n)] : randrole(FALSE);
} }
int int
@@ -2021,7 +2028,7 @@ role_init()
if (flags.pantheon == -1) { /* new game */ if (flags.pantheon == -1) { /* new game */
flags.pantheon = flags.initrole; /* use own gods */ flags.pantheon = flags.initrole; /* use own gods */
while (!roles[flags.pantheon].lgod) /* unless they're missing */ while (!roles[flags.pantheon].lgod) /* unless they're missing */
flags.pantheon = randrole(); flags.pantheon = randrole(FALSE);
} }
if (!g.urole.lgod) { if (!g.urole.lgod) {
g.urole.lgod = roles[flags.pantheon].lgod; g.urole.lgod = roles[flags.pantheon].lgod;
+5 -5
View File
@@ -451,7 +451,7 @@ amii_player_selection()
if (validrole(flags.initrole)) if (validrole(flags.initrole))
return; return;
else { else {
flags.initrole=randrole(); flags.initrole = randrole(FALSE);
return; return;
} }
#if 0 /* Don't query the user ... instead give random character -jhsa */ #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' ) else if( code == ' ' || code == '\n' || code == '\r' )
{ {
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
strcpy( g.pl_character, roles[ rnd( 11 ) ] ); strcpy( g.pl_character, roles[ rnd( 11 ) ] );
#endif #endif
@@ -543,7 +543,7 @@ amii_player_selection()
switch( gd->GadgetID ) switch( gd->GadgetID )
{ {
case 1: /* Random Character */ case 1: /* Random Character */
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
strcpy( g.pl_character, roles[ rnd( 11 ) ] ); strcpy( g.pl_character, roles[ rnd( 11 ) ] );
#endif #endif
@@ -1380,7 +1380,7 @@ amii_player_selection()
flags.initalign, PICK_RANDOM); flags.initalign, PICK_RANDOM);
if (flags.initrole < 0) { if (flags.initrole < 0) {
amii_putstr(WIN_MESSAGE, 0, "Incompatible role!"); amii_putstr(WIN_MESSAGE, 0, "Incompatible role!");
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
} }
} else { } else {
/* Prompt for a role */ /* Prompt for a role */
@@ -1416,7 +1416,7 @@ amii_player_selection()
any.a_int = pick_role(flags.initrace, flags.initgend, any.a_int = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM) + 1; flags.initalign, PICK_RANDOM) + 1;
if (any.a_int == 0) /* must be non-zero */ 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", add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
MENU_UNSELECTED); MENU_UNSELECTED);
any.a_int = i + 1; /* must be non-zero */ any.a_int = i + 1; /* must be non-zero */
+1 -1
View File
@@ -549,7 +549,7 @@ mac_askname()
currrole = flags.initrole; currrole = flags.initrole;
/* Check for backward compatibility */ /* Check for backward compatibility */
else if ((currrole = str2role(g.pl_character)) < 0) else if ((currrole = str2role(g.pl_character)) < 0)
currrole = randrole(); currrole = randrole(FALSE);
/* Initialize the race popup menu */ /* Initialize the race popup menu */
if (!(askmenu[RSRC_ASK_RACE] = NewMenu(RSRC_ASK_RACE, "\p"))) if (!(askmenu[RSRC_ASK_RACE] = NewMenu(RSRC_ASK_RACE, "\p")))
+4 -4
View File
@@ -768,18 +768,18 @@ error:
unsigned long unsigned long
sys_random_seed() sys_random_seed()
{ {
unsigned long seed; unsigned long seed = 0L;
unsigned long pid = (unsigned long) getpid(); unsigned long pid = (unsigned long) getpid();
boolean no_seed = TRUE; boolean no_seed = TRUE;
#ifdef DEV_RANDOM #ifdef DEV_RANDOM
FILE *fptr = NULL; FILE *fptr;
fptr = fopen(DEV_RANDOM, "r"); fptr = fopen(DEV_RANDOM, "r");
if (fptr) { if (fptr) {
fread(&seed, sizeof(long), 1, fptr); fread(&seed, sizeof (long), 1, fptr);
has_strong_rngseed = TRUE; /* decl.c */ has_strong_rngseed = TRUE; /* decl.c */
no_seed = FALSE; no_seed = FALSE;
fclose(fptr); (void) fclose(fptr);
} else { } else {
/* leaves clue, doesn't exit */ /* leaves clue, doesn't exit */
paniclog("sys_random_seed", "falling back to weak seed"); paniclog("sys_random_seed", "falling back to weak seed");
+3 -3
View File
@@ -225,7 +225,7 @@ mswin_player_selection(void)
flags.initalign, PICK_RANDOM); flags.initalign, PICK_RANDOM);
if (flags.initrole < 0) { if (flags.initrole < 0) {
raw_print("Incompatible role!"); raw_print("Incompatible role!");
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
} }
} }
@@ -358,7 +358,7 @@ prompt_for_player_selection(void)
flags.initalign, PICK_RANDOM); flags.initalign, PICK_RANDOM);
if (flags.initrole < 0) { if (flags.initrole < 0) {
/* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
} }
} else { } else {
/* tty_clear_nhwindow(BASE_WINDOW); */ /* tty_clear_nhwindow(BASE_WINDOW); */
@@ -396,7 +396,7 @@ prompt_for_player_selection(void)
any.a_int = pick_role(flags.initrace, flags.initgend, any.a_int = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM) + 1; flags.initalign, PICK_RANDOM) + 1;
if (any.a_int == 0) /* must be non-zero */ 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", add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
MENU_UNSELECTED); MENU_UNSELECTED);
any.a_int = i + 1; /* must be non-zero */ any.a_int = i + 1; /* must be non-zero */
+21
View File
@@ -1615,6 +1615,27 @@ static const char *build_opts[] = {
#endif #endif
/* pattern matching method will be substituted by nethack at run time */ /* pattern matching method will be substituted by nethack at run time */
"pattern matching via :PATMATCH:", "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 #ifdef SELECTSAVED
"restore saved games via menu", "restore saved games via menu",
#endif #endif
+1 -1
View File
@@ -543,7 +543,7 @@ curses_choose_character()
sel = pick_role(flags.initrace, flags.initgend, sel = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM); flags.initalign, PICK_RANDOM);
if (sel < 0) if (sel < 0)
sel = randrole(); sel = randrole(FALSE);
} }
flags.initrole = sel; flags.initrole = sel;
+2 -2
View File
@@ -234,7 +234,7 @@ Gem_player_selection()
if (flags.initrole < 0) { if (flags.initrole < 0) {
mar_add_message("Incompatible role!"); mar_add_message("Incompatible role!");
mar_display_nhwindow(WIN_MESSAGE); mar_display_nhwindow(WIN_MESSAGE);
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
} }
} else { } else {
/* Prompt for a role */ /* Prompt for a role */
@@ -256,7 +256,7 @@ Gem_player_selection()
any.a_int = pick_role(flags.initrace, flags.initgend, any.a_int = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM) + 1; flags.initalign, PICK_RANDOM) + 1;
if (any.a_int == 0) /* must be non-zero */ 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", add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
MENU_UNSELECTED); MENU_UNSELECTED);
any.a_int = i + 1; /* must be non-zero */ any.a_int = i + 1; /* must be non-zero */
+1 -1
View File
@@ -159,7 +159,7 @@ gnome_player_selection()
sel = pick_role(flags.initrace, flags.initgend, flags.initalign, sel = pick_role(flags.initrace, flags.initgend, flags.initalign,
PICK_RANDOM); PICK_RANDOM);
if (sel < 0) if (sel < 0)
sel = randrole(); sel = randrole(FALSE);
} }
flags.initrole = sel; flags.initrole = sel;
+2 -2
View File
@@ -510,7 +510,7 @@ tty_player_selection()
k = pick_role(RACE, GEND, ALGN, PICK_RANDOM); k = pick_role(RACE, GEND, ALGN, PICK_RANDOM);
if (k < 0) { if (k < 0) {
tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); tty_putstr(BASE_WINDOW, 0, "Incompatible role!");
k = randrole(); k = randrole(FALSE);
} }
} else { } else {
/* Prompt for a role */ /* Prompt for a role */
@@ -572,7 +572,7 @@ tty_player_selection()
} else if (choice == ROLE_RANDOM) { } else if (choice == ROLE_RANDOM) {
k = pick_role(RACE, GEND, ALGN, PICK_RANDOM); k = pick_role(RACE, GEND, ALGN, PICK_RANDOM);
if (k < 0) if (k < 0)
k = randrole(); k = randrole(FALSE);
} else { } else {
k = choice - 1; k = choice - 1;
} }
+3 -3
View File
@@ -271,7 +271,7 @@ mswin_player_selection(void)
flags.initalign, PICK_RANDOM); flags.initalign, PICK_RANDOM);
if (flags.initrole < 0) { if (flags.initrole < 0) {
raw_print("Incompatible role!"); raw_print("Incompatible role!");
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
} }
} }
@@ -395,7 +395,7 @@ prompt_for_player_selection(void)
flags.initalign, PICK_RANDOM); flags.initalign, PICK_RANDOM);
if (flags.initrole < 0) { if (flags.initrole < 0) {
/* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */ /* tty_putstr(BASE_WINDOW, 0, "Incompatible role!"); */
flags.initrole = randrole(); flags.initrole = randrole(FALSE);
} }
} else { } else {
/* tty_clear_nhwindow(BASE_WINDOW); */ /* tty_clear_nhwindow(BASE_WINDOW); */
@@ -433,7 +433,7 @@ prompt_for_player_selection(void)
any.a_int = pick_role(flags.initrace, flags.initgend, any.a_int = pick_role(flags.initrace, flags.initgend,
flags.initalign, PICK_RANDOM) + 1; flags.initalign, PICK_RANDOM) + 1;
if (any.a_int == 0) /* must be non-zero */ 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", add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
MENU_UNSELECTED); MENU_UNSELECTED);
any.a_int = i + 1; /* must be non-zero */ any.a_int = i + 1; /* must be non-zero */