From edd9d5b8103e69de47037eb88e73473084f1379a Mon Sep 17 00:00:00 2001 From: nhmall Date: Mon, 16 Dec 2019 00:25:20 -0500 Subject: [PATCH] flying hero should be able to pass through a hole using '>' --- doc/fixes37.0 | 1 + include/extern.h | 2 +- src/dokick.c | 2 +- src/trap.c | 17 +++++++++++------ 4 files changed, 14 insertions(+), 8 deletions(-) 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: