From 7881d5b4b2a815011676ce8b52b9d78a44cd6f92 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 14 Jan 2026 23:21:40 +0000 Subject: [PATCH] Make air elementals respect damage reduction from AC Players of both 3.4.3 and 3.7 have observed for a long time that air elementals are disproportionately dangerous compared to other endgame threats. (In particular, playtester feedback from 3.7 was that the Plane of Air was much more dangerous than it should be, with playtesters treating it similarly to Astral with respect to the use of high-quality escape items.) It turns out that this was because damage from air elementals while engulfed was entirely ignoring AC, meaning that regardless of your stats, you would be taking around 16.5 damage per turn while engulfed (half physical damage helped, but nothing else did). This commit purely fixes the bug, but does not balance around it, which means that it causes the endgame air elementals to become almost entirely nonthreatening. In a future commit, I plan to balance around this change. --- doc/fixes3-7-0.txt | 2 ++ src/mhitu.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 913448953..a53504e4d 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1568,6 +1568,8 @@ throwing ammo without a launcher produces a message polymorphing into a large polyform unequips rather than destroying cloaks clarify in the #quit message that it doesn't save the game cursed potion of invisibility removes intrinsic invisibility +fix bug which caused engulf damage from air elementals and fog clouds to + ignore damage reduction from armor class Fixes to 3.7.0-x General Problems Exposed Via git Repository diff --git a/src/mhitu.c b/src/mhitu.c index 8599136ed..89f6006dd 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -1535,8 +1535,15 @@ gulpmu(struct monst *mtmp, struct attack *mattk) break; } - if (physical_damage) + if (physical_damage) { + /* same damage reduction for AC as in hitmu */ + if (u.uac < 0) + tmp -= rnd(-u.uac); + if (tmp < 0) + tmp = 1; + tmp = Maybe_Half_Phys(tmp); + } gm.mswallower = mtmp; /* match gulpmm() */ mdamageu(mtmp, tmp);