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.
if (container) {
dropped_container(obj, shkp, FALSE);
- if (!obj->unpaid && !saleitem)
+ if (!obj->unpaid)
obj->no_charge = 1;
if (unpaid)
subfrombill(obj, shkp);
if (!isgold) {
if (container)
dropped_container(obj, shkp, FALSE);
- if (!obj->unpaid && !saleitem)
+ if (!obj->unpaid)
obj->no_charge = 1;
subfrombill(obj, shkp);
}