cancelled zombification

Don't let cancelled zombies or cancelled liches create new zombies.
This commit is contained in:
PatR
2021-03-30 17:33:31 -07:00
parent 18b28b3355
commit 0479625c94
5 changed files with 34 additions and 33 deletions
+1 -1
View File
@@ -1375,7 +1375,7 @@ extern int cmap_to_type(int);
/* ### mon.c ### */ /* ### mon.c ### */
extern void mon_sanity_check(void); extern void mon_sanity_check(void);
extern boolean zombie_maker(struct permonst *); extern boolean zombie_maker(struct monst *);
extern int zombie_form(struct permonst *); extern int zombie_form(struct permonst *);
extern int m_poisongas_ok(struct monst *); extern int m_poisongas_ok(struct monst *);
extern int undead_to_corpse(int); extern int undead_to_corpse(int);
+5 -5
View File
@@ -476,7 +476,7 @@ const struct instance_globals g_init = {
/* mkmaze.c */ /* mkmaze.c */
{ {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} }, /* bughack */ { {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} }, /* bughack */
UNDEFINED_VALUE, /* was_waterlevel */ FALSE, /* was_waterlevel */
UNDEFINED_PTR, /* bbubbles */ UNDEFINED_PTR, /* bbubbles */
UNDEFINED_PTR, /* ebubbles */ UNDEFINED_PTR, /* ebubbles */
UNDEFINED_PTR, /* wportal */ UNDEFINED_PTR, /* wportal */
@@ -487,9 +487,9 @@ const struct instance_globals g_init = {
0, /* ransacked */ 0, /* ransacked */
/* mon.c */ /* mon.c */
UNDEFINED_VALUE, /* vamp_rise_msg */ FALSE, /* vamp_rise_msg */
UNDEFINED_VALUE, /* disintegested */ FALSE, /* disintegested */
UNDEFINED_VALUE, /* zombify */ FALSE, /* zombify */
NULL, /* animal_list */ NULL, /* animal_list */
UNDEFINED_VALUE, /* animal_list_count */ UNDEFINED_VALUE, /* animal_list_count */
@@ -502,7 +502,7 @@ const struct instance_globals g_init = {
FALSE, /* m_using */ FALSE, /* m_using */
UNDEFINED_VALUE, /* trapx */ UNDEFINED_VALUE, /* trapx */
UNDEFINED_VALUE, /* trapy */ UNDEFINED_VALUE, /* trapy */
UNDEFINED_VALUE, /* zap_oseen */ FALSE, /* zap_oseen */
UNDEFINED_VALUES, /* m */ UNDEFINED_VALUES, /* m */
/* nhlan.c */ /* nhlan.c */
+1 -1
View File
@@ -507,7 +507,7 @@ done_in_by(struct monst *mtmp, int how)
u.ugrave_arise = PM_WRAITH; u.ugrave_arise = PM_WRAITH;
else if (mptr->mlet == S_MUMMY && g.urace.mummynum != NON_PM) else if (mptr->mlet == S_MUMMY && g.urace.mummynum != NON_PM)
u.ugrave_arise = g.urace.mummynum; u.ugrave_arise = g.urace.mummynum;
else if (zombie_maker(mptr) && zombie_form(g.youmonst.data) != NON_PM) else if (zombie_maker(mtmp) && zombie_form(g.youmonst.data) != NON_PM)
u.ugrave_arise = zombie_form(g.youmonst.data); u.ugrave_arise = zombie_form(g.youmonst.data);
else if (mptr->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;
+5 -5
View File
@@ -906,11 +906,11 @@ mdamagem(struct monst *magr, struct monst *mdef,
place_monster(mdef, mdef->mx, mdef->my); place_monster(mdef, mdef->mx, mdef->my);
mdef->mhp = 0; mdef->mhp = 0;
} }
g.zombify = !mwep && zombie_maker(magr->data) g.zombify = (!mwep && zombie_maker(magr)
&& ((mattk->aatyp == AT_TUCH && (mattk->aatyp == AT_TUCH
|| mattk->aatyp == AT_CLAW || mattk->aatyp == AT_CLAW
|| mattk->aatyp == AT_BITE) || mattk->aatyp == AT_BITE)
&& zombie_form(mdef->data) != NON_PM); && zombie_form(mdef->data) != NON_PM);
monkilled(mdef, "", (int) mattk->adtyp); monkilled(mdef, "", (int) mattk->adtyp);
g.zombify = FALSE; /* reset */ g.zombify = FALSE; /* reset */
if (!DEADMONSTER(mdef)) if (!DEADMONSTER(mdef))
+22 -21
View File
@@ -276,12 +276,16 @@ m_poisongas_ok(struct monst* mtmp)
return M_POISONGAS_BAD; return M_POISONGAS_BAD;
} }
/* Return TRUE if this monster is capable of converting other monsters into /* return True if mon is capable of converting other monsters into zombies */
* zombies. */
boolean boolean
zombie_maker(struct permonst* pm) zombie_maker(struct monst *mon)
{ {
switch(pm->mlet) { struct permonst *pm = mon->data;
if (mon->mcan)
return FALSE;
switch (pm->mlet) {
case S_ZOMBIE: case S_ZOMBIE:
/* Z-class monsters that aren't actually zombies go here */ /* Z-class monsters that aren't actually zombies go here */
if (pm == &mons[PM_GHOUL] || pm == &mons[PM_SKELETON]) if (pm == &mons[PM_GHOUL] || pm == &mons[PM_SKELETON])
@@ -294,15 +298,15 @@ zombie_maker(struct permonst* pm)
return FALSE; return FALSE;
} }
/* return the monster index of the zombie monster which this monster could be /* Return monster index of zombie monster which this monster could
* turned into, or NON_PM if it doesn't have a direct counterpart. Sort of the be turned into, or NON_PM if it doesn't have a direct counterpart.
* zombie-specific inverse of undead_to_corpse. Sort of the zombie-specific inverse of undead_to_corpse. */
* If a zombie gets passed to this function, it should return NON_PM, not the
* same monster again. */
int int
zombie_form(struct permonst* pm) zombie_form(struct permonst *pm)
{ {
switch(pm->mlet) { switch (pm->mlet) {
case S_ZOMBIE: /* when already a zombie/ghoul/skeleton, will stay as is */
return NON_PM;
case S_KOBOLD: case S_KOBOLD:
return PM_KOBOLD_ZOMBIE; return PM_KOBOLD_ZOMBIE;
case S_ORC: case S_ORC:
@@ -1892,18 +1896,15 @@ mfndpos(
return cnt; return cnt;
} }
/* Part of mm_aggression that represents two-way aggression. To avoid having to /* Part of mm_aggression that represents two-way aggression. To avoid
* code each case twice, this function contains those cases that ought to having to code each case twice, this function contains those cases that
* happen twice, and mm_aggression will call it twice. */ ought to happen twice, and mm_aggression will call it twice. */
static long static long
mm_2way_aggression(struct monst* magr, struct monst* mdef) mm_2way_aggression(struct monst *magr, struct monst *mdef)
{ {
struct permonst *ma = magr->data;
struct permonst *md = mdef->data;
/* zombies vs things that can be zombified */ /* zombies vs things that can be zombified */
if (zombie_maker(ma) && zombie_form(md) != NON_PM) if (zombie_maker(magr) && zombie_form(mdef->data) != NON_PM)
return ALLOW_M|ALLOW_TM; return (ALLOW_M | ALLOW_TM);
return 0; return 0;
} }
@@ -2880,7 +2881,7 @@ xkilled(
/* corpse--none if hero was inside the monster */ /* corpse--none if hero was inside the monster */
if (!wasinside && corpse_chance(mtmp, (struct monst *) 0, FALSE)) { if (!wasinside && corpse_chance(mtmp, (struct monst *) 0, FALSE)) {
g.zombify = (!g.thrownobj && !g.stoned && !uwep g.zombify = (!g.thrownobj && !g.stoned && !uwep
&& zombie_maker(g.youmonst.data) && zombie_maker(&g.youmonst)
&& zombie_form(mtmp->data) != NON_PM); && zombie_form(mtmp->data) != NON_PM);
cadaver = make_corpse(mtmp, burycorpse ? CORPSTAT_BURIED cadaver = make_corpse(mtmp, burycorpse ? CORPSTAT_BURIED
: CORPSTAT_NONE); : CORPSTAT_NONE);