From: Michael Meyer Date: Mon, 6 Feb 2023 18:41:55 +0000 (-0500) Subject: More #969: handle shared walls in inherits() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a5c0090baccf613247cf6f656d9c58ab32e85251;p=nethack 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). --- 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;