diagonal movement glitch

|..X..
|.X}X.
|..X..
When testing the odd Samuari moats, I discovered that you could
easily walk diagonally between any two of the solid stone pillars
and fall into the water but you would always drown because it's a
no-teleport level and the crawl routine wouldn't let you back out
via that same diagonal.

The crawl routine is also being used by travel for the last step--a
post 3.6 change--so there was an unnecessary restriction on diagonal
movement there too.
This commit is contained in:
PatR
2021-08-02 17:44:03 -07:00
parent 5e4150be9a
commit e5f96cd329
3 changed files with 33 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.614 $ $NHDT-Date: 1627951222 2021/08/03 00:40:22 $
NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.615 $ $NHDT-Date: 1627951429 2021/08/03 00:43:49 $
General Fixes and Modified Features
-----------------------------------
@@ -582,6 +582,8 @@ in wizard mode, knowing teleport away spell resulted in ^T always attempting
the spell instead of teleporting on demand
describe a couple of isolated moat spots on Samurai quest home level as water
rather than as moat
crawling out of water to avoid drowning didn't work as intended when trying
to move diagonally through a tight squeeze
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -1,4 +1,4 @@
/* NetHack 3.7 hack.c $NHDT-Date: 1617035736 2021/03/29 16:35:36 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.281 $ */
/* NetHack 3.7 hack.c $NHDT-Date: 1627951429 2021/08/03 00:43:49 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.291 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Derek S. Ray, 2015. */
/* NetHack may be freely redistributed. See license for details. */
@@ -2969,7 +2969,8 @@ crawl_destination(int x, int y)
return FALSE;
/* finally, are we trying to squeeze through a too-narrow gap? */
return !(bad_rock(g.youmonst.data, u.ux, y)
&& bad_rock(g.youmonst.data, x, u.uy));
&& bad_rock(g.youmonst.data, x, u.uy)
&& cant_squeeze_thru(&g.youmonst));
}
/* something like lookaround, but we are not running */

View File

@@ -1,4 +1,4 @@
/* NetHack 3.7 trap.c $NHDT-Date: 1615759958 2021/03/14 22:12:38 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.403 $ */
/* NetHack 3.7 trap.c $NHDT-Date: 1627951430 2021/08/03 00:43:50 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.416 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2013. */
/* NetHack may be freely redistributed. See license for details. */
@@ -4229,6 +4229,7 @@ drown(void)
if (g.multi < 0 || (Upolyd && !g.youmonst.data->mmove))
goto crawl;
/* look around for a place to crawl to */
#if 0
for (i = 0; i < 100; i++) {
x = rn1(3, u.ux - 1);
y = rn1(3, u.uy - 1);
@@ -4244,6 +4245,31 @@ drown(void)
crawl_ok = TRUE;
goto crawl;
}
#else
{
int j, k, dirs[N_DIRS];
/* instead of picking a random direction up to 100 times, try each
of the eight directions at most once after shuffling their order */
for (i = 0; i < N_DIRS; ++i)
dirs[i] = i;
for (i = N_DIRS; i > 0; --i) {
j = rn2(i);
k = dirs[j];
dirs[j] = dirs[i - 1];
dirs[i - 1] = k;
}
for (i = 0; i < N_DIRS; ++i) {
x = u.ux + xdir[dirs[i]];
y = u.uy + ydir[dirs[i]];
/* note: crawl_dest calls goodpos() which performs isok() check */
if (crawl_destination(x, y)) {
crawl_ok = TRUE;
break;
}
}
}
#endif
crawl:
if (crawl_ok) {
boolean lost = FALSE;