From: Tung Nguyen Date: Wed, 9 Mar 2016 03:20:58 +0000 (+1100) Subject: Don't shop-donate non-empty bags dropped in sellobj_state SELL_DONTSELL X-Git-Tag: NetHack-3.6.1_RC01~830^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e8da58cd04ba9562f462b6bbb819e7f75c00b93;p=nethack Don't shop-donate non-empty bags dropped in sellobj_state SELL_DONTSELL For a shop to NOT charge for an object, two conditions apply: 1. The object's `no_charge` flag must be set. 2. That `no_charge` flag must be set regardless of whether or not the shop typically sells the object in question. There are two places in `sellobj()` which ignore the second condition, thus transferring object ownership from the player to the shop without the player's consent: 1. A container is dropped in a shop that typically sells such containers and `sellobj_state` is `SELL_DONTSELL`. 2. A zero-cost container holding nothing but gold is dropped in a shop that typically sells such containers. Neither occurs currently in NetHack: the latter because NetHack has no zero-cost containers, but the former is needed for an upcoming bug fix. This may be related to SC343-21: "Accounting is incorrect for containers dropped in a shop that does not sell them." Based on DynaHack commit 4e79b6a (Don't shop-donate non-empty bags dropped in sellobj_state SELL_DONTSELL) by me. --- diff --git a/src/shk.c b/src/shk.c index 6cf62f2c0..0699d36e3 100644 --- a/src/shk.c +++ b/src/shk.c @@ -2885,7 +2885,7 @@ xchar x, y; if (container) { dropped_container(obj, shkp, FALSE); - if (!obj->unpaid && !saleitem) + if (!obj->unpaid) obj->no_charge = 1; if (unpaid) subfrombill(obj, shkp); @@ -2960,7 +2960,7 @@ xchar x, y; if (!isgold) { if (container) dropped_container(obj, shkp, FALSE); - if (!obj->unpaid && !saleitem) + if (!obj->unpaid) obj->no_charge = 1; subfrombill(obj, shkp); }