extern int erode_obj(struct obj *, const char *, int, int);
extern boolean grease_protect(struct obj *, const char *, struct monst *);
extern struct trap *maketrap(coordxy, coordxy, int);
+extern d_level *clamp_hole_destination(d_level *);
extern void fall_through(boolean, unsigned);
extern struct monst *animate_statue(struct obj *, coordxy, coordxy, int, int *);
extern struct monst *activate_statue_trap(struct trap *, coordxy, coordxy,
return Trap_Effect_Finished;
} else {
assign_level(&tolevel, &trap->dst);
+ (void) clamp_hole_destination(&tolevel);
}
} else if (tt == MAGIC_PORTAL) {
if (In_endgame(&u.uz) && (mon_has_amulet(mtmp)
return ttmp;
}
+/* limit the destination of a hole or trapdoor to the furthest level you
+ should be able to fall to */
+d_level *
+clamp_hole_destination(d_level *dlev)
+{
+ int bottom = dng_bottom(dlev);
+ dlev->dlevel = min(dlev->dlevel, bottom);
+ if (In_hell(dlev) && !u.uevent.invoked
+ && dlev->dlevel == bottom)
+ dlev->dlevel--;
+
+ return dlev;
+}
+
void
fall_through(
boolean td, /* td == TRUE : trap door or hole */
int dist;
if (t) {
- dtmp.dnum = t->dst.dnum;
+ assign_level(&dtmp, &t->dst);
/* don't fall beyond the bottom, in case this came from a bones
file with different dungeon size */
- bottom = dng_bottom(&t->dst);
- dtmp.dlevel = min(t->dst.dlevel, bottom);
- if (In_hell(&t->dst) && !u.uevent.invoked
- && dtmp.dlevel == bottom)
- dtmp.dlevel--;
+ (void) clamp_hole_destination(&dtmp);
} else {
dtmp.dnum = u.uz.dnum;
dtmp.dlevel = newlevel;
}
- /* XXX: dist won't be accurate if dtmp.dnum may not match u.uz.dnum */
- dist = dtmp.dlevel - dunlev(&u.uz);
+ dist = depth(&dtmp) - depth(&u.uz);
if (dist > 1)
You("fall down a %s%sshaft!", dist > 3 ? "very " : "",
dist > 2 ? "deep " : "");