]> granicus.if.org Git - nethack/commitdiff
Sting vs level teleport's "materialize" message
authorPatR <rankin@nethack.org>
Mon, 27 Apr 2020 12:09:19 +0000 (05:09 -0700)
committerPatR <rankin@nethack.org>
Mon, 27 Apr 2020 12:09:19 +0000 (05:09 -0700)
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....

doc/fixes37.0
include/flag.h
src/display.c
src/do.c

index 03ea3956a7599ee68b500bd836989515d67a4369..c8260d6b859ebf10797379cc15d8263914bcb9a1 100644 (file)
@@ -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
index 5ba296d469afef8a687433716b4324e5e30383f7..92def843e913d85d0290a1f072dcd65afb930dfb 100644 (file)
@@ -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 */
index 63e48f43a1feb625cddd29f79c3783fea3ac47f5..1cafeb90c9f16b46a5ac9db5f0d0aed6b5a2744d 100644 (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 */
index 5db6ee5d9e05ca2c9d62bf8a64405be847dcc019..d1d966817c68196416880f4a976e43c40ff99aa3 100644 (file)
--- 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 */