Don't let cancelled zombies or cancelled liches create new zombies.
/* ### mon.c ### */
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 m_poisongas_ok(struct monst *);
extern int undead_to_corpse(int);
/* mkmaze.c */
{ {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0} }, /* bughack */
- UNDEFINED_VALUE, /* was_waterlevel */
+ FALSE, /* was_waterlevel */
UNDEFINED_PTR, /* bbubbles */
UNDEFINED_PTR, /* ebubbles */
UNDEFINED_PTR, /* wportal */
0, /* ransacked */
/* mon.c */
- UNDEFINED_VALUE, /* vamp_rise_msg */
- UNDEFINED_VALUE, /* disintegested */
- UNDEFINED_VALUE, /* zombify */
+ FALSE, /* vamp_rise_msg */
+ FALSE, /* disintegested */
+ FALSE, /* zombify */
NULL, /* animal_list */
UNDEFINED_VALUE, /* animal_list_count */
FALSE, /* m_using */
UNDEFINED_VALUE, /* trapx */
UNDEFINED_VALUE, /* trapy */
- UNDEFINED_VALUE, /* zap_oseen */
+ FALSE, /* zap_oseen */
UNDEFINED_VALUES, /* m */
/* nhlan.c */
u.ugrave_arise = PM_WRAITH;
else if (mptr->mlet == S_MUMMY && g.urace.mummynum != NON_PM)
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);
else if (mptr->mlet == S_VAMPIRE && Race_if(PM_HUMAN))
u.ugrave_arise = PM_VAMPIRE;
place_monster(mdef, mdef->mx, mdef->my);
mdef->mhp = 0;
}
- g.zombify = !mwep && zombie_maker(magr->data)
- && ((mattk->aatyp == AT_TUCH
- || mattk->aatyp == AT_CLAW
- || mattk->aatyp == AT_BITE)
- && zombie_form(mdef->data) != NON_PM);
+ g.zombify = (!mwep && zombie_maker(magr)
+ && (mattk->aatyp == AT_TUCH
+ || mattk->aatyp == AT_CLAW
+ || mattk->aatyp == AT_BITE)
+ && zombie_form(mdef->data) != NON_PM);
monkilled(mdef, "", (int) mattk->adtyp);
g.zombify = FALSE; /* reset */
if (!DEADMONSTER(mdef))
return M_POISONGAS_BAD;
}
-/* Return TRUE if this monster is capable of converting other monsters into
- * zombies. */
+/* return True if mon is capable of converting other monsters into zombies */
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:
/* Z-class monsters that aren't actually zombies go here */
if (pm == &mons[PM_GHOUL] || pm == &mons[PM_SKELETON])
return FALSE;
}
-/* return the monster index of the zombie monster which this monster could be
- * turned into, or NON_PM if it doesn't have a direct counterpart. 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. */
+/* Return monster index of zombie monster which this monster could
+ be turned into, or NON_PM if it doesn't have a direct counterpart.
+ Sort of the zombie-specific inverse of undead_to_corpse. */
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:
return PM_KOBOLD_ZOMBIE;
case S_ORC:
return cnt;
}
-/* Part of mm_aggression that represents two-way aggression. To avoid having to
- * code each case twice, this function contains those cases that ought to
- * happen twice, and mm_aggression will call it twice. */
+/* Part of mm_aggression that represents two-way aggression. To avoid
+ having to code each case twice, this function contains those cases that
+ ought to happen twice, and mm_aggression will call it twice. */
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 */
- if (zombie_maker(ma) && zombie_form(md) != NON_PM)
- return ALLOW_M|ALLOW_TM;
+ if (zombie_maker(magr) && zombie_form(mdef->data) != NON_PM)
+ return (ALLOW_M | ALLOW_TM);
return 0;
}
/* corpse--none if hero was inside the monster */
if (!wasinside && corpse_chance(mtmp, (struct monst *) 0, FALSE)) {
g.zombify = (!g.thrownobj && !g.stoned && !uwep
- && zombie_maker(g.youmonst.data)
+ && zombie_maker(&g.youmonst)
&& zombie_form(mtmp->data) != NON_PM);
cadaver = make_corpse(mtmp, burycorpse ? CORPSTAT_BURIED
: CORPSTAT_NONE);