From 053880c149858fafd4016e786ae576284dec0f5f Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 30 Sep 2018 16:37:32 -0700 Subject: [PATCH] untrap downwards while over trap Force trap to activate during failed untrap attempt if done while already at the trap's location, to match the recent change in behavior when failed attempt occurs while adjacent to the trap. Most noticeable while flying over bear traps, but affects all failed untrap attempts. --- include/hack.h | 1 + src/hack.c | 2 +- src/trap.c | 8 +++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/hack.h b/include/hack.h index 555a08818..5785b8590 100644 --- a/include/hack.h +++ b/include/hack.h @@ -333,6 +333,7 @@ typedef struct sortloot_item Loot; #define RECURSIVETRAP 0x08 /* trap changed into another type this same turn */ #define TOOKPLUNGE 0x10 /* used '>' to enter pit below you */ #define VIASITTING 0x20 /* #sit while at trap location (affects message) */ +#define FAILEDUNTRAP 0x40 /* trap activated by failed untrap attempt */ /* Flags to control test_move in hack.c */ #define DO_MOVE 0 /* really doing the move */ diff --git a/src/hack.c b/src/hack.c index 44351f4d7..29261a968 100644 --- a/src/hack.c +++ b/src/hack.c @@ -2058,7 +2058,7 @@ boolean pick; struct monst *mtmp; struct trap *trap = t_at(u.ux, u.uy); - int trapflag = iflags.failing_untrap ? FORCETRAP : 0; + int trapflag = iflags.failing_untrap ? FAILEDUNTRAP : 0; /* prevent recursion from affecting the hero all over again [hero poly'd to iron golem enters water here, drown() inflicts diff --git a/src/trap.c b/src/trap.c index 85d8c1a2e..957e0f63c 100644 --- a/src/trap.c +++ b/src/trap.c @@ -894,7 +894,8 @@ unsigned trflags; register int ttype = trap->ttyp; struct obj *otmp; boolean already_seen = trap->tseen, - forcetrap = (trflags & FORCETRAP) != 0, + forcetrap = ((trflags & FORCETRAP) != 0 + || (trflags & FAILEDUNTRAP) != 0), webmsgok = (trflags & NOWEBMSG) == 0, forcebungle = (trflags & FORCEBUNGLE) != 0, plunged = (trflags & TOOKPLUNGE) != 0, @@ -3989,7 +3990,7 @@ struct trap *ttmp; there are objects covering this trap */ ttmp->tseen = 0; /* hack for check_here() */ /* trigger the trap */ - iflags.failing_untrap++; /* spoteffects() -> dotrap(,FORCETRAP) */ + iflags.failing_untrap++; /* spoteffects() -> dotrap(,FAILEDUNTRAP) */ spoteffects(TRUE); /* pickup() + dotrap() */ iflags.failing_untrap--; /* this should no longer be necessary; before the failing_untrap @@ -4074,7 +4075,8 @@ boolean force_failure; pline("%s remains entangled.", Monnam(mtmp)); } } else if (under_u) { - dotrap(ttmp, 0); + /* [don't need the iflags.failing_untrap hack here] */ + dotrap(ttmp, FAILEDUNTRAP); } else { move_into_trap(ttmp); } -- 2.40.0