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 */ }