diff --git a/src/cmd.c b/src/cmd.c index 6b066ea6b..27c8ed2ab 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 cmd.c $NHDT-Date: 1709675219 2024/03/05 21:46:59 $ $NHDT-Branch: keni-mdlib-followup $:$NHDT-Revision: 1.711 $ */ +/* NetHack 3.7 cmd.c $NHDT-Date: 1710029089 2024/03/10 00:04:49 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.712 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -3882,11 +3882,13 @@ void confdir(boolean force_impairment) { if (force_impairment || u_maybe_impaired()) { - int x = NODIAG(u.umonnum) ? (int) dirs_ord[rn2(4)] : rn2(N_DIRS); + int kmax = NODIAG(u.umonnum) ? (N_DIRS / 2) : N_DIRS, + k = (int) dirs_ord[rn2(kmax)]; - u.dx = xdir[x]; - u.dy = ydir[x]; + u.dx = xdir[k]; + u.dy = ydir[k]; } + return; } const char * diff --git a/src/timeout.c b/src/timeout.c index b0fa7fc06..62dbb8707 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 timeout.c $NHDT-Date: 1703294874 2023/12/23 01:27:54 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.167 $ */ +/* NetHack 3.7 timeout.c $NHDT-Date: 1710029105 2024/03/10 00:05:05 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.182 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2018. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1236,9 +1236,17 @@ slip_or_trip(void) You("lose your balance."); dismount_steed(DISMOUNT_FELL); } else if (!rn2(10 + ACURR(A_DEX))) { - int dir = rn2(N_DIRS); - - hurtle(xdir[dir], ydir[dir], 1, FALSE); + /* Maybe slip in a random direction. This takes place after + the hero has already changed location. If the hero is + in grid bug form, only allow forward hurtle, otherwise a + 90 degree orthogonal one after the step would make the + combined move appear to be a single diagonal step. */ + if (!NODIAG(u.umonnum)) + confdir(TRUE); /* sets u.dx and u.dy */ + /* Only hurtle if the random directon won't move hero back + to same spot where this move started. */ + if (u.ux + u.dx != u.ux0 || u.uy + u.dy != u.uy0) + hurtle(u.dx, u.dy, 1, FALSE); } } else { if (on_foot) {