From 70fe2ce5cdeb99badd5f2d932adee08df9657a4c Mon Sep 17 00:00:00 2001 From: Michael Meyer Date: Tue, 4 Oct 2022 17:37:35 -0400 Subject: [PATCH] Don't make callers responsible for losestr death 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 ". --- include/extern.h | 2 +- src/attrib.c | 11 ++++++++--- src/eat.c | 11 ++++++----- src/fountain.c | 2 +- src/mcastu.c | 6 +----- src/spell.c | 3 ++- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/include/extern.h b/include/extern.h index e1f1b9f6d..2f7e2b3c8 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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); diff --git a/src/attrib.c b/src/attrib.c index 43f3759a3..e74abd3e2 100644 --- a/src/attrib.c +++ b/src/attrib.c @@ -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; diff --git a/src/eat.c b/src/eat.c index 1ebf42014..c7108eafa 100644 --- 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) { diff --git a/src/fountain.c b/src/fountain.c index 13203b330..8791f39b3 100644 --- a/src/fountain.c +++ b/src/fountain.c @@ -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; diff --git a/src/mcastu.c b/src/mcastu.c index f83a38689..d8dc1c9e4 100644 --- a/src/mcastu.c +++ b/src/mcastu.c @@ -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; diff --git a/src/spell.c b/src/spell.c index f10c86a4c..d72e42dde 100644 --- a/src/spell.c +++ b/src/spell.c @@ -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;