From: nethack.allison Date: Sat, 8 Feb 2003 22:00:58 +0000 (+0000) Subject: fix B18010 fatal exploding chest at ball & chain X-Git-Tag: MOVE2GIT~2208 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7dbed130dc2000b67069a1670036e08701d089ab;p=nethack fix B18010 fatal exploding chest at ball & chain --- diff --git a/doc/fixes34.1 b/doc/fixes34.1 index 2ff6f30ae..0777903f4 100644 --- a/doc/fixes34.1 +++ b/doc/fixes34.1 @@ -372,6 +372,8 @@ monks lose their to-hit bonus for bare-handed attacking if wearing a shield fix case on leading character in "Crunched in the head..." in ball.c using travel mode to move next to a known trap and then trying to step onto that trap required an extra step; the first one ended up as a no-op +punished with ball and chain on the same floor square as a trapped chest + when it exploded resulted in panic "remove_object: obj not on floor" Platform- and/or Interface-Specific Fixes diff --git a/src/trap.c b/src/trap.c index 74f88b1a3..9e555dea7 100644 --- a/src/trap.c +++ b/src/trap.c @@ -3479,6 +3479,18 @@ boolean disarm; loss += stolen_value(obj, ox, oy, (boolean)shkp->mpeaceful, TRUE); delete_contents(obj); + /* we're about to delete all things at this location, + * which could include the ball & chain. + * If we attempt to call unpunish() in the + * for-loop below we can end up with otmp2 + * being invalid once the chain is gone. + * Deal with ball & chain right now instead. + */ + if (Punished && !carried(uball) && + ((uchain->ox == u.ux && uchain->oy == u.uy) || + (uball->ox == u.ux && uball->oy == u.uy))) + unpunish(); + for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp2) { otmp2 = otmp->nexthere;