From: PatR Date: Tue, 19 Jan 2016 15:13:18 +0000 (-0800) Subject: fix #H4028 - ':' sometimes doesn't work X-Git-Tag: NetHack-3.6.1_RC01~1000 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0544b998deafd6b2a1401a38e9c1536c624f8829;p=nethack fix #H4028 - ':' sometimes doesn't work User had MSGTTYPE=norep "You see here" and complained that once the message had been given while walking over an object, using ':' to intentionally look at something would end up doing nothing if its feedback was a repeat of "You see here". Trying to classify which actions should deliberately override no-repeat (or no-show) will be an ordeal. This fixes the case for the ':' command where the user obviously expects feedback. I think it could be done better but am settling for something quick and easy. --- diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 78b94aeb9..a719cdd0e 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -119,6 +119,7 @@ make hurtling out of water bubble on the Plane of Water handle entering water fix floor descriptions on the Planes when levitating fix warning glyph description when monster symbol coincided the warning symbol allow the same color names for status hilites and menucolors +override MSGTYPE=norep while executing the ':' command Platform- and/or Interface-Specific Fixes diff --git a/include/flag.h b/include/flag.h index b53bad4ad..6482c7198 100644 --- a/include/flag.h +++ b/include/flag.h @@ -363,11 +363,13 @@ extern NEARDATA struct sysflag sysflags; extern NEARDATA struct instance_flags iflags; /* last_msg values */ -#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_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 " */ +#define PLNMSG_OBJ_GLOWS 4 /* "the glows " */ /* runmode options */ #define RUN_TPORT 0 /* don't update display until movement stops */ diff --git a/src/invent.c b/src/invent.c index 6a2a910bd..dc740c4b1 100644 --- a/src/invent.c +++ b/src/invent.c @@ -2686,6 +2686,7 @@ boolean picked_some; skip_objects = (flags.pile_limit > 0 && obj_cnt >= flags.pile_limit); if (u.uswallow && u.ustuck) { struct monst *mtmp = u.ustuck; + Sprintf(fbuf, "Contents of %s %s", s_suffix(mon_nam(mtmp)), mbodypart(mtmp, STOMACH)); /* Skip "Contents of " by using fbuf index 12 */ @@ -2829,6 +2830,7 @@ boolean picked_some; int dolook() { + iflags.last_msg = PLNMSG_NOREP_OVERRIDE; return look_here(0, FALSE); } diff --git a/src/pline.c b/src/pline.c index 141532cad..86ac55a12 100644 --- a/src/pline.c +++ b/src/pline.c @@ -87,9 +87,26 @@ 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 - || (msgtyp == MSGTYP_NOREP && !strcmp(line, prevmsg))) + if ((msgtyp == MSGTYP_NOSHOW && iflags.last_msg != PLNMSG_NOSHO_OVERRIDE) + || (msgtyp == MSGTYP_NOREP && iflags.last_msg != PLNMSG_NOREP_OVERRIDE + && !strcmp(line, prevmsg))) return; if (vision_full_recalc) vision_recalc(0);