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);
/* 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;
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.");
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) {
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;
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;
/* 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;