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 <monster name>".
This commit is contained in:
Michael Meyer
2022-10-04 17:37:35 -04:00
committed by PatR
parent c0dfa40cd3
commit 70fe2ce5cd
6 changed files with 19 additions and 16 deletions

View 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);

View 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;

View File

@@ -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) {

View 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;

View 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;

View 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;