]> granicus.if.org Git - nethack/commitdiff
prices of items on shop floor
authorPatR <rankin@nethack.org>
Tue, 25 Dec 2018 21:48:51 +0000 (13:48 -0800)
committerPatR <rankin@nethack.org>
Tue, 25 Dec 2018 21:48:51 +0000 (13:48 -0800)
get_cost_of_item() was giving different information from shop #chat
when dealing with containers owned by hero containing objects owned
by the shop.  And when it was legitimately reporting a price of 0,
doname_with_price() wasn't reporting 'no charge' for items inside a
shop that were owned by hero or that shopkeeper didn't care about.

Extend the shop price reveal to far-look, but only when hero and item
being examined are inside the same shop.

doc/fixes36.2
src/objnam.c
src/pager.c
src/shk.c

index 14f45097eeb8e110f4a89f660b8f5ca9996fd4d5..2b164de23676c4d3205a1332659e0ad6f5992ec8 100644 (file)
@@ -303,6 +303,8 @@ limit carrying heavy loads from water to land
 failing to carry a wished-for item behaved differenctly from dropping one
 life-saving while weak/starving/fainting boosted nutrition without restoring
        lost point of strength, making temporary loss be permanent
+unlike #chat in a shop, walking on an item in a shop failed to include price
+       for hero-owned container holding shop-owned items
 
 
 Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository
@@ -458,6 +460,8 @@ being trapped (bear trap, web, molten or solidified lava, chained to buried
        pit ends when either of those starts so doesn't apply)
 early level traps are sometimes covered by the remains of fake players
 fake player characters resist Conflict
+when inside a shop, far-look now includes shop prices for items marked as
+       having been seen up close
 
 
 NetHack Community Patches (or Variation) Included
index 6a805852dfe3f4d2aa2a8d3c0c3b285e381f368e..597a79249731bc2e96c9353556d662935345374e 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 objnam.c        $NHDT-Date: 1544520422 2018/12/11 09:27:02 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.230 $ */
+/* NetHack 3.6 objnam.c        $NHDT-Date: 1545774525 2018/12/25 21:48:45 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.231 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2011. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -1210,10 +1210,15 @@ unsigned doname_flags;
                 obj->unpaid ? "unpaid" : "contents",
                 quotedprice, currency(quotedprice));
     } else if (with_price) {
-        long price = get_cost_of_shop_item(obj);
+        long price = get_cost_of_shop_item(obj); /* updates obj->ox,oy */
 
-        if (price > 0)
+        if (price > 0L)
             Sprintf(eos(bp), " (%ld %s)", price, currency(price));
+        else if (obj->no_charge /* only set for items on shop floor */
+                 && *u.ushops /* but make sure hero is inside same shop */
+                 && (*in_rooms(u.ux, u.uy, SHOPBASE)
+                     == *in_rooms(obj->ox, obj->oy, SHOPBASE)))
+            Strcat(bp, " (no charge)");
     }
     if (!strncmp(prefix, "a ", 2)) {
         /* save current prefix, without "a "; might be empty */
index e8748452e668e9874e23e74a7e7070c504062e39..2ae5d8074554727f154d903fedbfe424149f6597 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 pager.c $NHDT-Date: 1545595360 2018/12/23 20:02:40 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.144 $ */
+/* NetHack 3.6 pager.c $NHDT-Date: 1545774524 2018/12/25 21:48:44 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.145 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2018. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -223,7 +223,8 @@ int x, y, glyph;
 
     if (otmp) {
         Strcpy(buf, (otmp->otyp != STRANGE_OBJECT)
-                     ? distant_name(otmp, doname_vague_quan)
+                     ? distant_name(otmp, otmp->dknown ? doname_with_price
+                                                       : doname_vague_quan)
                      : obj_descr[STRANGE_OBJECT].oc_name);
         if (fakeobj)
             dealloc_obj(otmp), otmp = 0;
index 315de4c1df07c408c6c9053cd34c96f5ac75c788..9f67154154846ac2a8bb6ce27998454ba0d018a0 100644 (file)
--- a/src/shk.c
+++ b/src/shk.c
@@ -1,4 +1,4 @@
-/* NetHack 3.6 shk.c   $NHDT-Date: 1545383616 2018/12/21 09:13:36 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.144 $ */
+/* NetHack 3.6 shk.c   $NHDT-Date: 1545774524 2018/12/25 21:48:44 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.145 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2012. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -921,7 +921,7 @@ register struct obj *obj, *merge;
             if (onbill(obj, shkp, TRUE))
                 break;
     }
-    /* sanity check, more or less */
+    /* sanity check, in case obj is on bill but not marked 'unpaid' */
     if (!shkp)
         shkp = shop_keeper(*u.ushops);
     /*
@@ -1962,8 +1962,8 @@ unsigned id;
     return (struct obj *) 0;
 }
 
-/* Returns the price of an arbitrary item in the shop.
-   Returns 0 if the item doesn't belong to a shopkeeper. */
+/* Returns the price of an arbitrary item in the shop,
+   0 if the item doesn't belong to a shopkeeper or hero is not in the shop. */
 long
 get_cost_of_shop_item(obj)
 register struct obj *obj;
@@ -1972,16 +1972,12 @@ register struct obj *obj;
     xchar x, y;
     long cost = 0L;
 
-    if (*u.ushops
-        && obj->oclass != COIN_CLASS
+    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);
+        && *in_rooms(u.ux, u.uy, SHOPBASE) == *in_rooms(x, y, SHOPBASE)
+        && (shkp = shop_keeper(inside_shop(x, y))) != 0 && inhishop(shkp)) {
+        cost = obj->no_charge ? 0L : obj->quan * get_cost(obj, shkp);
         if (Has_contents(obj))
             cost += contained_cost(obj, shkp, 0L, FALSE, FALSE);
     }
@@ -4168,9 +4164,8 @@ register struct obj *first_obj;
     for (otmp = first_obj; otmp; otmp = otmp->nexthere) {
         if (otmp->oclass == COIN_CLASS)
             continue;
-        cost = (otmp->no_charge || otmp == uball || otmp == uchain)
-                   ? 0L
-                   : get_cost(otmp, (struct monst *) 0);
+        cost = (otmp->no_charge || otmp == uball || otmp == uchain) ? 0L
+                 : get_cost(otmp, shkp);
         contentsonly = !cost;
         if (Has_contents(otmp))
             cost += contained_cost(otmp, shkp, 0L, FALSE, FALSE);