From: PatR Date: Mon, 27 Apr 2020 12:09:19 +0000 (-0700) Subject: Sting vs level teleport's "materialize" message X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c67f1dd71044b7d0ec98a6e4645b1c20915467f0;p=nethack 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.... --- 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 */