pull request #969 - dying in shared shop wall

Pull request by entrez, following up issue by k2:  when deciding
whether a shopkeeper should taken possession of dying heros invent,
check all rooms the hero is in rather than just the first.  Deals
with dying in a gap of a wall shared by two shops.

Original issue was about "place_object: <item> off map <0,0>" but
an earlier commit fixed that (I hope).  That commit had a typo in
the issue number and closed #965 (which was already closed) instead
of #969 (which this pull request reopened anyway).

Closes #969
This commit is contained in:
PatR
2023-02-07 13:49:44 -08:00

View File

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