diff --git a/include/extern.h b/include/extern.h index 68adedd8e..85c0afd09 100644 --- a/include/extern.h +++ b/include/extern.h @@ -114,7 +114,8 @@ 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 poison_strdmg(int, int, const char *, schar); extern void poisontell(int, boolean); extern void poisoned(const char *, int, const char *, int, boolean); extern void change_luck(schar); @@ -977,7 +978,7 @@ extern int monster_nearby(void); extern void end_running(boolean); extern void nomul(int); extern void unmul(const char *); -extern void losehp(int, const char *, boolean); +extern void losehp(int, const char *, schar); extern int weight_cap(void); extern int inv_weight(void); extern int near_capacity(void); diff --git a/src/attrib.c b/src/attrib.c index 43f3759a3..7684c057c 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; - while (ustr < 3) { + /* in case HP loss kills the hero once Str hits the minimum */ + if (!knam || !*knam) { + knam = "terminal frailty"; + k_format = KILLED_BY; + } + + while (ustr < ATTRMIN(A_STR)) { ++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; @@ -236,6 +241,14 @@ losestr(int num) (void) adjattrib(A_STR, -num, 1); } +/* combined strength loss and damage from some poisons */ +void +poison_strdmg(int strloss, int dmg, const char *knam, schar k_format) +{ + losestr(strloss, knam, k_format); + losehp(dmg, knam, k_format); +} + static const struct poison_effect_message { void (*delivery_func)(const char *, ...); const char *effect_msg; diff --git a/src/eat.c b/src/eat.c index 1ebf42014..bfd567006 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); + poison_strdmg(rnd(4), rnd(15), + !glob ? "poisonous corpse" : "poisonous glob", + KILLED_BY_AN); } else You("seem unaffected by the poison."); @@ -2753,8 +2753,7 @@ 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); + poison_strdmg(rnd(4), rnd(15), xname(otmp), 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..d965b0a0a 100644 --- a/src/fountain.c +++ b/src/fountain.c @@ -292,8 +292,8 @@ drinkfountain(void) losehp(rnd(4), "unrefrigerated sip of juice", KILLED_BY_AN); break; } - losestr(rn1(4, 3)); - losehp(rnd(10), "contaminated water", KILLED_BY); + poison_strdmg(rn1(4, 3), rnd(10), "contaminated water", + KILLED_BY); exercise(A_CON, FALSE); break; case 22: /* Fountain of snakes! */ diff --git a/src/hack.c b/src/hack.c index dabe05e7f..aff4a2a99 100644 --- a/src/hack.c +++ b/src/hack.c @@ -3645,7 +3645,7 @@ maybe_wail(void) } void -losehp(int n, const char *knam, boolean k_format) +losehp(int n, const char *knam, schar k_format) { #if 0 /* code below is prepared to handle negative 'loss' so don't add this * until we've verified that no callers intentionally rely on that */ diff --git a/src/mcastu.c b/src/mcastu.c index 1179988cb..d8dc1c9e4 100644 --- a/src/mcastu.c +++ b/src/mcastu.c @@ -465,9 +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); + losestr(rnd(dmg), (const char *) 0, 0); } dmg = 0; break; diff --git a/src/spell.c b/src/spell.c index f10c86a4c..248ec0685 100644 --- a/src/spell.c +++ b/src/spell.c @@ -152,9 +152,9 @@ 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)); - losehp(rnd(Poison_resistance ? 6 : 10), "contact-poisoned spellbook", - KILLED_BY_AN); + poison_strdmg(Poison_resistance ? rn1(2, 1) : rn1(4, 3), + rnd(Poison_resistance ? 6 : 10), + "contact-poisoned spellbook", KILLED_BY_AN); bp->in_use = was_in_use; break; case 6: