stealing heaven
Fix the reported problem of getting impossible warnings for unpaid inventory items during final disclosure if you level teleport out of the dungeon while holding shop goods. The fix makes you trigger a shop robbery first; that required a minor end of game change to prevent the shopkeeper from seeming to tag along (shk would take your possessions as if you'd died on the shop level).
This commit is contained in:
@@ -309,6 +309,8 @@ breaking wand of digging causing a shopkeeper to fall left unpaid items unpaid
|
||||
use get_adjacent_loc() rather than getdir() directly for some things where
|
||||
you want to ensure valid adjacent coordinates are returned
|
||||
minor experience calculation tweaks
|
||||
level telporting out of the dungeon while carrying unpaid shop goods would
|
||||
trigger "not on any bill" warnings during final inventory disclosure
|
||||
|
||||
|
||||
Platform- and/or Interface-Specific Fixes
|
||||
|
||||
@@ -1762,7 +1762,7 @@ E void FDECL(make_happy_shk, (struct monst *,BOOLEAN_P));
|
||||
E void FDECL(hot_pursuit, (struct monst *));
|
||||
E void FDECL(make_angry_shk, (struct monst *,XCHAR_P,XCHAR_P));
|
||||
E int NDECL(dopay);
|
||||
E boolean FDECL(paybill, (BOOLEAN_P));
|
||||
E boolean FDECL(paybill, (int));
|
||||
E void NDECL(finish_paybill);
|
||||
E struct obj *FDECL(find_oid, (unsigned));
|
||||
E long FDECL(contained_cost, (struct obj *,struct monst *,long,BOOLEAN_P, BOOLEAN_P));
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* SCCS Id: @(#)end.c 3.4 2002/10/04 */
|
||||
/* SCCS Id: @(#)end.c 3.4 2002/11/20 */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -690,7 +690,7 @@ die:
|
||||
|
||||
if (how != PANICKED) {
|
||||
/* these affect score and/or bones, but avoid them during panic */
|
||||
taken = paybill(how != QUIT);
|
||||
taken = paybill((how == ESCAPED) ? -1 : (how != QUIT));
|
||||
paygd();
|
||||
clearpriests();
|
||||
} else taken = FALSE; /* lint; assert( !bones_ok ); */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* SCCS Id: @(#)shk.c 3.4 2002/09/28 */
|
||||
/* SCCS Id: @(#)shk.c 3.4 2002/11/20 */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -51,7 +51,7 @@ STATIC_DCL long FDECL(getprice, (struct obj *,BOOLEAN_P));
|
||||
STATIC_DCL void FDECL(shk_names_obj,
|
||||
(struct monst *,struct obj *,const char *,long,const char *));
|
||||
STATIC_DCL struct obj *FDECL(bp_to_obj, (struct bill_x *));
|
||||
STATIC_DCL boolean FDECL(inherits, (struct monst *, int, BOOLEAN_P));
|
||||
STATIC_DCL boolean FDECL(inherits, (struct monst *,int,int));
|
||||
STATIC_DCL void FDECL(set_repo_loc, (struct eshk *));
|
||||
STATIC_DCL boolean NDECL(angry_shk_exists);
|
||||
STATIC_DCL void FDECL(rile_shk, (struct monst *));
|
||||
@@ -1572,6 +1572,9 @@ boolean croaked;
|
||||
register boolean taken = FALSE;
|
||||
register int numsk = 0;
|
||||
|
||||
/* if we escaped from the dungeon, shopkeepers can't reach us */
|
||||
if (croaked < 0) return FALSE;
|
||||
|
||||
/* this is where inventory will end up if any shk takes it */
|
||||
repo_location.x = repo_location.y = 0;
|
||||
|
||||
@@ -1602,7 +1605,7 @@ STATIC_OVL boolean
|
||||
inherits(shkp, numsk, croaked)
|
||||
struct monst *shkp;
|
||||
int numsk;
|
||||
boolean croaked;
|
||||
int croaked;
|
||||
{
|
||||
long loss = 0L;
|
||||
#ifdef GOLDOBJ
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* SCCS Id: @(#)teleport.c 3.4 2002/05/31 */
|
||||
/* SCCS Id: @(#)teleport.c 3.4 2002/11/20 */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -648,6 +648,14 @@ level_tele()
|
||||
killer = 0; /* still alive, so far... */
|
||||
|
||||
if (newlev < 0) {
|
||||
if (*u.ushops0) {
|
||||
/* take unpaid inventory items off of shop bills */
|
||||
in_mklev = TRUE; /* suppress map update */
|
||||
u_left_shop(u.ushops0, TRUE);
|
||||
/* you're now effectively out of the shop */
|
||||
*u.ushops0 = *u.ushops = '\0';
|
||||
in_mklev = FALSE;
|
||||
}
|
||||
if (newlev <= -10) {
|
||||
You("arrive in heaven.");
|
||||
verbalize("Thou art early, but we'll admit thee.");
|
||||
@@ -670,8 +678,8 @@ level_tele()
|
||||
pline("Unfortunately, you don't know how to fly.");
|
||||
You("plummet a few thousand feet to your death.");
|
||||
Sprintf(buf,
|
||||
"teleported out of the dungeon and fell to %s death",
|
||||
uhis());
|
||||
"teleported out of the dungeon and fell to %s death",
|
||||
uhis());
|
||||
killer = buf;
|
||||
killer_format = NO_KILLER_PREFIX;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user