From: PatR Date: Sun, 18 Apr 2021 20:29:54 +0000 (-0700) Subject: fix github issue #486 - feedback while engulfed X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a7bd22d648a890ea8262e53919568c23b4f0998;p=nethack fix github issue #486 - feedback while engulfed Issue is about monster shape changes being sensed via telepathy while hero is swallowed, so player gets told about things that aren't being shown on the map. Similar situation while underwater; only monsters in adjacent water spots are shown on the screen, but messages about sensed monsters will continue to be given. It isn't limited to shape changing; lots of places include telepathy, extended monster detection, and warning against specific types of creatures as criteria to decide whether the hero 'sees' something that isn't directly visible happen. Change sensemon() to behave as if being swallowed or underwater blocks telepathy, extended monster detection, and warning. I consider this to be experimental, but it needs much wider testing than would take place if put into its own test branch. It can be tweaked or reversed if that turns out to be necessary. There should be no change in behavior when not swallowed and not underwater. But for either of those two situations, some messages that have been getting delivered may be different (such as using "it" instead of sensed monster's name) or suppressed. Fixes #486 --- diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 8cbba5056..bf067b452 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -465,6 +465,10 @@ contents of chests, large boxes, and ice boxes are now immune to water damage chests+large boxes were always immune and ice boxes always vulnerable) applying an empty brass lantern in an attempt to light it reported "your lamp has run out of power"; change to "your lantern is out of power" +when swallowed or underwater, player could be told about events (such as a + shapechanger taking on a new form) that the hero sensed but which + were not shown on the screen; treat being swallowed or underwater as + situations which block telepathy, extended monster detection, warning Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/display.h b/include/display.h index e3fa0d816..a32469c89 100644 --- a/include/display.h +++ b/include/display.h @@ -38,6 +38,11 @@ enum explosion_types { * * Returns true if the hero can sense the given monster. This includes * monsters that are hiding or mimicing other monsters. + * + * [3.7] Note: the map doesn't display any monsters when hero is swallowed + * (or display non-adjacent, non-submerged ones when hero is underwater), + * so treat those situations as blocking telepathy, detection, and warning + * even though conceptually they shouldn't do so. */ #define tp_sensemon(mon) \ (/* The hero can always sense a monster IF: */ \ @@ -49,15 +54,19 @@ enum explosion_types { /* object and in range */ \ || (Unblind_telepat \ && (distu(mon->mx, mon->my) <= (BOLT_LIM * BOLT_LIM))))) - +/* organized to perform cheaper tests first; + is_pool() vs is_pool_or_lava(): hero who is underwater can see adjacent + lava, but presumeably any monster there is on top so not sensed */ #define sensemon(mon) \ - (tp_sensemon(mon) || Detect_monsters || MATCH_WARN_OF_MON(mon)) + ( (!u.uswallow || (mon) == u.ustuck) \ + && (!Underwater || (distu((mon)->mx, (mon)->my) <= 2 \ + && is_pool((mon)->mx, (mon)->my))) \ + && (Detect_monsters || tp_sensemon(mon) || MATCH_WARN_OF_MON(mon)) ) /* * mon_warning() is used to warn of any dangerous monsters in your * vicinity, and a glyph representing the warning level is displayed. */ - #define mon_warning(mon) \ (Warning && !(mon)->mpeaceful && (distu((mon)->mx, (mon)->my) < 100) \ && (((int) ((mon)->m_lev / 4)) >= g.context.warnlevel)) diff --git a/src/potion.c b/src/potion.c index 22c21c060..516f4d9bd 100644 --- a/src/potion.c +++ b/src/potion.c @@ -826,10 +826,13 @@ peffects(struct obj *otmp) g.potion_unkn = 0; } } - see_monsters(); - if (g.potion_unkn) - You_feel("lonely."); - break; + /* if swallowed or underwater, fall through to uncursed case */ + if (!u.uswallow && !Underwater) { + see_monsters(); + if (g.potion_unkn) + You_feel("lonely."); + break; + } } if (monster_detect(otmp, 0)) return 1; /* nothing detected */