]> granicus.if.org Git - nethack/commitdiff
get_cost_from_price
authorPatR <rankin@nethack.org>
Sun, 31 May 2015 01:22:14 +0000 (18:22 -0700)
committerPatR <rankin@nethack.org>
Sun, 31 May 2015 01:22:14 +0000 (18:22 -0700)
I couldn't figure out why walking over a container in a shop might
give the wrong price; the code looks correct.  But I've reorganized
get_cost_from_price to perform the cheapest tests first.  The u.ushops
check should probably be done in doname to avoid calling this routine
at all 99.99% of the time.

src/shk.c

index 6988640f0325a68b8d2b00ad6a89c07d6fa7fab6..7d2a79f79a598a78bf21a1111badbd1f9bc9506c 100644 (file)
--- a/src/shk.c
+++ b/src/shk.c
@@ -1,4 +1,4 @@
-/* NetHack 3.6 shk.c   $NHDT-Date: 1432512768 2015/05/25 00:12:48 $  $NHDT-Branch: master $:$NHDT-Revision: 1.109 $ */
+/* NetHack 3.6 shk.c   $NHDT-Date: 1433035328 2015/05/31 01:22:08 $  $NHDT-Branch: master $:$NHDT-Revision: 1.111 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1873,24 +1873,20 @@ register struct obj *obj;
 {
     struct monst *shkp;
     xchar x, y;
-    int cost=0;
-
-    if (get_obj_location(obj, &x, &y, 0) &&
-        (obj->unpaid ||
-         (obj->where == OBJ_FLOOR && !obj->no_charge && costly_spot(x,y)))) {
-
-        if (!(shkp = shop_keeper(*in_rooms(x, y, SHOPBASE)))) return 0;
-        if (!inhishop(shkp)) return 0;
-        if (!costly_spot(x, y))        return 0;
-        if (!*u.ushops) return 0;
-
-        if (obj->oclass != COIN_CLASS) {
-            cost = (obj == uball || obj == uchain) ? 0L :
-                obj->quan * get_cost(obj, shkp);
-            if (Has_contents(obj)) {
-                cost += contained_cost(obj, shkp, 0L, FALSE, FALSE);
-            }
-        }
+    long cost = 0L;
+
+    if (*u.ushops
+        && obj->oclass != COIN_CLASS
+        && obj != uball && obj != uchain
+        && get_obj_location(obj, &x, &y, 0)
+        && (obj->unpaid
+            || (obj->where == OBJ_FLOOR
+                && !obj->no_charge && costly_spot(x, y)))
+        && (shkp = shop_keeper(*in_rooms(x, y, SHOPBASE))) != 0
+        && inhishop(shkp)) {
+        cost = obj->quan * get_cost(obj, shkp);
+        if (Has_contents(obj))
+            cost += contained_cost(obj, shkp, 0L, FALSE, FALSE);
     }
     return cost;
 }