more #H9375 - Rider bargethrough

I think the previous expression would allow moving (via swapping
places) from a pool to solid rock or closed door which was not what
was intended (but moot since there aren't any pools on the Astral
level).  This revised expression does what is intended:  can only
swap to a pool location if already located in/over (the Riders fly?
they should probably be non-breathing) another pool.
This commit is contained in:
PatR
2019-11-23 09:28:08 -08:00
parent ce46c97e6e
commit fe2826c856

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 monmove.c $NHDT-Date: 1574475416 2019/11/23 02:16:56 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.114 $ */ /* NetHack 3.6 monmove.c $NHDT-Date: 1574530078 2019/11/23 17:27:58 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.115 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */ /*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1625,15 +1625,16 @@ xchar x, y; /* spot 'mtmp' is considering moving to */
return TRUE; return TRUE;
} }
/* oversimplification: creatures that bargethrough can't do so when /* oversimplification: creatures that bargethrough can't swap places
target monster is in rock or closed door or water (in particular, when target monster is in rock or closed door or water (in particular,
avoid moving to spots where mondied() won't leave a corpse) */ avoid moving to spots where mondied() won't leave a corpse; doesn't
matter whether barger is capable of moving to such a target spot if
it were unoccupied) */
if (!accessible(x, y) if (!accessible(x, y)
/* mondied() allows ispool() as an exception to !accessible(), /* mondied() allows is_pool() as an exception to !accessible(),
but we'll only do that if both or neither of mtmp's spot and but we'll only do that if 'mtmp' is already at a water location
destination spot are water so that we don't swap a water so that we don't swap a water critter onto land */
critter onto land or the inverse */ && !(is_pool(x, y) && is_pool(mtmp->mx, mtmp->my)))
&& (!is_pool(x, y) ^ !is_pool(mtmp->mx, mtmp->my)))
return TRUE; return TRUE;
return FALSE; return FALSE;