diff --git a/include/extern.h b/include/extern.h index a292ef146..2c9c32171 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2680,6 +2680,7 @@ extern int num_spells(void); extern long somegold(long); extern void stealgold(struct monst *); extern void thiefdead(void); +extern boolean unresponsive(void); extern void remove_worn_item(struct obj *, boolean); extern int steal(struct monst *, char *); extern int mpickobj(struct monst *, struct obj *); diff --git a/src/mhitu.c b/src/mhitu.c index 6e2d5366f..59a946488 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -1824,7 +1824,7 @@ doseduce(struct monst *mon) mhe(mon), mon->mcan ? "severe " : ""); return 0; } - if (unconscious()) { + if (unresponsive()) { pline("%s seems dismayed at your lack of response.", Monnam(mon)); return 0; } diff --git a/src/steal.c b/src/steal.c index 6ef248299..1c2339c40 100644 --- a/src/steal.c +++ b/src/steal.c @@ -137,6 +137,20 @@ thiefdead(void) } } +/* checks whether hero can be responsive to seduction attempts; similar to + Unaware but also includes paralysis */ +boolean +unresponsive(void) +{ + if (gm.multi >= 0) + return FALSE; + + return (unconscious() || is_fainted() + || (gm.multi_reason + && (!strncmp(gm.multi_reason, "frozen", 6) + || !strncmp(gm.multi_reason, "paralyzed", 9)))); +} + /* called via (*ga.afternmv)() when hero finishes taking off armor that was slated to be stolen but the thief died in the interim */ static int @@ -406,9 +420,10 @@ steal(struct monst* mtmp, char* objnambuf) armordelay = objects[otmp->otyp].oc_delay; if (olddelay > 0 && olddelay < armordelay) armordelay = olddelay; - if (monkey_business) { - /* animals usually don't have enough patience - to take off items which require extra time */ + if (monkey_business || unresponsive()) { + /* animals usually don't have enough patience to take off + items which require extra time; unconscious or paralyzed + hero can't be charmed into taking off his own armor */ if (armordelay >= 1 && !olddelay && rn2(10)) goto cant_take; remove_worn_item(otmp, TRUE); @@ -419,9 +434,6 @@ steal(struct monst* mtmp, char* objnambuf) boolean seen = canspotmon(mtmp); otmp->cursed = 0; - /* can't charm you without first waking you */ - if (Unaware) - unmul((char *) 0); slowly = (armordelay >= 1 || gm.multi < 0); if (flags.female) urgent_pline("%s charms you. You gladly %s your %s.", diff --git a/src/uhitm.c b/src/uhitm.c index f8628cb2e..d1d0bb294 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -1764,7 +1764,7 @@ steal_it(struct monst *mdef, struct attack *mattk) /* look for worn body armor */ ustealo = (struct obj *) 0; - if (could_seduce(&gy.youmonst, mdef, mattk)) { + if (could_seduce(&gy.youmonst, mdef, mattk) && mdef->mcanmove) { /* find armor, and move it to end of inventory in the process */ minvent_ptr = &mdef->minvent; while ((otmp = *minvent_ptr) != 0)