From: PatR Date: Tue, 28 Jun 2022 19:37:06 +0000 (-0700) Subject: avoid becoming stunned due to level teleporting X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bb238b5ef375ea71983e32f857d13d60e5623142;p=nethack avoid becoming stunned due to level teleporting Reported by entrez: the code to have a hero become stunned for 1..3 turns when going though a level teleporter trap effectively negated teleport control (except in wizard mode which is probably why this slipped through). Make the effect happen after level_tele instead of before, change it from being stunned to being confused, and only happen if hero lacks teleport control. The association between confusion and level teleportation already exists and this might be just enough of a hint for someone who isn't aware of that yet to figure it out. (Probably just wishing thinking.) Magic portal traversal hasn't changed; it still causes brief stun. --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index f0805d252..ca4ef5a93 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -826,7 +826,8 @@ if a lit potion of oil on the floor was launched by an explosion and it hit tried to extinguish it as a light source place_object() validated coordinates after using them to index level.objects killed rope golem may drop leashes and bullwhips -using magic portals and level teleporters stuns hero for a few turns +using magic portals stuns hero for a few turns +using level teleporters confuses hero without teleport control for a few turns clear obj->bypass for buried objects [a giant on ice triggers a fire trap, inventory is subjected to burning and surviving objects have their bypass bit set, giant is killed by fire trap and drops a boulder and diff --git a/src/teleport.c b/src/teleport.c index 2ca62ab65..a92fbe72f 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -1194,10 +1194,15 @@ level_tele_trap(struct trap* trap, unsigned int trflags) You("are momentarily blinded by a flash of light."); else You("are momentarily disoriented."); - make_stunned((HStun & TIMEOUT) + 3L, FALSE); deltrap(trap); newsym(u.ux, u.uy); /* get rid of trap symbol */ level_tele(); + /* magic portal traversal causes brief Stun; for level teleport, use + confusion instead, and only when hero lacks control; do this after + processing the level teleportation attempt because being confused + can affect the outcome ("Oops" result) */ + if (!Teleport_control) + make_confused((HConfusion & TIMEOUT) + 3L, FALSE); } /* check whether monster can arrive at location via Tport (or fall) */ @@ -1575,14 +1580,8 @@ mlevel_tele_trap( if (trap) seetrap(trap); } - /* - * Commit 6a65b412 stated "Using magic portals and level teleporters - * stuns for a few turns. It's taxing to teleport long distances." - * - * In keeping with that stated intent, restrict the stunning effect. - */ - if (is_xport(tt)) - mtmp->mstun = 1; + if (is_xport(tt) && !control_teleport(mtmp->data)) + mtmp->mconf = 1; migrate_to_level(mtmp, ledger_no(&tolevel), migrate_typ, (coord *) 0); return Trap_Moved_Mon; /* no longer on this level */ }