From d7e90fbae2698cfa449a4b675b545221102b9ac7 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 18 Dec 2022 00:35:41 +0200 Subject: [PATCH] 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. --- doc/fixes3-7-0.txt | 2 ++ include/extern.h | 3 ++- src/detect.c | 2 +- src/do.c | 30 +++++++++++++++++++++++------- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index f71d85287..ac119f00b 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -174,6 +174,8 @@ revival via undead turning of corpse carried by hero said "your 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 diff --git a/include/extern.h b/include/extern.h index d9bbc5acf..5cf411c3a 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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); diff --git a/src/detect.c b/src/detect.c index 246f54997..4ea047240 100644 --- a/src/detect.c +++ b/src/detect.c @@ -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; diff --git a/src/do.c b/src/do.c index 17c8ca290..7be5aa9f8 100644 --- a/src/do.c +++ b/src/do.c @@ -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;