grammar bit: fatal cockatrice corpse theft (trunk only)

From a bug report, stealing a cockatrice corpse
from a monster while polymorphed into a nymph and not wearing any gloves,
the cause of death ended up being "petrified by cockatrice corpse".  It would
also have said the same thing if a stack of multiple corpses was involved.
This fixes both cases, and also hypothetical unique monsters with petrifying
touch.  (Last bit tested by temporarily adding Medusa to touch_petrifies().)
This commit is contained in:
nethack.rankin
2005-12-01 04:19:15 +00:00
parent 6708e01a47
commit c28a4aece8
2 changed files with 35 additions and 9 deletions

View File

@@ -99,6 +99,7 @@ assigning an artifact name is rejected on objects with similar description to
adjust feedback for gas spore explosion when hallucinating
traps detected by scroll or crystal ball overlooked carried or buried chests
can't wish for a trapped box/chest/tin by specifying "poisoned"
grammar bit if killed by stealing a cockatrice corpse from a monster
Platform- and/or Interface-Specific Fixes

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)uhitm.c 3.5 2005/09/27 */
/* SCCS Id: @(#)uhitm.c 3.5 2005/11/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -6,6 +6,7 @@
STATIC_DCL boolean FDECL(known_hitum, (struct monst *,struct obj *,
int *,int,int,struct attack *));
STATIC_DCL boolean FDECL(theft_petrifies, (struct obj *));
STATIC_DCL void FDECL(steal_it, (struct monst *, struct attack *));
STATIC_DCL boolean FDECL(hitum, (struct monst *,struct attack *));
STATIC_DCL boolean FDECL(hmon_hitmon, (struct monst *,struct obj *,int));
@@ -1210,6 +1211,36 @@ demonpet()
exercise(A_WIS, TRUE);
}
STATIC_OVL boolean
theft_petrifies(otmp)
struct obj *otmp;
{
const char *fmt;
char *p, cbuf[BUFSZ], kbuf[BUFSZ];
if (uarmg || otmp->otyp != CORPSE ||
!touch_petrifies(&mons[otmp->corpsenm])) return FALSE;
/* stealing this corpse is fatal... */
Strcpy(cbuf, cxname(otmp)); /* "cockatrice corpse" */
fmt = "a stolen %s";
if (otmp->quan > 1L) {
/* stack of multiple cockatrice corpses; no article for plural */
fmt += 2; /* skip "a ", leaving "stolen %s" */
} else if ((p = strstri(cbuf, "'s corpse")) != 0 ||
(p = strstri(cbuf, "s' corpse")) != 0) {
/* in case a unique monster with petrifying touch and
a personal name ever gets introduced: we want to use
"Foo's stolen corpse" instead of "a stolen Foo's corpse" */
*(p + 2) = '\0'; /* chop " corpse" off of cbuf */
fmt = "%s stolen corpse";
}
Sprintf(kbuf, fmt, cbuf);
instapetrify(kbuf);
/* apparently wasn't fatal after all... */
return TRUE;
}
/*
* Player uses theft attack against monster.
*
@@ -1280,14 +1311,8 @@ struct attack *mattk;
otmp = hold_another_object(otmp, "You snatched but dropped %s.",
doname(otmp), "You steal: ");
if (otmp->where != OBJ_INVENT) continue;
if (otmp->otyp == CORPSE &&
touch_petrifies(&mons[otmp->corpsenm]) && !uarmg) {
char kbuf[BUFSZ];
Sprintf(kbuf, "stolen %s corpse", mons[otmp->corpsenm].mname);
instapetrify(kbuf);
break; /* stop the theft even if hero survives */
}
if (theft_petrifies(otmp))
break; /* stop thieving even though hero survived */
/* more take-away handling, after theft message */
if (unwornmask & W_WEP) { /* stole wielded weapon */
possibly_unwield(mdef, FALSE);