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.
This commit is contained in:
PatR
2016-01-19 07:13:18 -08:00
parent ea35773192
commit 0544b998de
4 changed files with 28 additions and 6 deletions

View File

@@ -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

View File

@@ -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 <single item> 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 <single item> here" */
#define PLNMSG_TOWER_OF_FLAME 2 /* scroll of fire */
#define PLNMSG_CAUGHT_IN_EXPLOSION 3 /* explode() feedback */
#define PLNMSG_OBJ_GLOWS 4 /* "the <obj> glows <color>" */
#define PLNMSG_OBJ_GLOWS 4 /* "the <obj> glows <color>" */
/* runmode options */
#define RUN_TPORT 0 /* don't update display until movement stops */

View File

@@ -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);
}

View File

@@ -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);