From: nethack.rankin Date: Sat, 23 Feb 2002 11:13:41 +0000 (+0000) Subject: double undead turning X-Git-Tag: MOVE2GIT~3138 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a9b2f4f1eef3a1376d14f1e4d0b5cba106d7c3ae;p=nethack double undead turning From the newsgroup: when an undead monster got killed by a wand or spell of undead turning, if it left a corpse that corpse would be hit by the same zap and was immediately revived. This fix uses the flag bits that were added to prevent objects that are dropped by a polymorphed monster from being hit by the same polymorph zap. This also fixes a post-3.3.1 bug that produced "the turns to flee" even when that monster had been killed by the turning attack. 3.3.1 had the same bogus fleeing effect but didn't give any message so it was unnoticeable. --- diff --git a/doc/fixes34.0 b/doc/fixes34.0 index 6c1477985..fc0913b8c 100644 --- a/doc/fixes34.0 +++ b/doc/fixes34.0 @@ -437,6 +437,8 @@ throwing an artifact upwards will trigger artifact hit effects when it falls being hit by Fire Brand stops the turning-into-slime process monsters hitting other monsters can split puddings with weapons be consistent with checking for iron weapons when splitting puddings +prevent corpses of undead creatures just killed by undead turning from being + instantly revived by the same undead turning attack Platform- and/or Interface-Specific Fixes diff --git a/src/mon.c b/src/mon.c index 92163cda0..0664b7cab 100644 --- a/src/mon.c +++ b/src/mon.c @@ -238,6 +238,10 @@ register struct monst *mtmp; } /* All special cases should precede the G_NOCORPSE check */ + /* if polymorph or undead turning has killed this monster, + prevent the same attack beam from hitting its corpse */ + if (flags.bypasses) bypass_obj(obj); + if (mtmp->mnamelth) obj = oname(obj, NAME(mtmp)); diff --git a/src/zap.c b/src/zap.c index 19242142d..aad71a8e3 100644 --- a/src/zap.c +++ b/src/zap.c @@ -166,8 +166,10 @@ struct obj *otmp; if(dbldam) dmg *= 2; if (otyp == SPE_TURN_UNDEAD) dmg += spell_damage_bonus(); - if(!resist(mtmp, otmp->oclass, dmg, NOTELL)) - monflee(mtmp, 0, FALSE, TRUE); + flags.bypasses = TRUE; /* for make_corpse() */ + if (!resist(mtmp, otmp->oclass, dmg, NOTELL)) { + if (mtmp->mhp > 0) monflee(mtmp, 0, FALSE, TRUE); + } } break; case WAN_POLYMORPH: @@ -186,12 +188,14 @@ struct obj *otmp; pline("%s shudders!", Monnam(mtmp)); makeknown(otyp); } + /* flags.bypasses = TRUE; ## for make_corpse() */ /* no corpse after system shock */ xkilled(mtmp, 3); - } - else if (newcham(mtmp, (struct permonst *)0, (otyp != POT_POLYMORPH)) ) + } else if (newcham(mtmp, (struct permonst *)0, + (otyp != POT_POLYMORPH))) { if (!Hallucination && canspotmon(mtmp)) makeknown(otyp); + } } break; case WAN_CANCELLATION: @@ -1435,6 +1439,10 @@ struct obj *obj, *otmp; * consistent with items that remain in the * monster's inventory. They are not polymorphed * either. + * UNDEAD_TURNING - When an undead creature gets killed via + * undead turning, prevent its corpse from being + * immediately revived by the same effect. + * * The bypass bit on all objects is reset each turn, whenever * flags.bypasses is set. *