ball and chain panic when teleporting

"remove_obj: obj not on floor" when trying to move the iron ball.
For the circumstances involved, the ball wasn't supposed to be
moved anyway, just the chain.

I could reproduce the problem using the steps specified.  I didn't
track down the precise point of failure but after this fix the
panic can't be reproduced anymore.
This commit is contained in:
PatR
2020-03-10 15:59:01 -07:00
parent f664e83070
commit 5d2f719b02
2 changed files with 8 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.125 $ $NHDT-Date: 1583708535 2020/03/08 23:02:15 $
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.127 $ $NHDT-Date: 1583881126 2020/03/10 22:58:46 $
General Fixes and Modified Features
-----------------------------------
@@ -70,6 +70,9 @@ generate objects (eg. statues) with genocided or extinct monster classes
in special levels, if requested
if the orc-town version of mine town has been loaded, creation of orc zombies
or orc mummies would name them as part of the town raiding orc clan
when punished, involuntarily teleporting and landing within chain range of
attached ball while encumbered worse than burdened could trigger
"remove_object: obj not on floor" panic on hero's next move
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 teleport.c $NHDT-Date: 1581886867 2020/02/16 21:01:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.113 $ */
/* NetHack 3.6 teleport.c $NHDT-Date: 1583881126 2020/03/10 22:58:46 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.116 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2011. */
/* NetHack may be freely redistributed. See license for details. */
@@ -302,8 +302,9 @@ int nux, nuy;
int teleds_flags;
{
boolean ball_active, ball_still_in_range;
boolean allow_drag = teleds_flags & TELEDS_ALLOW_DRAG;
boolean is_teleport = teleds_flags & TELEDS_TELEPORT;
boolean allow_drag = ((teleds_flags & TELEDS_ALLOW_DRAG) != 0
&& near_capacity() <= SLT_ENCUMBER);
boolean is_teleport = (teleds_flags & TELEDS_TELEPORT) != 0;
struct monst *vault_guard = vault_occupied(u.urooms) ? findgd() : 0;
if (u.utraptype == TT_BURIEDBALL) {