done_in_by shapechanger (trunk only)
Augment killer reason when slain by a shapechanged creature:
"killed by a foo" becomes "killed by a chameleon immitating a foo" or
"killed by a vampire in foo form" or "killed by the Wizard of Yendor
disguised as a foo" (after double-trouble, when the clone starts out
mimicking something).
I put the fixes entry in the new features section.
This commit is contained in:
@@ -395,6 +395,7 @@ using F to attack wall/boulder/statue while wielding pick digs/breaks target
|
|||||||
shapechangers shouldn't receive starting inventory of their initial shape
|
shapechangers shouldn't receive starting inventory of their initial shape
|
||||||
streamline old ^X output and integrate it with enlightenment feedback;
|
streamline old ^X output and integrate it with enlightenment feedback;
|
||||||
new ^X output includes expanded form of abbreviated bottom line info
|
new ^X output includes expanded form of abbreviated bottom line info
|
||||||
|
"killed by X" becomes "killed by a chameleon immitating X" when appropriate
|
||||||
|
|
||||||
|
|
||||||
Platform- and/or Interface-Specific New Features
|
Platform- and/or Interface-Specific New Features
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* SCCS Id: @(#)end.c 3.5 2008/01/30 */
|
/* SCCS Id: @(#)end.c 3.5 2008/02/08 */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -195,21 +195,27 @@ struct monst *mtmp;
|
|||||||
int how;
|
int how;
|
||||||
{
|
{
|
||||||
char buf[BUFSZ];
|
char buf[BUFSZ];
|
||||||
boolean distorted = (boolean)(Hallucination && canspotmon(mtmp));
|
struct permonst *mptr = mtmp->data,
|
||||||
|
*champtr = (mtmp->cham >= LOW_PM) ? &mons[mtmp->cham] : mptr;
|
||||||
|
boolean distorted = (boolean)(Hallucination && canspotmon(mtmp)),
|
||||||
|
mimicker = (mtmp->m_ap_type == M_AP_MONSTER),
|
||||||
|
immitator = (mptr != champtr || mimicker);
|
||||||
|
|
||||||
You((how == STONING) ? "turn to stone..." : "die...");
|
You((how == STONING) ? "turn to stone..." : "die...");
|
||||||
mark_synch(); /* flush buffered screen output */
|
mark_synch(); /* flush buffered screen output */
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
killer.format = KILLED_BY_AN;
|
killer.format = KILLED_BY_AN;
|
||||||
/* "killed by the high priest of Crom" is okay, "killed by the high
|
/* "killed by the high priest of Crom" is okay,
|
||||||
priest" alone isn't */
|
"killed by the high priest" alone isn't */
|
||||||
if ((mtmp->data->geno & G_UNIQ) != 0 && !(mtmp->data == &mons[PM_HIGH_PRIEST] && !mtmp->ispriest)) {
|
if ((mptr->geno & G_UNIQ) != 0 &&
|
||||||
if (!type_is_pname(mtmp->data))
|
!(immitator && !mimicker) &&
|
||||||
|
!(mptr == &mons[PM_HIGH_PRIEST] && !mtmp->ispriest)) {
|
||||||
|
if (!type_is_pname(mptr))
|
||||||
Strcat(buf, "the ");
|
Strcat(buf, "the ");
|
||||||
killer.format = KILLED_BY;
|
killer.format = KILLED_BY;
|
||||||
}
|
}
|
||||||
/* _the_ <invisible> <distorted> ghost of Dudley */
|
/* _the_ <invisible> <distorted> ghost of Dudley */
|
||||||
if (mtmp->data == &mons[PM_GHOST] && has_mname(mtmp)) {
|
if (mptr == &mons[PM_GHOST] && has_mname(mtmp)) {
|
||||||
Strcat(buf, "the ");
|
Strcat(buf, "the ");
|
||||||
killer.format = KILLED_BY;
|
killer.format = KILLED_BY;
|
||||||
}
|
}
|
||||||
@@ -218,7 +224,38 @@ int how;
|
|||||||
if (distorted)
|
if (distorted)
|
||||||
Strcat(buf, "hallucinogen-distorted ");
|
Strcat(buf, "hallucinogen-distorted ");
|
||||||
|
|
||||||
if(mtmp->data == &mons[PM_GHOST]) {
|
if (immitator) {
|
||||||
|
char shape[BUFSZ];
|
||||||
|
const char *realnm = champtr->mname, *fakenm = mptr->mname;
|
||||||
|
boolean alt = is_vampshifter(mtmp);
|
||||||
|
|
||||||
|
if (mimicker) {
|
||||||
|
/* realnm is already correct because champtr==mptr;
|
||||||
|
set up fake mptr for type_is_pname/the_unique_pm */
|
||||||
|
mptr = &mons[mtmp->mappearance];
|
||||||
|
fakenm = mptr->mname;
|
||||||
|
} else if (alt && strstri(realnm, "vampire") &&
|
||||||
|
!strcmp(fakenm, "vampire bat")) {
|
||||||
|
/* special case: use "vampire in bat form" in preference
|
||||||
|
to redundant looking "vampire in vampire bat form" */
|
||||||
|
fakenm = "bat";
|
||||||
|
}
|
||||||
|
/* for the alternate format, always suppress any article;
|
||||||
|
pname and the_unique should also have s_suffix() applied,
|
||||||
|
but vampires don't take on any shapes which warrant that */
|
||||||
|
if (alt || type_is_pname(mptr)) /* no article */
|
||||||
|
Strcpy(shape, fakenm);
|
||||||
|
else if (the_unique_pm(mptr)) /* "the"; don't use the() here */
|
||||||
|
Sprintf(shape, "the %s", fakenm);
|
||||||
|
else /* "a"/"an" */
|
||||||
|
Strcpy(shape, an(fakenm));
|
||||||
|
/* omit "called" to avoid excessive verbosity */
|
||||||
|
Sprintf(eos(buf),
|
||||||
|
alt ? "%s in %s form" :
|
||||||
|
mimicker ? "%s disguised as %s" : "%s immitating %s",
|
||||||
|
realnm, shape);
|
||||||
|
mptr = mtmp->data; /* reset for mimicker case */
|
||||||
|
} else if (mptr == &mons[PM_GHOST]) {
|
||||||
Strcat(buf, "ghost");
|
Strcat(buf, "ghost");
|
||||||
if (has_mname(mtmp)) Sprintf(eos(buf), " of %s", MNAME(mtmp));
|
if (has_mname(mtmp)) Sprintf(eos(buf), " of %s", MNAME(mtmp));
|
||||||
} else if(mtmp->isshk) {
|
} else if(mtmp->isshk) {
|
||||||
@@ -233,20 +270,20 @@ int how;
|
|||||||
it overrides the effect of Hallucination on priestname() */
|
it overrides the effect of Hallucination on priestname() */
|
||||||
Strcat(buf, m_monnam(mtmp));
|
Strcat(buf, m_monnam(mtmp));
|
||||||
} else {
|
} else {
|
||||||
Strcat(buf, mtmp->data->mname);
|
Strcat(buf, mptr->mname);
|
||||||
if (has_mname(mtmp))
|
if (has_mname(mtmp))
|
||||||
Sprintf(eos(buf), " called %s", MNAME(mtmp));
|
Sprintf(eos(buf), " called %s", MNAME(mtmp));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (multi) Strcat(buf, ", while helpless");
|
if (multi) Strcat(buf, ", while helpless");
|
||||||
Strcpy(killer.name, buf);
|
Strcpy(killer.name, buf);
|
||||||
if (mtmp->data->mlet == S_WRAITH)
|
if (mptr->mlet == S_WRAITH)
|
||||||
u.ugrave_arise = PM_WRAITH;
|
u.ugrave_arise = PM_WRAITH;
|
||||||
else if (mtmp->data->mlet == S_MUMMY && urace.mummynum != NON_PM)
|
else if (mptr->mlet == S_MUMMY && urace.mummynum != NON_PM)
|
||||||
u.ugrave_arise = urace.mummynum;
|
u.ugrave_arise = urace.mummynum;
|
||||||
else if (mtmp->data->mlet == S_VAMPIRE && Race_if(PM_HUMAN))
|
else if (mptr->mlet == S_VAMPIRE && Race_if(PM_HUMAN))
|
||||||
u.ugrave_arise = PM_VAMPIRE;
|
u.ugrave_arise = PM_VAMPIRE;
|
||||||
else if (mtmp->data == &mons[PM_GHOUL])
|
else if (mptr == &mons[PM_GHOUL])
|
||||||
u.ugrave_arise = PM_GHOUL;
|
u.ugrave_arise = PM_GHOUL;
|
||||||
if (u.ugrave_arise >= LOW_PM &&
|
if (u.ugrave_arise >= LOW_PM &&
|
||||||
(mvitals[u.ugrave_arise].mvflags & G_GENOD))
|
(mvitals[u.ugrave_arise].mvflags & G_GENOD))
|
||||||
|
|||||||
Reference in New Issue
Block a user