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:
14
src/shk.c
14
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;
|
||||
|
||||
Reference in New Issue
Block a user