Sting vs level teleport's "materialize" message

When level teleporting, Sting/Orcrish/Grimtooth would start or stop
glowing based on occupants of the new level before "you materialize
on another level".  That wasn't necessarily incorrect for the glow
stopping but was clearly wrong for it starting.  This fix uses a flag
as a hack to avoid finding and changing all the calls to docrt() and
see_monsters().  It ought to be fixed properly....
This commit is contained in:
PatR
2020-04-27 05:09:19 -07:00
parent 09f9b3598f
commit c67f1dd710
4 changed files with 30 additions and 10 deletions

View File

@@ -1295,12 +1295,19 @@ see_monsters()
if (Warn_of_mon && (g.context.warntype.obj & mon->data->mflags2) != 0L)
new_warn_obj_cnt++;
}
/*
* Make Sting glow blue or stop glowing if required.
*/
if (new_warn_obj_cnt != g.warn_obj_cnt) {
Sting_effects(new_warn_obj_cnt);
g.warn_obj_cnt = new_warn_obj_cnt;
/* message sequencing: when changing levels via level teleport,
the start-glow/stop-glow message from Sting_effects() would come
too soon so we suppress it for docrt() -> see_monsters() then
reenable it and call see_monsters() a second time */
if (!iflags.no_glow) {
/*
* Make Sting glow blue or stop glowing if required.
*/
if (new_warn_obj_cnt != g.warn_obj_cnt) {
Sting_effects(new_warn_obj_cnt);
g.warn_obj_cnt = new_warn_obj_cnt;
}
}
/* when mounted, hero's location gets caught by monster loop */

View File

@@ -1265,7 +1265,7 @@ boolean at_stairs, falling, portal;
int l_idx, save_mode;
NHFILE *nhfp;
xchar new_ledger;
boolean cant_go_back, great_effort,
boolean cant_go_back, great_effort, materializing,
up = (depth(newlevel) < depth(&u.uz)),
newdungeon = (u.uz.dnum != newlevel->dnum),
was_in_W_tower = In_W_tower(u.ux, u.uy, &u.uz),
@@ -1613,9 +1613,15 @@ boolean at_stairs, falling, portal;
else if (Is_firelevel(&u.uz))
fumaroles();
/* to control message sequencing hack for Sting_effects() */
materializing = (g.dfr_post_msg
&& !strncmpi(g.dfr_post_msg, "You materialize", 15));
/* Reset the screen. */
vision_reset(); /* reset the blockages */
g.glyphmap_perlevel_flags = 0L; /* force per-level mapglyph() changes */
if (materializing)
iflags.no_glow++; /* to suppress see_monster()'s Sting_effects() */
docrt(); /* does a full vision recalc */
flush_screen(-1);
@@ -1625,9 +1631,12 @@ boolean at_stairs, falling, portal;
/* deferred arrival message for level teleport looks odd if given
after the various messages below so give it before them */
if (g.dfr_post_msg && !strncmpi(g.dfr_post_msg, "You materialize", 15)) {
if (materializing) {
pline("%s", g.dfr_post_msg);
free((genericptr_t) g.dfr_post_msg), g.dfr_post_msg = 0;
iflags.no_glow--;
see_monsters(); /* docrt() did this but we need to repeat it */
}
/* special levels can have a custom arrival message */