shop theft/breakage (trunk only)

The recent fix for "breaking glass wand in tool shop" looked suspect,
adding a call to costly_alteration after an existing call to stolen_value.
Either one or the other ought to suffice.  (For items on the floor,
costly_alteration() calls stolen_value(); for items in inventory, or just
released from inventory and not placed on floor yet, costly_alteration()
adds a usage fee to the shop bill but doesn't annoy the shopkeeper into
adding surcharges to prices or summoning the kops if already hostile.)

     In 3.4.3, stolen_value() wasn't smart enough to charge for an out-of-
shk's-field item (like a wand in a tool shop) taken from a shop container,
and that's the problem the user was reporting.  But the post-3.4.3 code was
changed to handle that by checking billable() instead of saleable(); this
bug should have been gone.  Unfortunately, billable() treats items already
on the bill as not interesting--from the perspective of adding things to
the bill--so the change accidentally resulted in stolen_value() no longer
handling objects which are marked unpaid, triggering the same symptom for
a different reason.  (Other events besides the breakage of thrown objects
suffered from the bug's new incarnation since various places deliberately
call stolen_value() for unpaid objects.)  This updates stolen_value() and
stolen_container() to account for the behavior of billable().  And a few
calls to subfrombill() go away since stolen_value() now takes care of that.
This commit is contained in:
nethack.rankin
2006-06-22 04:08:40 +00:00
parent ed202000f1
commit dc63ed8a80
4 changed files with 31 additions and 28 deletions

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)dothrow.c 3.5 2006/04/14 */
/* SCCS Id: @(#)dothrow.c 3.5 2006/06/21 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -700,31 +700,24 @@ register boolean broken;
if(!shkp) return;
if(broken) {
if (obj->unpaid) {
if (obj->unpaid)
(void)stolen_value(obj, u.ux, u.uy,
(boolean)shkp->mpeaceful, FALSE);
costly_alteration(obj, COST_DSTROY);
/* costly_alteration() probably already called
subfrombill() for the object, but just in case it
didn't, call it again. If it did, this is a NOOP. */
subfrombill(obj, shkp);
}
obj->no_charge = 1;
return;
}
if (!costly_spot(x, y) || *in_rooms(x, y, SHOPBASE) != *u.ushops) {
/* thrown out of a shop or into a different shop */
if (obj->unpaid) {
if (obj->unpaid)
(void)stolen_value(obj, u.ux, u.uy,
(boolean)shkp->mpeaceful, FALSE);
subfrombill(obj, shkp);
}
} else {
if (costly_spot(u.ux, u.uy) && costly_spot(x, y)) {
if(obj->unpaid) subfrombill(obj, shkp);
else if(!(x == shkp->mx && y == shkp->my))
sellobj(obj, x, y);
if (obj->unpaid)
subfrombill(obj, shkp);
else if (x != shkp->mx || y != shkp->my)
sellobj(obj, x, y);
}
}
}