Expand safe_wait to deadly status afflictions

Searching or waiting with safe_wait on will now consider
sliming, stoning, or deadly illness to be hazardous and prevent
the command.
This commit is contained in:
Pasi Kallinen
2022-12-18 00:40:38 +02:00
parent 60a328bc2c
commit d7e90fbae2
4 changed files with 28 additions and 9 deletions
+2
View File
@@ -174,6 +174,8 @@ revival via undead turning of corpse carried by hero said "your <mon> corpse
comes alive" even when revived monster was undead comes alive" even when revived monster was undead
prevent searching or waiting next to a hostile monster if boolean option prevent searching or waiting next to a hostile monster if boolean option
safe_wait is on - override with 'm' safe_wait is on - override with 'm'
prevent searching or waiting if hero is slimed, stoning, or deadly ill
if safe_wait is on - override with 'm'
allow random mimics to show up mimicing more furniture than just stairs allow random mimics to show up mimicing more furniture than just stairs
scatter exploding bag of holding contents instead of outright deleting them scatter exploding bag of holding contents instead of outright deleting them
male hero poly'd into nymph chooses charm vs seduce message based on being male hero poly'd into nymph chooses charm vs seduce message based on being
+2 -1
View File
@@ -479,7 +479,8 @@ extern void deferred_goto(void);
extern boolean revive_corpse(struct obj *); extern boolean revive_corpse(struct obj *);
extern void revive_mon(union any *, long); extern void revive_mon(union any *, long);
extern void zombify_mon(union any *, long); extern void zombify_mon(union any *, long);
extern boolean cmd_safety_prevention(const char *, const char *, int *); extern boolean cmd_safety_prevention(const char *, const char *,
const char *, int *);
extern int donull(void); extern int donull(void);
extern int dowipe(void); extern int dowipe(void);
extern void legs_in_no_shape(const char *, boolean); extern void legs_in_no_shape(const char *, boolean);
+1 -1
View File
@@ -1948,7 +1948,7 @@ dosearch0(int aflag) /* intrinsic autosearch vs explicit searching */
int int
dosearch(void) dosearch(void)
{ {
if (cmd_safety_prevention("another search", if (cmd_safety_prevention("Searching", "another search",
"You already found a monster.", "You already found a monster.",
&ga.already_found_flag)) &ga.already_found_flag))
return ECMD_OK; return ECMD_OK;
+23 -7
View File
@@ -13,6 +13,7 @@ static void dosinkring(struct obj *);
static int drop(struct obj *); static int drop(struct obj *);
static int menudrop_split(struct obj *, long); static int menudrop_split(struct obj *, long);
static boolean engulfer_digests_food(struct obj *); static boolean engulfer_digests_food(struct obj *);
static boolean danger_uprops(void);
static int wipeoff(void); static int wipeoff(void);
static int menu_drop(int); static int menu_drop(int);
static NHFILE *currentlevel_rewrite(void); static NHFILE *currentlevel_rewrite(void);
@@ -2132,19 +2133,34 @@ zombify_mon(anything *arg, long timeout)
} }
} }
boolean /* return TRUE if hero properties are dangerous to hero */
cmd_safety_prevention(const char *cmddesc, const char *act, int *flagcounter) static boolean
danger_uprops(void)
{ {
if (flags.safe_wait && !iflags.menu_requested return (((Stoned && !Stone_resistance)
&& !gm.multi && monster_nearby()) { || Slimed
|| ((Sick & SICK_NONVOMITABLE) && !Sick_resistance)));
}
boolean
cmd_safety_prevention(const char *ucverb, const char *cmddesc,
const char *act, int *flagcounter)
{
if (flags.safe_wait && !iflags.menu_requested && !gm.multi) {
char buf[QBUFSZ]; char buf[QBUFSZ];
buf[0] = '\0'; buf[0] = '\0';
if (iflags.cmdassist || !(*flagcounter)++) if (iflags.cmdassist || !(*flagcounter)++)
Sprintf(buf, " Use '%s' prefix to force %s.", Sprintf(buf, " Use '%s' prefix to force %s.",
visctrl(cmd_from_func(do_reqmenu)), cmddesc); visctrl(cmd_from_func(do_reqmenu)), cmddesc);
Norep("%s%s", act, buf);
return TRUE; if (monster_nearby()) {
Norep("%s%s", act, buf);
return TRUE;
} else if (danger_uprops()) {
Norep("%s doesn't feel like a good idea right now.", ucverb);
return TRUE;
}
} }
*flagcounter = 0; *flagcounter = 0;
return FALSE; return FALSE;
@@ -2155,7 +2171,7 @@ cmd_safety_prevention(const char *cmddesc, const char *act, int *flagcounter)
int int
donull(void) donull(void)
{ {
if (cmd_safety_prevention("a no-op (to rest)", if (cmd_safety_prevention("Waiting", "a no-op (to rest)",
"Are you waiting to get hit?", "Are you waiting to get hit?",
&gd.did_nothing_flag)) &gd.did_nothing_flag))
return ECMD_OK; return ECMD_OK;