fix B18010 fatal exploding chest at ball & chain

This commit is contained in:
nethack.allison
2003-02-08 22:00:58 +00:00
parent 02d9ab252d
commit 7dbed130dc
2 changed files with 14 additions and 0 deletions

View File

@@ -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 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 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 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 Platform- and/or Interface-Specific Fixes

View File

@@ -3479,6 +3479,18 @@ boolean disarm;
loss += stolen_value(obj, ox, oy, loss += stolen_value(obj, ox, oy,
(boolean)shkp->mpeaceful, TRUE); (boolean)shkp->mpeaceful, TRUE);
delete_contents(obj); 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]; for(otmp = level.objects[u.ux][u.uy];
otmp; otmp = otmp2) { otmp; otmp = otmp2) {
otmp2 = otmp->nexthere; otmp2 = otmp->nexthere;