pull request #857 - levelport destination by name

Pull request from entrez:  specifying a level teleport destination
by level name allowed non-wizard mode controlled level teleport to
move across dungeon branchs.

Does not affect wizard mode '^V ?' or 'm ^V'.

Closes #857
This commit is contained in:
PatR
2022-08-28 15:35:58 -07:00

View File

@@ -1975,6 +1975,14 @@ level_difficulty(void)
return res;
}
/* within same branch, or else main dungeon <-> gehennom */
#define dlev_in_current_branch(dlev) \
(dlev.dnum == u.uz.dnum \
|| (u.uz.dnum == valley_level.dnum \
&& dlev.dnum == medusa_level.dnum) \
|| (u.uz.dnum == medusa_level.dnum \
&& dlev.dnum == valley_level.dnum))
/* Take one word and try to match it to a level.
* Recognized levels are as shown by print_dungeon().
*/
@@ -1982,7 +1990,7 @@ schar
lev_by_name(const char *nam)
{
schar lev = 0;
s_level *slev = (s_level *)0;
s_level *slev = (s_level *) 0;
d_level dlev;
const char *p;
int idx, idxtoo;
@@ -2017,12 +2025,7 @@ lev_by_name(const char *nam)
if (mseen || slev) {
idx = ledger_no(&dlev);
if ((dlev.dnum == u.uz.dnum
/* within same branch, or else main dungeon <-> gehennom */
|| (u.uz.dnum == valley_level.dnum
&& dlev.dnum == medusa_level.dnum)
|| (u.uz.dnum == medusa_level.dnum
&& dlev.dnum == valley_level.dnum))
if (dlev_in_current_branch(dlev)
&& (/* either wizard mode or else seen and not forgotten */
wizard
|| (g.level_info[idx].flags & (VISITED))
@@ -2048,13 +2051,16 @@ lev_by_name(const char *nam)
idx = idxtoo;
dlev.dnum = ledger_to_dnum(idx);
dlev.dlevel = ledger_to_dlev(idx);
lev = depth(&dlev);
if (dlev_in_current_branch(dlev))
lev = depth(&dlev);
}
}
}
return lev;
}
#undef dlev_in_current_branch
static boolean
unplaced_floater(struct dungeon *dptr)
{