From 6a53009069dd2b474a288c9b2cc1ca8b364ceb13 Mon Sep 17 00:00:00 2001
From: "nethack.rankin" <nethack.rankin>
Date: Sat, 9 Jul 2011 02:56:38 +0000
Subject: [PATCH] fix shop ownership of saddle dropped by dead pet (trunk only)

     From a bug report, you could obtain
a saddle for free if it was dropped (while worn) by a dying pet inside a
shop.  That's intentional, but it was happening even when the hero was
not in the shop, which doesn't seem right.  Change things to only set it
no_charge if hero is within the same shop (including standing in the
doorway or a temporary wall breach, not just when all the way inside) at
the time of the drop.
---
 doc/fixes35.0 | 2 ++
 src/steal.c   | 7 +++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/doc/fixes35.0 b/doc/fixes35.0
index a7b12e7cc..c5b9a898e 100644
--- a/doc/fixes35.0
+++ b/doc/fixes35.0
@@ -364,6 +364,8 @@ surviving in lava boils away carried potions, but dying in lava and being
 	life-saved or leaving bones would keep them intact
 when applicable, give "your body rises from the dead as an <undead>..."
 	even when bones data isn't being saved
+have shk claim ownership of worn saddle dropped by dying pet if hero is
+	not within the same shop at the time of the drop
 
 
 Platform- and/or Interface-Specific Fixes
diff --git a/src/steal.c b/src/steal.c
index bfe773572..32ffbf003 100644
--- a/src/steal.c
+++ b/src/steal.c
@@ -631,9 +631,12 @@ boolean verbosely;
 	    mon->misc_worn_check &= ~obj->owornmask;
 	    update_mon = TRUE;
 #ifdef STEED
-	/* don't charge for an owned saddle on dead steed */
+	/* don't charge for an owned saddle on dead steed (provided
+	   that the hero is within the same shop at the time) */
 	} else if (mon->mtame && (obj->owornmask & W_SADDLE) && 
-		!obj->unpaid && costly_spot(omx, omy)) {
+		!obj->unpaid && costly_spot(omx, omy) &&
+		/* being at a costly_spot guarantees lev->roomno is not 0 */
+		index(in_rooms(u.ux, u.uy, SHOPBASE), levl[omx][omy].roomno)) {
 	    obj->no_charge = 1;
 #endif
 	}
-- 
2.40.0