extern boolean Invocation_lev(d_level *);
extern xchar level_difficulty(void);
extern schar lev_by_name(const char *);
+extern boolean known_branch_stairs(stairway *, char *, boolean);
extern schar print_dungeon(boolean, schar *, xchar *);
extern char *get_annotation(d_level *);
extern int donamelevel(void);
break;
case STAIRS:
sway = stairway_at(x, y);
- if (sway && (sway->tolev.dnum != u.uz.dnum))
+ if (known_branch_stairs(sway, (char *) 0, FALSE))
idx = (ptr->ladder & LA_DOWN) ? S_brdnstair : S_brupstair;
else
idx = (ptr->ladder & LA_DOWN) ? S_dnstair : S_upstair;
break;
case LADDER:
sway = stairway_at(x, y);
- if (sway && (sway->tolev.dnum != u.uz.dnum))
+ if (known_branch_stairs(sway, (char *) 0, FALSE))
idx = (ptr->ladder & LA_DOWN) ? S_brdnladder : S_brupladder;
else
idx = (ptr->ladder & LA_DOWN) ? S_dnladder : S_upladder;
/* find i such that (i->base + 1) <= ledgerno <= (i->base + i->count) */
for (i = 0; i < g.n_dgns; i++)
if (g.dungeons[i].ledger_start < ledgerno
- && ledgerno <= g.dungeons[i].ledger_start + g.dungeons[i].num_dunlevs)
+ && (ledgerno
+ <= g.dungeons[i].ledger_start + g.dungeons[i].num_dunlevs))
return (xchar) i;
panic("level number out of range [ledger_to_dnum(%d)]", (int) ledgerno);
* below rather than stairs 1 level beneath the entry level.
*/
else if (On_W_tower_level(&u.uz) && In_W_tower(some_X, some_Y, &u.uz))
- res += (fakewiz1.dlev - u.uz.dlev);
+ res += (fakewiz1.dlevel - u.uz.dlevel);
/*
* Handling this properly would need more information here:
* an inside/outside flag, or coordinates to calculate it.
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)
+{
+ d_level tolev;
+ const char *stairs, *updown;
+ int ledgr, dest_visited;
+
+ if (outbuf)
+ *outbuf = '\0';
+ if (!sway)
+ return FALSE;
+
+ tolev = sway->tolev;
+ stairs = sway->isladder ? "ladder" : stcase ? "staircase" : "stairs";
+ updown = sway->up ? "up" : "down";
+ ledgr = ledger_no(&tolev);
+ dest_visited = (g.level_info[ledgr].flags & VISITED) != 0;
+
+ if (tolev.dnum == u.uz.dnum || !dest_visited) {
+ if (outbuf) {
+ Sprintf(outbuf, "%s %s", stairs, updown);
+ if (dest_visited) {
+ boolean specialdepth = (tolev.dnum == quest_dnum
+ || tolev.dnum == knox_level.dnum);
+ int to_dlev = specialdepth ? dunlev(&tolev) : depth(&tolev);
+
+ Sprintf(eos(outbuf), " to level %d", to_dlev);
+ }
+ }
+ /* might actually be branch stairs but if the branch hasn't been
+ visited yet, the hero won't know that */
+ return FALSE;
+ }
+ if (outbuf) {
+ Sprintf(outbuf, "branch %s %s to %s",
+ stairs, updown, g.dungeons[tolev.dnum].dname);
+ (void) strsubst(outbuf, "The ", "the ");
+ }
+ /* branch stairs and hero knows it */
+ return TRUE;
+}
+
/* Convert a branch type to a string usable by print_dungeon(). */
static const char *
br_string(int type)
int ltyp = lev->typ, cmap = -1;
const char *dfeature = 0;
static char altbuf[BUFSZ];
- stairway *stway = stairway_at(x,y);
+ stairway *stway = stairway_at(x, y);
if (IS_DOOR(ltyp)) {
switch (lev->doormask) {
a_gname(),
align_str(Amask2align(lev->altarmask & ~AM_SHRINE)));
dfeature = altbuf;
- } else if (stway && !stway->isladder && stway->up)
- cmap = S_upstair; /* "staircase up" */
- else if (stway && !stway->isladder && !stway->up)
- cmap = S_dnstair; /* "staircase down" */
- else if (stway && stway->isladder && stway->up)
- cmap = S_upladder; /* "ladder up" */
- else if (stway && stway->isladder && !stway->up)
- cmap = S_dnladder; /* "ladder down" */
- else if (ltyp == DRAWBRIDGE_DOWN)
+ } else if (stway) {
+ (void) known_branch_stairs(stway, altbuf, TRUE);
+ dfeature = altbuf;
+#if 0
+ if (!stway->isladder && stway->up)
+ cmap = S_upstair; /* "staircase up" */
+ else if (!stway->isladder && !stway->up)
+ cmap = S_dnstair; /* "staircase down" */
+ else if (stway->isladder && stway->up)
+ cmap = S_upladder; /* "ladder up" */
+ else if (stway->isladder && !stway->up)
+ cmap = S_dnladder; /* "ladder down" */
+#endif
+ } else if (ltyp == DRAWBRIDGE_DOWN)
cmap = S_vodbridge; /* "lowered drawbridge" */
else if (ltyp == DBWALL)
cmap = S_vcdbridge; /* "raised drawbridge" */