From a5c0090baccf613247cf6f656d9c58ab32e85251 Mon Sep 17 00:00:00 2001 From: Michael Meyer Date: Mon, 6 Feb 2023 13:41:55 -0500 Subject: [PATCH] More #969: handle shared walls in inherits() inherits() only examined the first item in u.ushops, so some shopkeepers that should have had first dibs were ignoring the hero, one of the causes of #969. Examine the entire u.ushops array instead of just the first item so that the hero's position within the shop will be correctly identified (and do the same in set_repo_loc, though it's probably not really necessary there). --- src/shk.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/shk.c b/src/shk.c index 6512df649..13b6fc7c4 100644 --- a/src/shk.c +++ b/src/shk.c @@ -1943,8 +1943,8 @@ inherits( long loss = 0L; long umoney; struct eshk *eshkp = ESHK(shkp); - boolean take = FALSE, taken = FALSE; - int roomno = *u.ushops; + boolean take = FALSE, taken = FALSE, + uinshop = (strchr(u.ushops, eshkp->shoproom) != (char *) 0); char takes[BUFSZ]; /* not strictly consistent; affects messages and prevents next player @@ -1964,13 +1964,13 @@ inherits( helpless(shkp) ? "wakes up, " : "", takes, !inhishop(shkp) ? "disappears" : "sighs"); } - taken = (roomno == eshkp->shoproom); + taken = uinshop; goto skip; } /* get one case out of the way: you die in the shop, the shopkeeper is peaceful, nothing stolen, nothing owed */ - if (roomno == eshkp->shoproom && inhishop(shkp) && !eshkp->billct + if (uinshop && inhishop(shkp) && !eshkp->billct && !eshkp->robbed && !eshkp->debit && NOTANGRY(shkp) && !eshkp->following && u.ugrave_arise < LOW_PM) { taken = (gi.invent != 0); @@ -1981,7 +1981,7 @@ inherits( } if (eshkp->billct || eshkp->debit || eshkp->robbed) { - if (roomno == eshkp->shoproom && inhishop(shkp)) + if (uinshop && inhishop(shkp)) loss = addupbill(shkp) + eshkp->debit; if (loss < eshkp->robbed) loss = eshkp->robbed; @@ -1999,7 +1999,7 @@ inherits( Strcat(takes, "comes and "); Strcat(takes, "takes"); - if (loss > umoney || !loss || roomno == eshkp->shoproom) { + if (loss > umoney || !loss || uinshop) { eshkp->robbed -= umoney; if (eshkp->robbed < 0L) eshkp->robbed = 0L; @@ -2061,7 +2061,7 @@ set_repo_loc(struct monst *shkp) /* if you're not in this shk's shop room, or if you're in its doorway or entry spot or one of its walls (temporary gap or Passes_walls), then your gear gets dumped all the way inside */ - if (*u.ushops != eshkp->shoproom || costly_adjacent(shkp, ox, oy)) { + if (!strchr(u.ushops, eshkp->shoproom) || costly_adjacent(shkp, ox, oy)) { /* shk.x,shk.y is the position immediately in front of the door; move in one more space */ ox = eshkp->shk.x;