slightly better shop repair feedback

During shop repair, give a message about the shopkeeper using a spell
(if hero is close enough) before "Suddenly, <various repairs occur>."
And when shop repair is for a single untrap of landmine or bear trap
adjacent to shk (and the hero can see it happen), say "<Shk> untraps
<trap>" rather than just "Suddenly, a trap is removed from the floor!"
This commit is contained in:
PatR
2019-04-13 17:28:26 -07:00
parent 5534eab514
commit 0776a864f1
4 changed files with 56 additions and 20 deletions
+2 -1
View File
@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.302 $ $NHDT-Date: 1555196229 2019/04/13 22:57:09 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.303 $ $NHDT-Date: 1555201701 2019/04/14 00:28:21 $
This fixes36.2 file is here to capture information about updates in the 3.6.x This fixes36.2 file is here to capture information about updates in the 3.6.x
lineage following the release of 3.6.1 in April 2018. Please note, however, lineage following the release of 3.6.1 in April 2018. Please note, however,
@@ -685,6 +685,7 @@ include isaac64 for pseudo random number generation
core prng and display prng use different contexts core prng and display prng use different contexts
when healing magic other than unicorn horn cures blindness, cure deafness too when healing magic other than unicorn horn cures blindness, cure deafness too
do less status updating when the 'time' option is on do less status updating when the 'time' option is on
slightly more thorough feedback when shop damage is repaired in hero's presence
curses: status display substantially revamped for both horizontal (via curses: status display substantially revamped for both horizontal (via
'align_status:bottom' or 'top') and vertical (via 'align_status:left' 'align_status:bottom' or 'top') and vertical (via 'align_status:left'
or 'right'); 3-line horizontal layout (via 'statuslines:3') added or 'right'); 3-line horizontal layout (via 'statuslines:3') added
+3 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 extern.h $NHDT-Date: 1555022327 2019/04/11 22:38:47 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.701 $ */ /* NetHack 3.6 extern.h $NHDT-Date: 1555201698 2019/04/14 00:28:18 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.702 $ */
/* Copyright (c) Steve Creps, 1988. */ /* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -2247,7 +2247,8 @@ E void FDECL(sellobj, (struct obj *, XCHAR_P, XCHAR_P));
E int FDECL(doinvbill, (int)); E int FDECL(doinvbill, (int));
E struct monst *FDECL(shkcatch, (struct obj *, XCHAR_P, XCHAR_P)); E struct monst *FDECL(shkcatch, (struct obj *, XCHAR_P, XCHAR_P));
E void FDECL(add_damage, (XCHAR_P, XCHAR_P, long)); E void FDECL(add_damage, (XCHAR_P, XCHAR_P, long));
E int FDECL(repair_damage, (struct monst *, struct damage *, BOOLEAN_P)); E int FDECL(repair_damage, (struct monst *, struct damage *, int *,
BOOLEAN_P));
E int FDECL(shk_move, (struct monst *)); E int FDECL(shk_move, (struct monst *));
E void FDECL(after_shk_move, (struct monst *)); E void FDECL(after_shk_move, (struct monst *));
E boolean FDECL(is_fshk, (struct monst *)); E boolean FDECL(is_fshk, (struct monst *));
+2 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 restore.c $NHDT-Date: 1543972193 2018/12/05 01:09:53 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.128 $ */ /* NetHack 3.6 restore.c $NHDT-Date: 1555201698 2019/04/14 00:28:18 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.129 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2009. */ /*-Copyright (c) Michael Allison, 2009. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -192,7 +192,7 @@ boolean ghostly;
struct monst *shkp = shop_keeper(*shp); struct monst *shkp = shop_keeper(*shp);
if (shkp && inhishop(shkp) if (shkp && inhishop(shkp)
&& repair_damage(shkp, tmp_dam, TRUE)) && repair_damage(shkp, tmp_dam, (int *) 0, TRUE))
break; break;
} }
} }
+49 -15
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 shk.c $NHDT-Date: 1555058014 2019/04/12 08:33:34 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.158 $ */ /* NetHack 3.6 shk.c $NHDT-Date: 1555201699 2019/04/14 00:28:19 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.159 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -3469,11 +3469,13 @@ struct monst *shkp;
boolean croaked; boolean croaked;
{ {
struct damage *tmp_dam, *tmp2_dam; struct damage *tmp_dam, *tmp2_dam;
struct obj *shk_inv = shkp->minvent;
boolean did_repair = FALSE, saw_door = FALSE, saw_floor = FALSE, boolean did_repair = FALSE, saw_door = FALSE, saw_floor = FALSE,
stop_picking = FALSE, doorway_trap = FALSE; stop_picking = FALSE, doorway_trap = FALSE, skip_msg = FALSE;
int saw_walls = 0, saw_untrap = 0; int saw_walls = 0, saw_untrap = 0, feedback;
char trapmsg[BUFSZ]; char trapmsg[BUFSZ];
feedback = !croaked; /* 1 => give feedback, 0 => don't or already did */
tmp_dam = level.damagelist; tmp_dam = level.damagelist;
tmp2_dam = 0; tmp2_dam = 0;
while (tmp_dam) { while (tmp_dam) {
@@ -3491,12 +3493,12 @@ boolean croaked;
if (croaked) { if (croaked) {
disposition = (shops[1]) ? 0 : 1; disposition = (shops[1]) ? 0 : 1;
} else if (stop_picking) { } else if (stop_picking) {
disposition = repair_damage(shkp, tmp_dam, FALSE); disposition = repair_damage(shkp, tmp_dam, &feedback, FALSE);
} else { } else {
/* Defer the stop_occupation() until after repair msgs */ /* Defer the stop_occupation() until after repair msgs */
if (closed_door(x, y)) if (closed_door(x, y))
stop_picking = picking_at(x, y); stop_picking = picking_at(x, y);
disposition = repair_damage(shkp, tmp_dam, FALSE); disposition = repair_damage(shkp, tmp_dam, &feedback, FALSE);
if (!disposition) if (!disposition)
stop_picking = FALSE; stop_picking = FALSE;
} }
@@ -3539,7 +3541,16 @@ boolean croaked;
if (!did_repair) if (!did_repair)
return; return;
if (saw_untrap) { trapmsg[0] = '\0'; /* not just lint suppression... */
shk_inv = (shkp->minvent != shk_inv) ? shkp->minvent : 0;
if (saw_untrap == 1 && shk_inv
&& (shk_inv->otyp == BEARTRAP || shk_inv->otyp == LAND_MINE)
&& canseemon(shkp)) {
pline("%s untraps %s.", Shknam(shkp), ansimpleoname(shk_inv));
/* we've already reported this trap (and know it's the only one) */
saw_untrap = 0;
skip_msg = !(saw_walls || saw_door || saw_floor);
} else if (saw_untrap) {
Sprintf(trapmsg, "%s trap%s", Sprintf(trapmsg, "%s trap%s",
(saw_untrap > 3) ? "several" : (saw_untrap > 1) ? "some" (saw_untrap > 3) ? "several" : (saw_untrap > 1) ? "some"
: "a", : "a",
@@ -3547,10 +3558,11 @@ boolean croaked;
Sprintf(eos(trapmsg), " %s", vtense(trapmsg, "are")); Sprintf(eos(trapmsg), " %s", vtense(trapmsg, "are"));
Sprintf(eos(trapmsg), " removed from the %s", Sprintf(eos(trapmsg), " removed from the %s",
(doorway_trap && saw_untrap == 1) ? "doorway" : "floor"); (doorway_trap && saw_untrap == 1) ? "doorway" : "floor");
} else }
trapmsg[0] = '\0'; /* not just lint suppression... */
if (saw_walls) { if (skip_msg) {
; /* already gave an untrap message which covered the only repair */
} else if (saw_walls) {
char wallbuf[BUFSZ]; char wallbuf[BUFSZ];
Sprintf(wallbuf, "section%s", plur(saw_walls)); Sprintf(wallbuf, "section%s", plur(saw_walls));
@@ -3572,6 +3584,10 @@ boolean croaked;
saw_floor ? "the floor damage is gone" : "", saw_floor ? "the floor damage is gone" : "",
((saw_door || saw_floor) && *trapmsg) ? " and " : "", ((saw_door || saw_floor) && *trapmsg) ? " and " : "",
trapmsg); trapmsg);
/* FIXME:
* these messages aren't right if the unseen repairs were only
* for trap removal (except for hole and possibly trap door).
*/
else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom) else if (inside_shop(u.ux, u.uy) == ESHK(shkp)->shoproom)
You_feel("more claustrophobic than before."); You_feel("more claustrophobic than before.");
else if (!Deaf && !rn2(10)) else if (!Deaf && !rn2(10))
@@ -3586,9 +3602,10 @@ boolean croaked;
* 3: untrap * 3: untrap
*/ */
int int
repair_damage(shkp, tmp_dam, catchup) repair_damage(shkp, tmp_dam, once, catchup)
struct monst *shkp; struct monst *shkp;
struct damage *tmp_dam; struct damage *tmp_dam;
int *once;
boolean catchup; /* restoring a level */ boolean catchup; /* restoring a level */
{ {
xchar x, y; xchar x, y;
@@ -3607,13 +3624,30 @@ boolean catchup; /* restoring a level */
if (!IS_ROOM(tmp_dam->typ)) { if (!IS_ROOM(tmp_dam->typ)) {
if ((x == u.ux && y == u.uy && !Passes_walls) if ((x == u.ux && y == u.uy && !Passes_walls)
|| (x == shkp->mx && y == shkp->my) || (x == shkp->mx && y == shkp->my)
|| ((mtmp = m_at(x, y)) && !passes_walls(mtmp->data))) || ((mtmp = m_at(x, y)) != 0 && !passes_walls(mtmp->data)))
return 0; return 0;
} }
if ((ttmp = t_at(x, y)) != 0) { ttmp = t_at(x, y);
if (x == u.ux && y == u.uy && !Passes_walls) if (ttmp && x == u.ux && y == u.uy && !Passes_walls)
return 0; return 0;
if (ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP) {
if (once && *once) {
boolean shk_closeby = (distu(shkp->mx, shkp->my)
<= (BOLT_LIM / 2) * (BOLT_LIM / 2));
/* this is suboptimal if we eventually give a "shk untraps"
message for the only repair, but perhaps the shop repair
incantation means that shk's untrap attempt will never fail */
if (canseemon(shkp))
pline("%s whispers %s.", Shknam(shkp),
shk_closeby ? "an incantation" : "something");
else if (!Deaf && shk_closeby)
You_hear("someone muttering an incantation.");
*once = 0;
}
if (ttmp) {
if ((ttmp->ttyp == LANDMINE || ttmp->ttyp == BEAR_TRAP)
&& dist2(x, y, shkp->mx, shkp->my) <= 2) {
/* convert to an object */ /* convert to an object */
otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP, otmp = mksobj((ttmp->ttyp == LANDMINE) ? LAND_MINE : BEARTRAP,
TRUE, FALSE); TRUE, FALSE);