]> granicus.if.org Git - nethack/commitdiff
Don't make callers responsible for losestr death
authorMichael Meyer <me@entrez.cc>
Tue, 4 Oct 2022 21:37:35 +0000 (17:37 -0400)
committerPatR <rankin@nethack.org>
Sat, 8 Oct 2022 23:29:55 +0000 (16:29 -0700)
Remove callers' responsibility to deal with possible hero death when
calling losestr.  This is less fragile and error-prone than leaving it
in the caller's hands, but it means that death from the monster spell
'weaken target' no longer goes through done_in_by, and the death reason
is no longer "killed by <monster name>".

include/extern.h
src/attrib.c
src/eat.c
src/fountain.c
src/mcastu.c
src/spell.c

index e1f1b9f6ded8f6157406a850dfa2933c0119fac8..2f7e2b3c820ae90eb3fffd39e4649d670ac3871d 100644 (file)
@@ -114,7 +114,7 @@ extern struct obj *has_magic_key(struct monst *);
 
 extern boolean adjattrib(int, int, int);
 extern void gainstr(struct obj *, int, boolean);
-extern void losestr(int);
+extern void losestr(int, const char *, schar);
 extern void poisontell(int, boolean);
 extern void poisoned(const char *, int, const char *, int, boolean);
 extern void change_luck(schar);
index 43f3759a366071e03efafc34b6f13e37510f7100..e74abd3e28c9c66c57dc892e21fb15a531d54397 100644 (file)
@@ -211,19 +211,24 @@ gainstr(struct obj *otmp, int incr, boolean givemsg)
 
 /* may kill you; cause may be poison or monster like 'a' */
 void
-losestr(int num)
+losestr(int num, const char *knam, schar k_format)
 {
     int uhpmin = minuhpmax(1), olduhpmax = u.uhpmax;
     int ustr = ABASE(A_STR) - num;
 
+    /* in case HP loss kills the hero once Str hits the minimum */
+    if (!knam || !*knam) {
+        knam = "terminal frailty";
+        k_format = KILLED_BY;
+    }
+
     while (ustr < 3) {
         ++ustr;
         --num;
+        losehp(6, knam, k_format);
         if (Upolyd) {
-            u.mh -= 6;
             u.mhmax -= 6;
         } else {
-            u.uhp -= 6;
             setuhpmax(u.uhpmax - 6);
         }
         g.context.botl = TRUE;
index 1ebf4201475ecb0d013e61b216f291bbdc1b4c11..c7108eafa6752027b6ec13eabc9afdd31c49f024 100644 (file)
--- a/src/eat.c
+++ b/src/eat.c
@@ -1815,9 +1815,9 @@ eatcorpse(struct obj *otmp)
         tp++;
         pline("Ecch - that must have been poisonous!");
         if (!Poison_resistance) {
-            losestr(rnd(4));
-            losehp(rnd(15), !glob ? "poisonous corpse" : "poisonous glob",
-                   KILLED_BY_AN);
+            const char *knam = !glob ? "poisonous corpse" : "poisonous glob";
+            losestr(rnd(4), knam, KILLED_BY_AN);
+            losehp(rnd(15), knam, KILLED_BY_AN);
         } else
             You("seem unaffected by the poison.");
 
@@ -2753,8 +2753,9 @@ doeat(void)
         if (otmp->oclass == WEAPON_CLASS && otmp->opoisoned) {
             pline("Ecch - that must have been poisonous!");
             if (!Poison_resistance) {
-                losestr(rnd(4));
-                losehp(rnd(15), xname(otmp), KILLED_BY_AN);
+                const char *knam = xname(otmp);
+                losestr(rnd(4), knam, KILLED_BY_AN);
+                losehp(rnd(15), knam, KILLED_BY_AN);
             } else
                 You("seem unaffected by the poison.");
         } else if (!nodelicious) {
index 13203b3309fe4c32d8931c1737f18547f2f42024..8791f39b34650e95d95039ace2ddc6e3e9f8ae90 100644 (file)
@@ -292,7 +292,7 @@ drinkfountain(void)
                 losehp(rnd(4), "unrefrigerated sip of juice", KILLED_BY_AN);
                 break;
             }
-            losestr(rn1(4, 3));
+            losestr(rn1(4, 3), "contaminated water", KILLED_BY);
             losehp(rnd(10), "contaminated water", KILLED_BY);
             exercise(A_CON, FALSE);
             break;
index f83a38689dce909ffa202092e5c5ac7b48e30ec3..d8dc1c9e4648b6157bb60d46db354d91bbaaacbe 100644 (file)
@@ -465,11 +465,7 @@ cast_wizard_spell(struct monst *mtmp, int dmg, int spellnum)
             dmg = mtmp->m_lev - 6;
             if (Half_spell_damage)
                 dmg = (dmg + 1) / 2;
-            losestr(rnd(dmg));
-            if (u.uhp < 1)
-                done_in_by(mtmp, DIED);
-            else if (Upolyd && u.mh < 1)
-                rehumanize();
+            losestr(rnd(dmg), (const char *) 0, 0);
         }
         dmg = 0;
         break;
index f10c86a4c10f8d6b5edd7da4d1c7729e99363f22..d72e42dde10533cb9407c59e09a5b60f6acbff33 100644 (file)
@@ -152,7 +152,8 @@ cursed_book(struct obj* bp)
         /* temp disable in_use; death should not destroy the book */
         was_in_use = bp->in_use;
         bp->in_use = FALSE;
-        losestr(Poison_resistance ? rn1(2, 1) : rn1(4, 3));
+        losestr(Poison_resistance ? rn1(2, 1) : rn1(4, 3),
+                "contact-poisoned spellbook", KILLED_BY_AN);
         losehp(rnd(Poison_resistance ? 6 : 10), "contact-poisoned spellbook",
                KILLED_BY_AN);
         bp->in_use = was_in_use;