diff --git a/include/decl.h b/include/decl.h index 128413aaa..52145808e 100644 --- a/include/decl.h +++ b/include/decl.h @@ -406,6 +406,8 @@ struct plinemsg_type { #define MSGTYP_NOREP 1 #define MSGTYP_NOSHOW 2 #define MSGTYP_STOP 3 +/* bitmask for callers of hide_unhide_msgtypes() */ +#define MSGTYP_MASK_REP_SHOW ((1 << MSGTYP_NOREP) | (1 << MSGTYP_NOSHOW)) E struct plinemsg_type *plinemsg_types; diff --git a/include/extern.h b/include/extern.h index 661475c1b..dd104cf70 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1641,8 +1641,8 @@ E int NDECL(dotogglepickup); E void NDECL(option_help); E void FDECL(next_opt, (winid, const char *)); E int FDECL(fruitadd, (char *, struct fruit *)); -E int FDECL(choose_classes_menu, - (const char *, int, BOOLEAN_P, char *, char *)); +E int FDECL(choose_classes_menu, (const char *, int, BOOLEAN_P, + char *, char *)); E void FDECL(add_menu_cmd_alias, (CHAR_P, CHAR_P)); E char FDECL(map_menu_cmd, (CHAR_P)); E void FDECL(assign_warnings, (uchar *)); @@ -1666,6 +1666,7 @@ E boolean FDECL(get_menu_coloring, (char *, int *, int *)); E void NDECL(free_menu_coloring); E boolean FDECL(msgtype_parse_add, (char *)); E int FDECL(msgtype_type, (const char *, BOOLEAN_P)); +E void FDECL(hide_unhide_msgtypes, (BOOLEAN_P, int)); E void NDECL(msgtype_free); /* ### pager.c ### */ diff --git a/include/flag.h b/include/flag.h index 6482c7198..af3b59b65 100644 --- a/include/flag.h +++ b/include/flag.h @@ -363,13 +363,18 @@ extern NEARDATA struct sysflag sysflags; extern NEARDATA struct instance_flags iflags; /* last_msg values */ -#define PLNMSG_NOSHO_OVERRIDE (-2) -#define PLNMSG_NOREP_OVERRIDE (-1) #define PLNMSG_UNKNOWN 0 /* arbitrary */ #define PLNMSG_ONE_ITEM_HERE 1 /* "you see here" */ #define PLNMSG_TOWER_OF_FLAME 2 /* scroll of fire */ #define PLNMSG_CAUGHT_IN_EXPLOSION 3 /* explode() feedback */ #define PLNMSG_OBJ_GLOWS 4 /* "the glows " */ + /* Usage: + * pline("some message"); + * pline: vsprintf + putstr + iflags.last_msg = PLNMSG_UNKNOWN; + * iflags.last_msg = PLNMSG_some_message; + * and subsequent code can adjust the next message if it is affected + * by some_message. The next message will clear iflags.last_msg. + */ /* runmode options */ #define RUN_TPORT 0 /* don't update display until movement stops */ diff --git a/src/invent.c b/src/invent.c index dc740c4b1..f230c32c0 100644 --- a/src/invent.c +++ b/src/invent.c @@ -2830,8 +2830,16 @@ boolean picked_some; int dolook() { - iflags.last_msg = PLNMSG_NOREP_OVERRIDE; - return look_here(0, FALSE); + int res; + + /* don't let + MSGTYPE={norep,noshow} "You see here" + interfere with feedback from the look-here command */ + hide_unhide_msgtypes(TRUE, MSGTYP_MASK_REP_SHOW); + res = look_here(0, FALSE); + /* restore normal msgtype handling */ + hide_unhide_msgtypes(FALSE, MSGTYP_MASK_REP_SHOW); + return res; } boolean diff --git a/src/options.c b/src/options.c index 5eb02a768..6c135d330 100644 --- a/src/options.c +++ b/src/options.c @@ -1500,6 +1500,8 @@ boolean norepeat; /* called from Norep(via pline) */ struct plinemsg_type *tmp = plinemsg_types; while (tmp) { + /* we don't exclude entries with negative msgtype values + because then the msg might end up matching a later pattern */ if (regex_match(msg, tmp->regex)) return tmp->msgtype; tmp = tmp->next; @@ -1507,6 +1509,26 @@ boolean norepeat; /* called from Norep(via pline) */ return norepeat ? MSGTYP_NOREP : MSGTYP_NORMAL; } +/* negate one or more types of messages so that their type handling will + be disabled or re-enabled; MSGTYPE_NORMAL (value 0) is not affected */ +void +hide_unhide_msgtypes(hide, hide_mask) +boolean hide; +int hide_mask; +{ + struct plinemsg_type *tmp; + int mt; + + /* negative msgtype value won't be recognized by pline, so does nothing */ + for (tmp = plinemsg_types; tmp; tmp = tmp->next) { + mt = tmp->msgtype; + if (!hide) + mt = -mt; /* unhide: negate negative, yielding positive */ + if (mt > 0 && ((1 << mt) & hide_mask)) + tmp->msgtype = -tmp->msgtype; + } +} + int msgtype_count() { diff --git a/src/pline.c b/src/pline.c index 86ac55a12..141532cad 100644 --- a/src/pline.c +++ b/src/pline.c @@ -87,26 +87,9 @@ VA_DECL(const char *, line) return; } - /* - * Normally the sequence is - * caller: pline("some message"); - * pline: vsprintf + putstr + iflags.last_msg = PLNMSG_UNKNOWN; - * caller: iflags.last_msg = PLNMSG_some_message; - * and subsequent code can adjust the next message if it is - * affected by some_message. - * - * But some callers can use last_msg to control handling of next - * message - * caller: iflags.last_msg = PLNMSG_NOREP_OVERRIDE; - * caller: pline("another message"); - * to force another_message to be delivered even if is a repeat - * and user's MSGTYPE settings have classified it as don't-repeat. - */ - msgtyp = msgtype_type(line, no_repeat); - if ((msgtyp == MSGTYP_NOSHOW && iflags.last_msg != PLNMSG_NOSHO_OVERRIDE) - || (msgtyp == MSGTYP_NOREP && iflags.last_msg != PLNMSG_NOREP_OVERRIDE - && !strcmp(line, prevmsg))) + if (msgtyp == MSGTYP_NOSHOW + || (msgtyp == MSGTYP_NOREP && !strcmp(line, prevmsg))) return; if (vision_full_recalc) vision_recalc(0);