fix #K3902 - hug attacks against unsolid targets

Prevent hug attacks (owlbear, python, pit fiend, several others),
attacks for wrap damage (eel and kraken, trapper and lurker above),
attacks for stick-to damage (mimic, lichen), and attacks for digestion
damage (purple worm) from succeeding against unsolid monsters (ghosts,
lights, vortices, most elementals).

Polymorph of an engulf or hold target into unsolid form has been
addressed by a couple of previous updates.
This commit is contained in:
PatR
2023-04-14 13:27:33 -07:00
parent ced75cb88e
commit 1a2d844a22
5 changed files with 111 additions and 30 deletions

View File

@@ -5254,6 +5254,11 @@ hmonas(struct monst *mon)
Your("%s %s harmlessly through %s.",
verb, vtense(verb, "pass"), mon_nam(mon));
} else {
/* either not a shade or no special silver/blessed damage,
other unsolid monsters are immune to AT_TUCH+AD_WRAP */
if (failed_grab(&gy.youmonst, mon, mattk))
break; /* miss; message already given */
if (mattk->aatyp == AT_TENT) {
Your("tentacles suck %s.", mon_nam(mon));
} else {
@@ -5333,6 +5338,9 @@ hmonas(struct monst *mon)
}
break;
}
/* can't grab unsolid creatures (checked after shade handling) */
if (failed_grab(&gy.youmonst, mon, mattk))
break;
/* hug attack against ordinary foe */
if (mon == u.ustuck) {
pline("%s is being %s%s.", Monnam(mon),
@@ -5371,12 +5379,17 @@ hmonas(struct monst *mon)
mon_maybe_unparalyze(mon);
if ((dhit = (tmp > rnd(20 + i)))) {
wakeup(mon, TRUE);
/* can't engulf unsolid creatures */
if (mon->data == &mons[PM_SHADE]) {
/* no specialdmg check needed */
Your("attempt to surround %s is harmless.", mon_nam(mon));
} else if (failed_grab(&gy.youmonst, mon, mattk)) {
; /* non-shade miss; message already given */
} else {
sum[i] = gulpum(mon, mattk);
if (sum[i] == M_ATTK_DEF_DIED && (mon->data->mlet == S_ZOMBIE
|| mon->data->mlet == S_MUMMY)
if (sum[i] == M_ATTK_DEF_DIED
&& (mon->data->mlet == S_ZOMBIE
|| mon->data->mlet == S_MUMMY)
&& rn2(5) && !Sick_resistance) {
You_feel("%ssick.", (Sick) ? "very " : "");
mdamageu(mon, rnd(8));