fix obscure secret corridor bug

magic_map_background() would overwrite remembered objects and traps.
That meant discovery of secret corridors by secret door detection
or ^E would forget embedded objects at their locations.
This commit is contained in:
PatR
2024-08-26 14:37:46 -07:00
parent 83b85d4be9
commit a5700805c6
2 changed files with 10 additions and 3 deletions
+4
View File
@@ -1460,6 +1460,10 @@ region expiration could report "the gas cloud around you dissipates" and also
"you see a gas cloud dissipate" for the same cloud spot "you see a gas cloud dissipate" for the same cloud spot
reduce shopkeeper's innate speed from 18 to 16 so that a hasted shopkeeper reduce shopkeeper's innate speed from 18 to 16 so that a hasted shopkeeper
doesn't always get 2 moves per turn doesn't always get 2 moves per turn
when a secret corridor was discovered by wand of secret door detection or by
wizard mode ^E and converted into a regular corridor, if there was a
formerly embbered object at the spot, presence of the object would be
forgotten unless within range of a light source
Fixes to 3.7.0-x General Problems Exposed Via git Repository Fixes to 3.7.0-x General Problems Exposed Via git Repository
+6 -3
View File
@@ -248,7 +248,7 @@ magic_map_background(coordxy x, coordxy y, int show)
else if (lev->typ == CORR && glyph == cmap_to_glyph(S_litcorr)) else if (lev->typ == CORR && glyph == cmap_to_glyph(S_litcorr))
glyph = cmap_to_glyph(S_corr); glyph = cmap_to_glyph(S_corr);
} }
if (svl.level.flags.hero_memory) if (svl.level.flags.hero_memory && glyph_is_cmap(lev->glyph))
lev->glyph = glyph; lev->glyph = glyph;
if (show) if (show)
show_glyph(x, y, glyph); show_glyph(x, y, glyph);
@@ -1120,6 +1120,8 @@ tether_glyph(coordxy x, coordxy y)
* *
* DISP_BEAM - Display the given glyph at each location, but do not erase * DISP_BEAM - Display the given glyph at each location, but do not erase
* any until the close call. * any until the close call.
* DISP_ALL - Same as DISP_BEAM except glyph is shown at the specified
* spot even when that spot can't be seen.
* DISP_TETHER - Display a tether glyph at each location, and the tethered * DISP_TETHER - Display a tether glyph at each location, and the tethered
* object at the farthest location, but do not erase any * object at the farthest location, but do not erase any
* until the return trip or close. * until the return trip or close.
@@ -1277,7 +1279,7 @@ flash_glyph_at(coordxy x, coordxy y, int tg, int rpt)
rpt *= 2; /* two loop iterations per 'count' */ rpt *= 2; /* two loop iterations per 'count' */
glyph[0] = tg; glyph[0] = tg;
glyph[1] = (svl.level.flags.hero_memory) ? levl[x][y].glyph glyph[1] = (svl.level.flags.hero_memory) ? levl[x][y].glyph
: back_to_glyph(x, y); : back_to_glyph(x, y);
/* even iteration count (guaranteed) ends with glyph[1] showing; /* even iteration count (guaranteed) ends with glyph[1] showing;
caller might want to override that, but no newsym() calls here caller might want to override that, but no newsym() calls here
in case caller has tinkered with location visibility */ in case caller has tinkered with location visibility */
@@ -1974,13 +1976,14 @@ show_glyph(coordxy x, coordxy y, int glyph)
&& !program_state.in_getlev && !program_state.in_getlev
&& (oldglyph != glyph || gg.gbuf[y][x].gnew)) { && (oldglyph != glyph || gg.gbuf[y][x].gnew)) {
int c = glyph_to_cmap(glyph); int c = glyph_to_cmap(glyph);
if ((glyph_is_nothing(oldglyph) || glyph_is_unexplored(oldglyph) if ((glyph_is_nothing(oldglyph) || glyph_is_unexplored(oldglyph)
|| is_cmap_furniture(c)) || is_cmap_furniture(c))
&& !is_cmap_wall(c) && !is_cmap_room(c)) { && !is_cmap_wall(c) && !is_cmap_room(c)) {
if ((a11y.mon_notices && glyph_is_monster(glyph)) if ((a11y.mon_notices && glyph_is_monster(glyph))
|| (glyph_is_monster(oldglyph)) || (glyph_is_monster(oldglyph))
|| u_at(x, y)) { || u_at(x, y)) {
/* nothing */ ; /* nothing */
} else { } else {
show_glyph_change = TRUE; show_glyph_change = TRUE;
} }