fix the "big abuse" reported a few days ago

It was possible to get a shopkeeper to carry the Amulet from the
bottom of the dungeon up to the location of his shop, thereby bypassing
the usual labor of lugging it up yourself.  [Drop the Amulet somewhere;
rob a shop so that the Kops are summoned and the shk comes after you;
when shk is next you, level teleport to the Amulet (probably two hops,
one to the Valley and another deeper into Gehennom); walk to the vicinity
of the Amulet; shk will eventually pick it up (shopkeepers like to pick
up magic items); now, pay him for the stolen goods--he'll be pacified
and migrate back to his shop, taking his inventory with him; lastly,
return to his shop and relieve him of his burder.]  This patch makes
shopkeepers drop the Amulet or invocation tools if/when they set set to
migrate to their normal location.

     Also fix another long standing risk that a monster that is sent
away (nurse when healing, Kops when you pacify a shopkeeper) might be
carrying the Amulet or one of the invocation tools and make the game
unwinnable.  I doubt that that's ever actually happened but I think it'd
be possible if a monster that likes magic items ever got polymorphed
into a Kop.  Such dismissed monsters will now drop the same stuff as
the shk above prior to leaving the game.
This commit is contained in:
nethack.rankin
2003-12-06 14:08:51 +00:00
parent 3b2b16ea9d
commit 2e28abcd5a
5 changed files with 73 additions and 25 deletions

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)shk.c 3.4 2003/08/18 */
/* SCCS Id: @(#)shk.c 3.4 2003/12/04 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -975,6 +975,9 @@ register boolean silentkops;
} else {
/* if sensed, does disappear regardless whether seen */
if (sensemon(shkp)) vanished = TRUE;
/* can't act as porter for the Amulet, even if shk
happens to be going farther down rather than up */
mdrop_special_objs(shkp);
/* arrive near shop's door */
migrate_to_level(shkp, ledger_no(&eshkp->shoplevel),
MIGR_APPROX_XY, &eshkp->shd);