fix #H9375 - unintended Rider corpse suppression

Don't let Riders swap places with something (fog or ooze, perhaps)
located at a closed door spot because if it gets killed there, there
won't be any corpse and it will stop auto-reviving.

Just avoid moving to spots where mondied() won't place a corpse
instead of worrying about whether a bargethrough creature (if there
ever are any besides the Riders) might be able to survive at the
destination (so ignore pass-walls, door-opening, swimming, &c).
This commit is contained in:
PatR
2019-11-22 18:16:59 -08:00
parent c8af8e23c1
commit ce46c97e6e
2 changed files with 20 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 monmove.c $NHDT-Date: 1557094802 2019/05/05 22:20:02 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.113 $ */
/* NetHack 3.6 monmove.c $NHDT-Date: 1574475416 2019/11/23 02:16:56 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.114 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1605,8 +1605,8 @@ register struct monst *mtmp;
*/
boolean
undesirable_disp(mtmp, x, y)
struct monst *mtmp;
xchar x, y;
struct monst *mtmp; /* barging creature */
xchar x, y; /* spot 'mtmp' is considering moving to */
{
boolean is_pet = (mtmp && mtmp->mtame && !mtmp->isminion);
struct trap *trap = t_at(x, y);
@@ -1625,6 +1625,17 @@ xchar x, y;
return TRUE;
}
/* oversimplification: creatures that bargethrough can't do so when
target monster is in rock or closed door or water (in particular,
avoid moving to spots where mondied() won't leave a corpse) */
if (!accessible(x, y)
/* mondied() allows ispool() as an exception to !accessible(),
but we'll only do that if both or neither of mtmp's spot and
destination spot are water so that we don't swap a water
critter onto land or the inverse */
&& (!is_pool(x, y) ^ !is_pool(mtmp->mx, mtmp->my)))
return TRUE;
return FALSE;
}