overriding message suppression, revisited
This is more robust than the previous hack. The issue of whether to use it in other places is still unexplored. Ultimately it's the user's fault if overzealous message suppression hides something important. [For an eerie game, try 'MSGTYPE=hide .'.]
This commit is contained in:
12
src/invent.c
12
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
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
21
src/pline.c
21
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);
|
||||
|
||||
Reference in New Issue
Block a user