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:35:41 +02:00
parent 60a328bc2c
commit d7e90fbae2
4 changed files with 28 additions and 9 deletions

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
prevent searching or waiting next to a hostile monster if boolean option
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
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

View File

@@ -479,7 +479,8 @@ extern void deferred_goto(void);
extern boolean revive_corpse(struct obj *);
extern void revive_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 dowipe(void);
extern void legs_in_no_shape(const char *, boolean);

View File

@@ -1948,7 +1948,7 @@ dosearch0(int aflag) /* intrinsic autosearch vs explicit searching */
int
dosearch(void)
{
if (cmd_safety_prevention("another search",
if (cmd_safety_prevention("Searching", "another search",
"You already found a monster.",
&ga.already_found_flag))
return ECMD_OK;

View File

@@ -13,6 +13,7 @@ static void dosinkring(struct obj *);
static int drop(struct obj *);
static int menudrop_split(struct obj *, long);
static boolean engulfer_digests_food(struct obj *);
static boolean danger_uprops(void);
static int wipeoff(void);
static int menu_drop(int);
static NHFILE *currentlevel_rewrite(void);
@@ -2132,19 +2133,34 @@ zombify_mon(anything *arg, long timeout)
}
}
boolean
cmd_safety_prevention(const char *cmddesc, const char *act, int *flagcounter)
/* return TRUE if hero properties are dangerous to hero */
static boolean
danger_uprops(void)
{
if (flags.safe_wait && !iflags.menu_requested
&& !gm.multi && monster_nearby()) {
return (((Stoned && !Stone_resistance)
|| 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];
buf[0] = '\0';
if (iflags.cmdassist || !(*flagcounter)++)
Sprintf(buf, " Use '%s' prefix to force %s.",
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;
return FALSE;
@@ -2155,7 +2171,7 @@ cmd_safety_prevention(const char *cmddesc, const char *act, int *flagcounter)
int
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?",
&gd.did_nothing_flag))
return ECMD_OK;