fix drawbridge + place_monster impossible
Reported via email direct to devteam. If a monster killed by a drawbridge survives via life-saving and a second monster also survives (in the reported case, it was a xorn who will always survive bridge destruction), the second monster will be placed at the same spot. That triggers an impossible "placing <2nd mon> over <1st mon>, at <x,y>, mstates 0 0 at Dlvl N?". If the first monster survives due to pass_walls rather than due to life-saving and a second survives too, one of them should end up being moved to a different spot and not trigger the impossible (not verified via testing). When a monster survives via life-saving, kill it again even if there is no second monster involved.
This commit is contained in:
+24
-2
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.7 dbridge.c $NHDT-Date: 1702349063 2023/12/12 02:44:23 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.62 $ */
|
/* NetHack 3.7 dbridge.c $NHDT-Date: 1772771734 2026/03/05 20:35:34 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.70 $ */
|
||||||
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -399,7 +399,9 @@ e_survives_at(struct entity *etmp, coordxy x, coordxy y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
staticfn void
|
staticfn void
|
||||||
e_died(struct entity *etmp, int xkill_flags, int how)
|
e_died(
|
||||||
|
struct entity *etmp,
|
||||||
|
int xkill_flags, int how)
|
||||||
{
|
{
|
||||||
if (is_u(etmp)) {
|
if (is_u(etmp)) {
|
||||||
if (how == DROWNING) {
|
if (how == DROWNING) {
|
||||||
@@ -444,6 +446,26 @@ e_died(struct entity *etmp, int xkill_flags, int how)
|
|||||||
mk_message(xkill_flags), mk_corpse(xkill_flags));
|
mk_message(xkill_flags), mk_corpse(xkill_flags));
|
||||||
else /* you caused it */
|
else /* you caused it */
|
||||||
xkilled(etmp->emon, xkill_flags);
|
xkilled(etmp->emon, xkill_flags);
|
||||||
|
|
||||||
|
/* if etmp gets life-saved, kill it again; otherwise we might end up
|
||||||
|
trying to place another monster (probably a xorn) on same spot */
|
||||||
|
if (!DEADMONSTER(etmp->emon)) {
|
||||||
|
int seeit = canspotmon(etmp->emon);
|
||||||
|
|
||||||
|
xkill_flags |= XKILL_NOMSG | XKILL_NOCONDUCT;
|
||||||
|
if (svc.context.mon_moving)
|
||||||
|
monkilled(etmp->emon, "", mk_corpse(xkill_flags));
|
||||||
|
else /* you caused it */
|
||||||
|
xkilled(etmp->emon, xkill_flags);
|
||||||
|
|
||||||
|
if (DEADMONSTER(etmp->emon)) {
|
||||||
|
if (seeit)
|
||||||
|
pline("Unfortunately for %s, %s is still crushed.",
|
||||||
|
mon_nam(etmp->emon), mhe(etmp->emon));
|
||||||
|
} else {
|
||||||
|
; /* FIXME: still not dead? What should we do now? */
|
||||||
|
}
|
||||||
|
}
|
||||||
etmp->edata = (struct permonst *) 0;
|
etmp->edata = (struct permonst *) 0;
|
||||||
|
|
||||||
/* dead long worm handling */
|
/* dead long worm handling */
|
||||||
|
|||||||
Reference in New Issue
Block a user