talking walls

Add the "if these walls could talk" gag.  Use an array of message
strings rather than switch/cases of pline calls, and add a couple
more messages.

Also, only give wall feedback if the map indicates a wall (so not
while blind unless the wall is already known) and prevent chat from
pinpointing secret doors (via lack of wall feedback when they're
shown as walls).
This commit is contained in:
PatR
2020-07-01 18:01:30 -07:00
parent 3a94f0a9f8
commit 926a0ca446
2 changed files with 42 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.236 $ $NHDT-Date: 1593614134 2020/07/01 14:35:34 $
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.237 $ $NHDT-Date: 1593651682 2020/07/02 01:01:22 $
General Fixes and Modified Features
-----------------------------------
@@ -380,6 +380,7 @@ make camera flash which reveals previously unseen map features or objects or
boolean options can optionally have the form "name:value" with value taken
from among "true", "yes", "on", or "false", "no", "off"
record number of wishes and artifact wishes in xlogfile
give feedback for '#chat' directed at walls
Platform- and/or Interface-Specific New Features

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 sounds.c $NHDT-Date: 1590263455 2020/05/23 19:50:55 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.97 $ */
/* NetHack 3.6 sounds.c $NHDT-Date: 1593651682 2020/07/02 01:01:22 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.98 $ */
/* Copyright (c) 1989 Janet Walz, Mike Threepoint */
/* NetHack may be freely redistributed. See license for details. */
@@ -1090,18 +1090,48 @@ dochat()
mtmp = m_at(tx, ty);
if ((!mtmp || mtmp->mundetected)
&& (otmp = vobj_at(tx, ty)) != 0 && otmp->otyp == STATUE) {
/* Talking to a statue */
if (!Blind) {
pline_The("%s seems not to notice you.",
/* if hallucinating, you can't tell it's a statue */
Hallucination ? rndmonnam((char *) 0) : "statue");
if (!mtmp || mtmp->mundetected) {
if ((otmp = vobj_at(tx, ty)) != 0 && otmp->otyp == STATUE) {
/* Talking to a statue */
if (!Blind)
pline_The("%s seems not to notice you.",
/* if hallucinating, you can't tell it's a statue */
Hallucination ? rndmonnam((char *) 0) : "statue");
return 0;
}
if (IS_WALL(levl[tx][ty].typ) || levl[tx][ty].typ == SDOOR) {
/* Talking to a wall; secret door remains hidden by behaving
like a wall; IS_WALL() test excludes solid rock even when
that serves as a wall bordering a corridor */
if (Blind && !IS_WALL(g.lastseentyp[tx][ty])) {
/* when blind, you can only talk to a wall if it has
already been mapped as a wall */
;
} else if (!Hallucination) {
pline("It's like talking to a wall.");
} else {
static const char *const walltalk[] = {
"gripes about its job.",
"tells you a funny joke!",
"insults your heritage!",
"chuckles.",
"guffaws merrily!",
"deprecates your exploration efforts.",
"suggests a stint of rehab...",
"doesn't seem to be interested.",
};
int idx = rn2(10);
if (idx >= SIZE(walltalk))
idx = SIZE(walltalk) - 1;
pline_The("wall %s", walltalk[idx]);
}
return 0;
}
return 0;
}
if (!mtmp || mtmp->mundetected || M_AP_TYPE(mtmp) == M_AP_FURNITURE
if (!mtmp || mtmp->mundetected
|| M_AP_TYPE(mtmp) == M_AP_FURNITURE
|| M_AP_TYPE(mtmp) == M_AP_OBJECT)
return 0;