From 6e8da58cd04ba9562f462b6bbb819e7f75c00b93 Mon Sep 17 00:00:00 2001 From: Tung Nguyen Date: Wed, 9 Mar 2016 14:20:58 +1100 Subject: [PATCH] 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. --- src/shk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); } -- 2.50.1