From: nethack.rankin Date: Sat, 20 Nov 2004 01:41:01 +0000 (+0000) Subject: fix #U1202 - shop robbery oversights X-Git-Tag: MOVE2GIT~1403 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6336dbbb65e7dbe37c562021d795bbaed6b86394;p=nethack fix #U1202 - shop robbery oversights A user reported that when breaking potions inside a box in a shop, he wasn't charged for them. The code was calling stolen_value() as intended, but that routine only charged for types of items which the shop normally carries. That meant that breaking the contents of a box in a general store would charge for them but doing so in a tool shop would, not even though the tool shopkeeper would gladly sell such things when you picked them up instead of causing them to go away. When fixing this, I noticed that stolen_value() was only charging for single items. Most of the time that was right, because throwing and kicking things always split one off, but there are cases (such as zapping a wand of teleportation at shop goods) where an entire stack gets stolen as a group. This makes stolen_value() handle all quantities. --- diff --git a/doc/fixes34.4 b/doc/fixes34.4 index f4982786c..23e5fe76f 100644 --- a/doc/fixes34.4 +++ b/doc/fixes34.4 @@ -64,6 +64,8 @@ panic on subsequent move if engulfer gets turned to stone and poly'd hero give more specific messages when dropping weapons due to slippery fingers various helmet messages changed to distinguish between "helm" and "hat" helmets don't protect against cockatrice eggs thrown straight up +breaking container contents in a shop didn't always charge for them +some types of shop theft of a stack of items only charged for a single one Platform- and/or Interface-Specific Fixes diff --git a/src/shk.c b/src/shk.c index 60a74eba8..07eb9d7ab 100644 --- a/src/shk.c +++ b/src/shk.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)shk.c 3.4 2004/06/23 */ +/* SCCS Id: @(#)shk.c 3.4 2004/11/17 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2412,8 +2412,11 @@ register boolean peaceful, silent; value += stolen_container(obj, shkp, value, ininv); if(!ininv) gvalue += contained_gold(obj); - } else if (!obj->no_charge && saleable(shkp, obj)) { - value += get_cost(obj, shkp); + } else if (!obj->no_charge) { + /* treat items inside containers as "saleable" */ + if ((saleable(shkp, obj) || obj->where == OBJ_CONTAINED) && + (obj->oclass != FOOD_CLASS || !obj->oeaten)) + value += obj->quan * get_cost(obj, shkp); } if(gvalue + value == 0L) return(0L);