diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 9e8b35ab5..2d6aa7ef9 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1067,6 +1067,8 @@ rearranging first-kill and first-hit gamelog messages to get hit before kill counting "just picked up" items when deciding what pseudo-classes should be included for the 'I' command's object class prompt was operating on an uninitialized varaible +changes to stair internals resulted in summoned Kops blockcading the stairs up + rather than intended stairs down curses: 'msg_window' option wasn't functional for curses unless the binary also included tty support diff --git a/src/wizard.c b/src/wizard.c index e1d435104..89fc73a26 100644 --- a/src/wizard.c +++ b/src/wizard.c @@ -310,35 +310,41 @@ strategy(struct monst *mtmp) return dstrat; } +/* pick a destination for a covetous monster to flee to so that it can + heal or for guardians (Kops) to congregate at to block hero's progress */ void -choose_stairs(xchar *sx, xchar *sy, boolean dir) +choose_stairs( + xchar *sx, xchar *sy, /* output; left as-is if no spot found */ + boolean dir) /* True: forward, False: backtrack (usually up) */ { - xchar x = 0, y = 0; stairway *stway; - boolean stdir = dir && !builds_up(&u.uz); + boolean stdir = builds_up(&u.uz) ? dir : !dir; - if ((stway = stairway_find_type_dir(FALSE, stdir)) != 0) { - /* stairs in direction 'stdir' */ - x = stway->sx; - y = stway->sy; - } else if ((stway = stairway_find_type_dir(TRUE, stdir)) != 0) { - /* ladder in direction 'stdir' */ - x = stway->sx; - y = stway->sy; - } else { - /* branch stairs in any direction */ - for (stway = g.stairs; stway; stway = stway->next) - if (stway->tolev.dnum != u.uz.dnum) { - x = stway->sx; - y = stway->sy; - break; + /* look for stairs in direction 'stdir' (True: up, False: down) */ + stway = stairway_find_type_dir(FALSE, stdir); + if (!stway) { + /* no stairs; look for ladder it that direction */ + stway = stairway_find_type_dir(TRUE, stdir); + if (!stway) { + /* no ladder either; look for branch stairs or ladder in any + direction */ + for (stway = g.stairs; stway; stway = stway->next) + if (stway->tolev.dnum != u.uz.dnum) + break; + /* if no branch stairs/ladder, check for regular stairs in + opposite direction, then for regular ladder if necessary */ + if (!stway) { + stway = stairway_find_type_dir(FALSE, !stdir); + if (!stway) + stway = stairway_find_type_dir(TRUE, !stdir); } + } + /* [note: 'stway' could still be Null if the only access to this + level is via magic portal] */ } - if (isok(x, y)) { - *sx = x; - *sy = y; - } + if (stway) + *sx = stway->sx, *sy = stway->sy; } DISABLE_WARNING_UNREACHABLE_CODE