#endif
E void FDECL(u_collide_m, (struct monst *));
E void FDECL(goto_level, (d_level *, BOOLEAN_P, BOOLEAN_P, BOOLEAN_P));
+E void NDECL(maybe_lvltport_feedback);
E void FDECL(schedule_goto, (d_level *, BOOLEAN_P, BOOLEAN_P, int,
const char *, const char *));
E void NDECL(deferred_goto);
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 */
pline("%s is %s.", bare_artifactname(uwep),
glow_verb(Blind ? 0 : g.warn_obj_cnt, TRUE));
} else if (newstr > 0 && newstr != oldstr) {
+ /* goto_level() -> docrt() -> see_monsters() -> Sting_effects();
+ if "you materialize on another level" is pending, give it
+ now so that start-glowing message comes after it */
+ maybe_lvltport_feedback(); /* usually called by goto_level() */
+
/* 'start' message */
if (!Blind)
pline("%s %s %s%c", bare_artifactname(uwep),
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;
- }
+ /*
+ * 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 */
int l_idx, save_mode;
NHFILE *nhfp;
xchar new_ledger;
- boolean cant_go_back, great_effort, materializing,
+ boolean cant_go_back, great_effort,
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),
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);
*/
/* deferred arrival message for level teleport looks odd if given
- after the various messages below so give it before them */
- 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 */
- }
+ after the various messages below, so give it before them;
+ [it might have already been delivered via docrt() -> see_monsters()
+ -> Sting_effects() -> maybe_lvltport_feedback(), in which case
+ 'dfr_post_msg' has already been reset to Null];
+ if 'dfr_post_msg' is "you materialize on another level" then
+ maybe_lvltport_feedback() will deliver it now and then free it */
+ if (g.dfr_post_msg)
+ maybe_lvltport_feedback(); /* potentially called by Sting_effects() */
/* special levels can have a custom arrival message */
deliver_splev_message();
(void) pickup(1);
}
+/* usually called from goto_level(); might be called from Sting_effects() */
+void
+maybe_lvltport_feedback()
+{
+ if (g.dfr_post_msg && !strncmpi(g.dfr_post_msg, "You materialize", 15)) {
+ /* "You materialize on a different level." */
+ pline("%s", g.dfr_post_msg);
+ free((genericptr_t) g.dfr_post_msg), g.dfr_post_msg = 0;
+ }
+}
+
static void
final_level()
{