diff --git a/include/extern.h b/include/extern.h index 02d7f3b31..604b341c9 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2123,6 +2123,7 @@ extern int dohistory(void); extern void chdirx(char *, boolean); #endif /* CHDIR */ extern boolean authorize_wizard_mode(void); +extern boolean authorize_explore_mode(void); #endif #if defined(WIN32) extern int getlock(void); @@ -3100,6 +3101,7 @@ extern void port_help(void); #endif extern void sethanguphandler(void(*)(int)); extern boolean authorize_wizard_mode(void); +extern boolean authorize_explore_mode(void); extern void append_slash(char *); extern boolean check_user_string(const char *); extern char *get_login_name(void); @@ -3264,6 +3266,7 @@ extern void chdirx(const char *, boolean); #endif /* CHDIR */ extern void sethanguphandler(void(*)(int)); extern boolean authorize_wizard_mode(void); +extern boolean authorize_explore_mode(void); /* ### vmsmisc.c ### */ diff --git a/src/cmd.c b/src/cmd.c index a823b7486..941d71822 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -965,10 +965,7 @@ enter_explore_mode(void) } else { const char *oldmode = !wizard ? "normal game" : "debug mode"; -#ifdef SYSCF -#if defined(UNIX) - if (!sysopt.explorers || !sysopt.explorers[0] - || !check_user_string(sysopt.explorers)) { + if (!authorize_explore_mode()) { if (!wizard) { You("cannot access explore mode."); return ECMD_OK; @@ -978,8 +975,6 @@ enter_explore_mode(void) /* keep going */ } } -#endif -#endif pline("Beware! From explore mode there will be no return to %s,", oldmode); if (paranoid_query(ParanoidQuit, diff --git a/src/options.c b/src/options.c index 7354481f3..e8ffe174b 100644 --- a/src/options.c +++ b/src/options.c @@ -10257,11 +10257,14 @@ set_playmode(void) gp.plnamelen = (int) strlen(strcpy(gp.plname, "wizard")); else wizard = FALSE; /* not allowed or not available */ - /* force explore mode if we didn't make it into wizard mode */ + /* try explore mode if we didn't make it into wizard mode */ discover = !wizard; iflags.deferred_X = FALSE; } - /* don't need to do anything special for explore mode or normal play */ + if (discover && !authorize_explore_mode()) { + discover = iflags.deferred_X = FALSE; + } + /* don't need to do anything special for normal play */ } static void diff --git a/src/restore.c b/src/restore.c index fc475f9d3..d154a99b6 100644 --- a/src/restore.c +++ b/src/restore.c @@ -560,8 +560,8 @@ restgamestate(NHFILE *nhfp) if (newgameflags.debug) { /* authorized by startup code; wizard mode exists and is allowed */ wizard = TRUE, discover = iflags.deferred_X = FALSE; - } else if (wizard) { - /* specified by save file; check authorization now */ + } else if (wizard || discover) { + /* specified by save file; check authorization now. */ set_playmode(); } role_init(); /* Reset the initial role, race, gender, and alignment */ diff --git a/sys/libnh/libnhmain.c b/sys/libnh/libnhmain.c index 41669033b..5770c5c4e 100644 --- a/sys/libnh/libnhmain.c +++ b/sys/libnh/libnhmain.c @@ -50,7 +50,7 @@ extern void init_linux_cons(void); #endif static void wd_message(void); -static boolean wiz_error_flag = FALSE; +static boolean wiz_error_flag = FALSE, explore_error_flag = FALSE; static struct passwd *get_unix_pw(void); #ifdef __EMSCRIPTEN__ @@ -605,6 +605,22 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ +#ifdef SYSCF + if (sysopt.explorers && sysopt.explorers[0]) { + if (check_user_string(sysopt.explorers)) + return TRUE; + } + explore_error_flag = TRUE; /* not being allowed into explore mode */ + return FALSE; +#else + return TRUE; /* if sysconf disabled, no restrictions on explore mode */ +#endif +} + static void wd_message(void) { @@ -614,9 +630,17 @@ wd_message(void) pline("Only user%s %s may access debug (wizard) mode.", strchr(sysopt.wizards, ' ') ? "s" : "", tmp); free(tmp); - } else + } else { + You("cannot access debug (wizard) mode."); + } + wizard = 0; /* (paranoia) */ + if (!explore_error_flag) { pline("Entering explore/discovery mode instead."); - wizard = 0, discover = 1; /* (paranoia) */ + discover = 1; + } + } else if (explore_error_flag) { + You("cannot access explore mode."); /* same as enter_explore_mode */ + discover = 0; /* (more paranoia) */ } else if (discover) You("are in non-scoring explore/discovery mode."); } diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c index 5706651be..3744ee490 100644 --- a/sys/share/pcmain.c +++ b/sys/share/pcmain.c @@ -720,6 +720,13 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + #ifdef EXEPATH #ifdef __DJGPP__ #define PATH_SEPARATOR '/' diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 56f567a46..2da764cae 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -53,7 +53,7 @@ extern void init_linux_cons(void); #endif static void wd_message(void); -static boolean wiz_error_flag = FALSE; +static boolean wiz_error_flag = FALSE, explore_error_flag = FALSE; static struct passwd *get_unix_pw(void); int @@ -964,6 +964,22 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ +#ifdef SYSCF + if (sysopt.explorers && sysopt.explorers[0]) { + if (check_user_string(sysopt.explorers)) + return TRUE; + } + explore_error_flag = TRUE; /* not being allowed into explore mode */ + return FALSE; +#else + return TRUE; /* if sysconf disabled, no restrictions on explore mode */ +#endif +} + static void wd_message(void) { @@ -973,9 +989,17 @@ wd_message(void) pline("Only user%s %s may access debug (wizard) mode.", strchr(sysopt.wizards, ' ') ? "s" : "", tmp); free(tmp); - } else + } else { + You("cannot access debug (wizard) mode."); + } + wizard = 0; /* (paranoia) */ + if (!explore_error_flag) { pline("Entering explore/discovery mode instead."); - wizard = 0, discover = 1; /* (paranoia) */ + discover = 1; + } + } else if (explore_error_flag) { + You("cannot access explore mode."); /* same as enter_explore_mode */ + discover = 0; /* (more paranoia) */ } else if (discover) You("are in non-scoring explore/discovery mode."); } diff --git a/sys/vms/vmsmain.c b/sys/vms/vmsmain.c index 7dd2536f9..4e7c6ab89 100644 --- a/sys/vms/vmsmain.c +++ b/sys/vms/vmsmain.c @@ -484,6 +484,13 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + static void wd_message(void) { diff --git a/sys/windows/windmain.c b/sys/windows/windmain.c index 5966615b4..0be7ef9cd 100644 --- a/sys/windows/windmain.c +++ b/sys/windows/windmain.c @@ -1021,6 +1021,13 @@ authorize_wizard_mode(void) return FALSE; } +/* similar to above, validate explore mode access */ +boolean +authorize_explore_mode(void) +{ + return TRUE; /* no restrictions on explore mode */ +} + #define PATH_SEPARATOR '\\' #if defined(WIN32) && !defined(WIN32CON)