diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 37627fafa..0ad5b6201 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -12,6 +12,7 @@ fix internal self-recover to work with recent fields added to checkpoint file improvements to pronoun usage when hallucinating function calls made from mapglyph based on dungeon level are now called once per level +flying hero could not use a hole deliberately with '>' Fixes to Pre-3.7.0 Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index a73ba5821..ed0a65cf5 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2603,7 +2603,7 @@ E boolean FDECL(burnarmor, (struct monst *)); 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, diff --git a/src/dokick.c b/src/dokick.c index 924aeccee..1260f87b6 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -1042,7 +1042,7 @@ dokick() return 1; } else if (!rn2(4)) { if (dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)) { - fall_through(FALSE); + fall_through(FALSE, 0); return 1; } else goto ouch; diff --git a/src/trap.c b/src/trap.c index ca59b2069..0639421ba 100644 --- a/src/trap.c +++ b/src/trap.c @@ -440,13 +440,15 @@ int x, y, typ; } 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 */ @@ -469,10 +471,9 @@ boolean td; /* td == TRUE : trap door or hole */ } 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 @@ -484,7 +485,8 @@ boolean td; /* td == TRUE : trap door or hole */ 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 + || (!Can_fall_thru(&u.uz) && !levl[u.ux][u.uy].candig) + || (Flying && !(ftflags & TOOKPLUNGE)) || is_clinger(g.youmonst.data) || (Inhell && !u.uevent.invoked && newlevel == bottom)) { dont_fall = "don't fall in."; @@ -503,6 +505,9 @@ boolean td; /* td == TRUE : trap door or hole */ } 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); @@ -1283,7 +1288,7 @@ unsigned trflags; 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: