flying hero should be able to pass through a hole using '>'

This commit is contained in:
nhmall
2019-12-16 00:25:20 -05:00
parent 05df5dfbf2
commit 90e4ffc0a0
3 changed files with 14 additions and 9 deletions

View File

@@ -2508,7 +2508,7 @@ E boolean FDECL(burnarmor, (struct monst *));
E int FDECL(erode_obj, (struct obj *, const char *, int, int)); E int FDECL(erode_obj, (struct obj *, const char *, int, int));
E boolean FDECL(grease_protect, (struct obj *, const char *, struct monst *)); E boolean FDECL(grease_protect, (struct obj *, const char *, struct monst *));
E struct trap *FDECL(maketrap, (int, int, int)); 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, E struct monst *FDECL(animate_statue,
(struct obj *, XCHAR_P, XCHAR_P, int, int *)); (struct obj *, XCHAR_P, XCHAR_P, int, int *));
E struct monst *FDECL(activate_statue_trap, E struct monst *FDECL(activate_statue_trap,

View File

@@ -1047,7 +1047,7 @@ dokick()
return 1; return 1;
} else if (!rn2(4)) { } else if (!rn2(4)) {
if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) { if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) {
fall_through(FALSE); fall_through(FALSE, 0);
return 1; return 1;
} else } else
goto ouch; goto ouch;

View File

@@ -443,13 +443,15 @@ int x, y, typ;
} }
void void
fall_through(td) fall_through(td, ftflags)
boolean td; /* td == TRUE : trap door or hole */ boolean td; /* td == TRUE : trap door or hole */
unsigned ftflags;
{ {
d_level dtmp; d_level dtmp;
char msgbuf[BUFSZ]; char msgbuf[BUFSZ];
const char *dont_fall = 0; const char *dont_fall = 0;
int newlevel, bottom; int newlevel, bottom;
struct trap *t = (struct trap *) 0;
/* we'll fall even while levitating in Sokoban; otherwise, if we /* 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 */ won't fall and won't be told that we aren't falling, give up now */
@@ -472,10 +474,9 @@ boolean td; /* td == TRUE : trap door or hole */
} while (!rn2(4) && newlevel < bottom); } while (!rn2(4) && newlevel < bottom);
if (td) { if (td) {
struct trap *t = t_at(u.ux, u.uy); t = t_at(u.ux, u.uy);
feeltrap(t); feeltrap(t);
if (!Sokoban) { if (!Sokoban && !(ftflags & TOOKPLUNGE)) {
if (t->ttyp == TRAPDOOR) if (t->ttyp == TRAPDOOR)
pline("A trap door opens up under you!"); pline("A trap door opens up under you!");
else else
@@ -487,8 +488,9 @@ boolean td; /* td == TRUE : trap door or hole */
if (Sokoban && Can_fall_thru(&u.uz)) if (Sokoban && Can_fall_thru(&u.uz))
; /* KMH -- You can't escape the Sokoban level traps */ ; /* KMH -- You can't escape the Sokoban level traps */
else if (Levitation || u.ustuck else if (Levitation || u.ustuck
|| (!Can_fall_thru(&u.uz) && !levl[u.ux][u.uy].candig) || Flying || (!Can_fall_thru(&u.uz) && !levl[u.ux][u.uy].candig)
|| is_clinger(youmonst.data) || ((Flying || is_clinger(youmonst.data))
&& !(ftflags & TOOKPLUNGE))
|| (Inhell && !u.uevent.invoked && newlevel == bottom)) { || (Inhell && !u.uevent.invoked && newlevel == bottom)) {
dont_fall = "don't fall in."; dont_fall = "don't fall in.";
} else if (youmonst.data->msize >= MZ_HUGE) { } else if (youmonst.data->msize >= MZ_HUGE) {
@@ -506,6 +508,9 @@ boolean td; /* td == TRUE : trap door or hole */
} }
return; 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) if (*u.ushops)
shopdig(1); shopdig(1);
@@ -1286,7 +1291,7 @@ unsigned trflags;
defsyms[trap_to_defsym(ttype)].explanation); defsyms[trap_to_defsym(ttype)].explanation);
break; /* don't activate it after all */ break; /* don't activate it after all */
} }
fall_through(TRUE); fall_through(TRUE, (trflags & TOOKPLUNGE));
break; break;
case TELEP_TRAP: case TELEP_TRAP: