E int FDECL(erode_obj, (struct obj *, const char *, int, int));
E boolean FDECL(grease_protect, (struct obj *, const char *, struct monst *));
E struct trap *FDECL(maketrap, (int, int, int));
-E void FDECL(fall_through, (BOOLEAN_P));
+E void FDECL(fall_through, (BOOLEAN_P, unsigned));
E struct monst *FDECL(animate_statue,
(struct obj *, XCHAR_P, XCHAR_P, int, int *));
E struct monst *FDECL(activate_statue_trap,
}
void
-fall_through(td)
+fall_through(td, ftflags)
boolean td; /* td == TRUE : trap door or hole */
+unsigned ftflags;
{
d_level dtmp;
char msgbuf[BUFSZ];
const char *dont_fall = 0;
int newlevel, bottom;
+ struct trap *t = (struct trap *) 0;
/* we'll fall even while levitating in Sokoban; otherwise, if we
won't fall and won't be told that we aren't falling, give up now */
} while (!rn2(4) && newlevel < bottom);
if (td) {
- struct trap *t = t_at(u.ux, u.uy);
-
+ t = t_at(u.ux, u.uy);
feeltrap(t);
- if (!Sokoban) {
+ if (!Sokoban && !(ftflags & TOOKPLUNGE)) {
if (t->ttyp == TRAPDOOR)
pline("A trap door opens up under you!");
else
if (Sokoban && Can_fall_thru(&u.uz))
; /* KMH -- You can't escape the Sokoban level traps */
else if (Levitation || u.ustuck
- || (!Can_fall_thru(&u.uz) && !levl[u.ux][u.uy].candig) || Flying
- || is_clinger(youmonst.data)
+ || (!Can_fall_thru(&u.uz) && !levl[u.ux][u.uy].candig)
+ || ((Flying || is_clinger(youmonst.data))
+ && !(ftflags & TOOKPLUNGE))
|| (Inhell && !u.uevent.invoked && newlevel == bottom)) {
dont_fall = "don't fall in.";
} else if (youmonst.data->msize >= MZ_HUGE) {
}
return;
}
+ if (Flying && (ftflags & TOOKPLUNGE) && td && t)
+ You("swoop down %s!", (t->ttyp == TRAPDOOR)
+ ? "through the trap door" : "into the gaping hole");
if (*u.ushops)
shopdig(1);
defsyms[trap_to_defsym(ttype)].explanation);
break; /* don't activate it after all */
}
- fall_through(TRUE);
+ fall_through(TRUE, (trflags & TOOKPLUNGE));
break;
case TELEP_TRAP: