diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 03ea3956a..c8260d6b8 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -192,11 +192,14 @@ data.base lookup of an entry with any blank lines would falsely claim that using nhl_error() to report a Lua processing problem would clobber the stack level teleporation's "You materialize on a different level!" could be given out of sequence with other arrival messages -creating Mine Town variant 1 (Orcish Town) sometimes complained about being - unable to place lregion type 1 and failed to have any staircase up +more sequencing: if wielding Sting or similar and level teleporting to a + level with different warning effect, the start-glowing or stop-glowing + message came before the materialize message on the destination level prevent "you materialize on a different level" after "a mysterious force prevents you from descending" if you try to level teleport past the stairs down from the quest home level before being granted access +creating Mine Town variant 1 (Orcish Town) sometimes complained about being + unable to place lregion type 1 and failed to have any staircase up set g.context.botl for glove and wielding actions that could start or end bare-handedness in support of condtests[bl_bareh] reinstate ranked ordering of the status condition fields diff --git a/include/flag.h b/include/flag.h index 5ba296d46..92def843e 100644 --- a/include/flag.h +++ b/include/flag.h @@ -219,6 +219,7 @@ struct instance_flags { int failing_untrap; /* move_into_trap() -> spoteffects() -> dotrap() */ int in_lava_effects; /* hack for Boots_off() */ int last_msg; /* indicator of last message player saw */ + int no_glow; /* controls see_monster()'s Sting_effects() */ int override_ID; /* true to force full identification of objects */ int parse_config_file_src; /* hack for parse_config_line() */ int purge_monsters; /* # of dead monsters still on fmon list */ diff --git a/src/display.c b/src/display.c index 63e48f43a..1cafeb90c 100644 --- a/src/display.c +++ b/src/display.c @@ -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 */ diff --git a/src/do.c b/src/do.c index 5db6ee5d9..d1d966817 100644 --- a/src/do.c +++ b/src/do.c @@ -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 */