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
This commit is contained in:
PatR
2021-04-18 13:29:54 -07:00
parent a70927b95f
commit 6a7bd22d64
3 changed files with 23 additions and 7 deletions

View File

@@ -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))