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