diff --git a/include/flag.h b/include/flag.h index 7338f027e..4b8557793 100644 --- a/include/flag.h +++ b/include/flag.h @@ -412,6 +412,8 @@ struct instance_flags { chosen_windowport[], but do not switch to it in the midst of options processing */ genericptr_t returning_missile; /* 'struct obj *'; Mjollnir or aklys */ + boolean wiz_error_flag; /* flag for tracking failed wizmode auth */ + boolean explore_error_flag; /* ditto for explore mode */ boolean obsolete; /* obsolete options can point at this, it isn't used */ }; diff --git a/src/options.c b/src/options.c index d23a1a01d..d939b3dd4 100644 --- a/src/options.c +++ b/src/options.c @@ -10262,6 +10262,7 @@ set_playmode(void) set iflags.deferred_X and prompt to activate explore mode after the save file has already been deleted */ discover = !wizard; + iflags.deferred_X = FALSE; } if (discover && !authorize_explore_mode()) { discover = iflags.deferred_X = FALSE; diff --git a/src/restore.c b/src/restore.c index d154a99b6..6570ddbfc 100644 --- a/src/restore.c +++ b/src/restore.c @@ -512,7 +512,7 @@ restgamestate(NHFILE *nhfp) struct obj *bc_obj; char timebuf[15]; unsigned long uid = 0; - boolean defer_perm_invent; + boolean defer_perm_invent, restoring_special; if (nhfp->structlevel) Mread(nhfp->fd, &uid, sizeof uid); @@ -557,10 +557,11 @@ restgamestate(NHFILE *nhfp) in the discover case, we don't want to set that for a normal game until after the save file has been removed */ iflags.deferred_X = (newgameflags.explore && !discover); + restoring_special = (wizard || discover); if (newgameflags.debug) { /* authorized by startup code; wizard mode exists and is allowed */ wizard = TRUE, discover = iflags.deferred_X = FALSE; - } else if (wizard || discover) { + } else if (restoring_special) { /* specified by save file; check authorization now. */ set_playmode(); } @@ -572,6 +573,13 @@ restgamestate(NHFILE *nhfp) Mread(nhfp->fd, &u, sizeof u); gy.youmonst.cham = u.mcham; + if (restoring_special && iflags.explore_error_flag) { + /* savefile has wizard or explore mode, but player is no longer + authorized to access either; can't downgrade mode any further, so + fail restoration. */ + u.uhp = 0; + } + if (nhfp->structlevel) Mread(nhfp->fd, timebuf, 14); timebuf[14] = '\0'; diff --git a/sys/libnh/libnhmain.c b/sys/libnh/libnhmain.c index d7d757cd3..631b9152c 100644 --- a/sys/libnh/libnhmain.c +++ b/sys/libnh/libnhmain.c @@ -50,7 +50,6 @@ extern void init_linux_cons(void); #endif static void wd_message(void); -static boolean wiz_error_flag = FALSE, explore_error_flag = FALSE; static struct passwd *get_unix_pw(void); #ifdef __EMSCRIPTEN__ @@ -601,7 +600,7 @@ authorize_wizard_mode(void) if (check_user_string(sysopt.wizards)) return TRUE; } - wiz_error_flag = TRUE; /* not being allowed into wizard mode */ + iflags.wiz_error_flag = TRUE; /* not being allowed into wizard mode */ return FALSE; } @@ -614,7 +613,7 @@ authorize_explore_mode(void) if (check_user_string(sysopt.explorers)) return TRUE; } - explore_error_flag = TRUE; /* not being allowed into explore mode */ + iflags.explore_error_flag = TRUE; /* not allowed into explore mode */ return FALSE; #else return TRUE; /* if sysconf disabled, no restrictions on explore mode */ @@ -624,7 +623,7 @@ authorize_explore_mode(void) static void wd_message(void) { - if (wiz_error_flag) { + if (iflags.wiz_error_flag) { if (sysopt.wizards && sysopt.wizards[0]) { char *tmp = build_english_list(sysopt.wizards); pline("Only user%s %s may access debug (wizard) mode.", @@ -634,9 +633,9 @@ wd_message(void) You("cannot access debug (wizard) mode."); } wizard = FALSE; /* (paranoia) */ - if (!explore_error_flag) + if (!iflags.explore_error_flag) pline("Entering explore/discovery mode instead."); - } else if (explore_error_flag) { + } else if (iflags.explore_error_flag) { You("cannot access explore mode."); /* same as enter_explore_mode */ discover = iflags.deferred_X = FALSE; /* (more paranoia) */ } else if (discover) diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index ec039ddf7..122c2a96d 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -53,7 +53,6 @@ extern void init_linux_cons(void); #endif static void wd_message(void); -static boolean wiz_error_flag = FALSE, explore_error_flag = FALSE; static struct passwd *get_unix_pw(void); int @@ -960,7 +959,7 @@ authorize_wizard_mode(void) if (check_user_string(sysopt.wizards)) return TRUE; } - wiz_error_flag = TRUE; /* not being allowed into wizard mode */ + iflags.wiz_error_flag = TRUE; /* not being allowed into wizard mode */ return FALSE; } @@ -973,7 +972,7 @@ authorize_explore_mode(void) if (check_user_string(sysopt.explorers)) return TRUE; } - explore_error_flag = TRUE; /* not being allowed into explore mode */ + iflags.explore_error_flag = TRUE; /* not allowed into explore mode */ return FALSE; #else return TRUE; /* if sysconf disabled, no restrictions on explore mode */ @@ -983,7 +982,7 @@ authorize_explore_mode(void) static void wd_message(void) { - if (wiz_error_flag) { + if (iflags.wiz_error_flag) { if (sysopt.wizards && sysopt.wizards[0]) { char *tmp = build_english_list(sysopt.wizards); pline("Only user%s %s may access debug (wizard) mode.", @@ -993,9 +992,9 @@ wd_message(void) You("cannot access debug (wizard) mode."); } wizard = FALSE; /* (paranoia) */ - if (!explore_error_flag) + if (!iflags.explore_error_flag) pline("Entering explore/discovery mode instead."); - } else if (explore_error_flag) { + } else if (iflags.explore_error_flag) { You("cannot access explore mode."); /* same as enter_explore_mode */ discover = iflags.deferred_X = FALSE; /* (more paranoia) */ } else if (discover)