} else if (at_stairs && !In_endgame(&u.uz)) {
if (up) {
stairway *stway = stairway_find_from(&u.uz0, g.at_ladder);
- if (stway)
+ if (stway) {
u_on_newpos(stway->sx, stway->sy);
- else if (newdungeon)
+ stway->u_traversed = TRUE;
+ } else if (newdungeon)
u_on_sstairs(1);
else
u_on_dnstairs();
g.at_ladder ? "ladder" : "stairs");
} else { /* down */
stairway *stway = stairway_find_from(&u.uz0, g.at_ladder);
- if (stway)
+ if (stway) {
u_on_newpos(stway->sx, stway->sy);
- else if (newdungeon)
+ stway->u_traversed = TRUE;
+ } else if (newdungeon)
u_on_sstairs(0);
else
u_on_upstairs();
stairway *stway = stairway_at(u.ux, u.uy);
d_level newlevel;
+ if (at_stairs && stway)
+ stway->u_traversed = TRUE;
+
if (at_stairs && stway) {
newlevel.dnum = stway->tolev.dnum;
newlevel.dlevel = stway->tolev.dlevel;
stairway *stway = stairway_at(u.ux, u.uy);
d_level newlevel;
+ if (at_stairs && stway)
+ stway->u_traversed = TRUE;
+
if (at_stairs && stway && stway->tolev.dnum != u.uz.dnum) {
/* Taking an up dungeon branch. */
/* KMH -- Upwards branches are okay if not level 1 */
tmp->sy = y;
tmp->up = up;
tmp->isladder = isladder;
+ tmp->u_traversed = FALSE;
assign_level(&(tmp->tolev), dest);
tmp->next = g.stairs;
g.stairs = tmp;
return;
}
-/* this is only an approximation; to make it accurate, the stair list
- should track which stairs have been traversed */
boolean
known_branch_stairs(stairway *sway, char *outbuf, boolean stcase)
{
ledgr = ledger_no(&tolev);
dest_visited = (g.level_info[ledgr].flags & VISITED) != 0;
- if (tolev.dnum == u.uz.dnum || !dest_visited) {
+ if (tolev.dnum == u.uz.dnum || !sway->u_traversed) {
if (outbuf) {
Sprintf(outbuf, "%s %s", stairs, updown);
if (dest_visited) {
int buflen = 0;
stairway stway = UNDEFINED_VALUES;
int len = 0;
+ stairway *newst;
stairway_free_all();
while (1) {
}
stairway_add(stway.sx, stway.sy, stway.up, stway.isladder,
&(stway.tolev));
+ newst = stairway_at(stway.sx, stway.sy);
+ if (newst)
+ newst->u_traversed = stway.u_traversed;
}
}