monsters in regions vs #terrain

While trying to track down a display problem with regions
    [when a monster is shown over a region because the hero is
    adjacent, it doesn't revert to the region's cloud glyph when
    hero moves farther away; that's not resolved yet],
I discovered a different display problem for the same thing.  If
you pick a #terrain choice that keeps traps it is supposed to show
region spots too, but that didn't work when there was a monster at
the same spot.  It removed the monster but showed background there.
This commit is contained in:
PatR
2024-08-10 16:24:51 -07:00
parent 3436fbc87e
commit 3ed2110757
2 changed files with 21 additions and 10 deletions

View File

@@ -2005,6 +2005,9 @@ if peaceful monsters react when seeing hero attack a peaceful monster, don't
farlook of water/lava location listed wall of lava before molten lava; because
of that, lava was omitted ("molten" suppressed to reduce vebosity,
resulting in "lava" which got skipped as substring of "wall of lava")
having #terrain display gas cloud regions as if they were traps didn't work
for monsters in such regions that are shown when adjacent to hero or
sensed via ESP
Fixes to 3.7.0-x Platform and/or Interface Problems Exposed Via git Repository

View File

@@ -2042,8 +2042,6 @@ reveal_terrain_getglyph(
keep_objs = (which_subset & TER_OBJ) != 0,
keep_mons = (which_subset & TER_MON) != 0,
full = (which_subset & TER_FULL) != 0;
int cmaptmp = 0; /* used by glyph_is_gascloud() macro */
NhRegion *reg = visible_region_at(x, y);
/* for 'full', show the actual terrain for the entire level,
otherwise what the hero remembers for seen locations with
@@ -2055,6 +2053,10 @@ reveal_terrain_getglyph(
glyph = back_to_glyph(x, y);
levl[x][y].seenv = seenv;
} else {
int cmaptmp = 0; /* used by glyph_is_gascloud() macro */
NhRegion *reg = visible_region_at(x, y);
boolean was_mon = FALSE;
levl_glyph = svl.level.flags.hero_memory ? levl[x][y].glyph
: seenv ? back_to_glyph(x, y)
: default_glyph;
@@ -2064,12 +2066,14 @@ reveal_terrain_getglyph(
the invisible monster glyph, which is handled like
an object, replacing any object or trap at its spot) */
glyph = !swallowed ? glyph_at(x, y) : levl_glyph;
if (keep_mons && u_at(x, y) && swallowed)
if (keep_mons && u_at(x, y) && swallowed) {
glyph = mon_to_glyph(u.ustuck, rn2_on_display_rng);
else if ((!keep_mons && (glyph_is_monster(glyph)
} else if ((!keep_mons && (glyph_is_monster(glyph)
|| glyph_is_warning(glyph)))
|| glyph_is_swallow(glyph))
|| glyph_is_swallow(glyph)) {
glyph = levl_glyph;
was_mon = TRUE;
}
if (((!keep_objs && glyph_is_object(glyph))
|| glyph_is_invisible(glyph))
&& keep_traps && !covers_traps(x, y)) {
@@ -2081,6 +2085,7 @@ reveal_terrain_getglyph(
are present at the same spot) or neither traps nor regions */
|| (!keep_traps && (glyph_is_trap(glyph)
|| (reg && glyph_is_gascloud(glyph))))
|| (reg && was_mon)
|| glyph_is_invisible(glyph)) {
if (!seenv) {
/* it's possible to have a visible region shown at an
@@ -2089,15 +2094,18 @@ reveal_terrain_getglyph(
far enough to be adjacent to the cloud without having
seen the corridor underneath it) */
glyph = !reg ? default_glyph : GLYPH_UNEXPLORED;
} else if (svl.lastseentyp[x][y] == levl[x][y].typ) {
glyph = back_to_glyph(x, y);
} else if (keep_traps && reg && glyph_is_gascloud(glyph)) {
} else if (keep_traps && reg
&& (glyph_is_gascloud(glyph) || was_mon)) {
t = t_at(x, y);
glyph = (t && t->tseen) ? trap_to_glyph(t)
: back_to_glyph(x, y);
/* we need reg->glyph here when there's a monster shown
at a region spot; the region glyph isn't the remembered
background glyph or the current glyph */
glyph = (t && t->tseen) ? trap_to_glyph(t) : reg->glyph;
/* FIXME? what about objects temporarily hidden by regions?
when objects are being shown, shouldn't showing them take
precedence over showing the region, just like traps? */
} else if (svl.lastseentyp[x][y] == levl[x][y].typ) {
glyph = back_to_glyph(x, y);
} else {
/* look for a mimic here posing as furniture;
if we don't find one, we'll have to fake it */