fix #H5507 - vampire death message bug
Fix a couple of weird messages issued when a shape-shifted vampire is "killed" and reverts to regular vampire form instead of dying. First weird one was when vampire has been given a name, as reported. Second was noticed while fixing that: when cause of death destroys the creature so thoroughly that there'd be no corpse, the alternate phrasing for noncorporeal or amorphous form should be used. old: The Dracula suddenly transforms and rises as Dracula! The vampire bat is disintegrated. The seemingly dead vampire bat suddenly transforms and rises as a vampire! new: Dracula suddenly transforms and rises as a vampire! The vampire bat is disintegrated. The seemingly dead vampire bat suddenly reconstitutes and rises as a vampire!
This commit is contained in:
@@ -382,6 +382,13 @@ removing a blindfold with 'A' took two turns, with 'R' (and 'T') only one,
|
|||||||
and could result in a panic if the blindfold was stolen during removal
|
and could result in a panic if the blindfold was stolen during removal
|
||||||
cmdassist help for movement prefix followed by invalid direction was strange
|
cmdassist help for movement prefix followed by invalid direction was strange
|
||||||
when the direction was up, down, or self disallowed for that prefix
|
when the direction was up, down, or self disallowed for that prefix
|
||||||
|
poor message when shape-shifted vampire reverts to vampire if it has a name:
|
||||||
|
The Dracula suddenly transforms and rises as Dracula.
|
||||||
|
poor message when shape-shifted vampire reverts if cause of 'death' was
|
||||||
|
disintegration or digestion and shifted form wasn't amorphous:
|
||||||
|
The vampire bat is disintegrated. The vampire bat suddenly transforms
|
||||||
|
and rises as a vampire. (fix: switch to existing alternate phrasing
|
||||||
|
used for amorphous form, "reconstitute" rather than "transform")
|
||||||
|
|
||||||
|
|
||||||
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
|
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
|
||||||
|
|||||||
38
src/mon.c
38
src/mon.c
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.6 mon.c $NHDT-Date: 1492733171 2017/04/21 00:06:11 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.237 $ */
|
/* NetHack 3.6 mon.c $NHDT-Date: 1495836090 2017/05/26 22:01:30 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.238 $ */
|
||||||
/* 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. */
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
#include "mfndpos.h"
|
#include "mfndpos.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
STATIC_VAR boolean vamp_rise_msg;
|
STATIC_VAR boolean vamp_rise_msg, disintegested;
|
||||||
|
|
||||||
STATIC_DCL void FDECL(sanity_check_single_mon, (struct monst *, BOOLEAN_P,
|
STATIC_DCL void FDECL(sanity_check_single_mon, (struct monst *, BOOLEAN_P,
|
||||||
const char *));
|
const char *));
|
||||||
@@ -1826,16 +1826,21 @@ register struct monst *mtmp;
|
|||||||
/* alternate message phrasing for some monster types */
|
/* alternate message phrasing for some monster types */
|
||||||
spec_mon = (nonliving(mtmp->data)
|
spec_mon = (nonliving(mtmp->data)
|
||||||
|| noncorporeal(mtmp->data)
|
|| noncorporeal(mtmp->data)
|
||||||
|| amorphous(mtmp->data));
|
|| amorphous(mtmp->data)),
|
||||||
|
spec_death = (disintegested /* disintegrated or digested */
|
||||||
|
|| noncorporeal(mtmp->data)
|
||||||
|
|| amorphous(mtmp->data));
|
||||||
|
|
||||||
/* construct a format string before transformation */
|
/* construct a format string before transformation;
|
||||||
Sprintf(buf, "The %s%s suddenly %s and rises as %%s!",
|
will be capitalized when used, expects one %s arg */
|
||||||
spec_mon ? "" : "seemingly dead ",
|
Sprintf(buf, "%s suddenly %s and rises as %%s!",
|
||||||
x_monnam(mtmp, ARTICLE_NONE, (char *) 0,
|
x_monnam(mtmp,
|
||||||
|
has_mname(mtmp) ? ARTICLE_NONE : ARTICLE_THE,
|
||||||
|
spec_mon ? (char *) 0 : "seemingly dead",
|
||||||
SUPPRESS_SADDLE | SUPPRESS_HALLUCINATION
|
SUPPRESS_SADDLE | SUPPRESS_HALLUCINATION
|
||||||
| SUPPRESS_INVISIBLE | SUPPRESS_IT,
|
| SUPPRESS_INVISIBLE | SUPPRESS_IT,
|
||||||
FALSE),
|
FALSE),
|
||||||
spec_mon ? "reconstitutes" : "transforms");
|
spec_death ? "reconstitutes" : "transforms");
|
||||||
mtmp->mcanmove = 1;
|
mtmp->mcanmove = 1;
|
||||||
mtmp->mfrozen = 0;
|
mtmp->mfrozen = 0;
|
||||||
if (mtmp->mhpmax <= 0)
|
if (mtmp->mhpmax <= 0)
|
||||||
@@ -1857,7 +1862,9 @@ register struct monst *mtmp;
|
|||||||
else
|
else
|
||||||
mtmp->cham = mndx;
|
mtmp->cham = mndx;
|
||||||
if (canspotmon(mtmp)) {
|
if (canspotmon(mtmp)) {
|
||||||
pline(buf, a_monnam(mtmp));
|
/* was using a_monnam(mtmp) but that's weird if mtmp is named:
|
||||||
|
"Dracula suddenly transforms and rises as Dracula" */
|
||||||
|
pline(upstart(buf), an(mtmp->data->mname));
|
||||||
vamp_rise_msg = TRUE;
|
vamp_rise_msg = TRUE;
|
||||||
}
|
}
|
||||||
newsym(x, y);
|
newsym(x, y);
|
||||||
@@ -1887,9 +1894,7 @@ register struct monst *mtmp;
|
|||||||
else if (mtmp->data == &mons[PM_WERERAT])
|
else if (mtmp->data == &mons[PM_WERERAT])
|
||||||
set_mon_data(mtmp, &mons[PM_HUMAN_WERERAT], -1);
|
set_mon_data(mtmp, &mons[PM_HUMAN_WERERAT], -1);
|
||||||
|
|
||||||
/* if MAXMONNO monsters of a given type have died, and it
|
/*
|
||||||
* can be done, extinguish that monster.
|
|
||||||
*
|
|
||||||
* mvitals[].died does double duty as total number of dead monsters
|
* mvitals[].died does double duty as total number of dead monsters
|
||||||
* and as experience factor for the player killing more monsters.
|
* and as experience factor for the player killing more monsters.
|
||||||
* this means that a dragon dying by other means reduces the
|
* this means that a dragon dying by other means reduces the
|
||||||
@@ -2145,7 +2150,8 @@ int how;
|
|||||||
be_sad = (mdef->mtame != 0);
|
be_sad = (mdef->mtame != 0);
|
||||||
|
|
||||||
/* no corpses if digested or disintegrated */
|
/* no corpses if digested or disintegrated */
|
||||||
if (how == AD_DGST || how == -AD_RBRE)
|
disintegested = (how == AD_DGST || how == -AD_RBRE);
|
||||||
|
if (disintegested)
|
||||||
mondead(mdef);
|
mondead(mdef);
|
||||||
else
|
else
|
||||||
mondied(mdef);
|
mondied(mdef);
|
||||||
@@ -2241,16 +2247,18 @@ int xkill_flags; /* 1: suppress message, 2: suppress corpse, 4: pacifist */
|
|||||||
thrownobj = 0;
|
thrownobj = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
vamp_rise_msg = FALSE; /* might get set in mondead() */
|
vamp_rise_msg = FALSE; /* might get set in mondead(); only checked below */
|
||||||
|
disintegested = nocorpse; /* alternate vamp_rise message needed if true */
|
||||||
/* dispose of monster and make cadaver */
|
/* dispose of monster and make cadaver */
|
||||||
if (stoned)
|
if (stoned)
|
||||||
monstone(mtmp);
|
monstone(mtmp);
|
||||||
else
|
else
|
||||||
mondead(mtmp);
|
mondead(mtmp);
|
||||||
|
disintegested = FALSE; /* reset */
|
||||||
|
|
||||||
if (mtmp->mhp > 0) { /* monster lifesaved */
|
if (mtmp->mhp > 0) { /* monster lifesaved */
|
||||||
/* Cannot put the non-visible lifesaving message in
|
/* Cannot put the non-visible lifesaving message in
|
||||||
* lifesaved_monster() since the message appears only when you
|
* lifesaved_monster() since the message appears only when _you_
|
||||||
* kill it (as opposed to visible lifesaving which always appears).
|
* kill it (as opposed to visible lifesaving which always appears).
|
||||||
*/
|
*/
|
||||||
stoned = FALSE;
|
stoned = FALSE;
|
||||||
|
|||||||
Reference in New Issue
Block a user