From c49130e5bd91f1a5291e4ffe42aa1fead8bd03c6 Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Sat, 30 Mar 2002 14:46:31 +0000 Subject: [PATCH] boulder/statue/landmine reversal and new fix This includes a reversal of my earlier boulder/statue/landmine fix, and places a check for obj->where==OBJ_FLOOR into fracture_rock(). I think this is a better approach because: - if eliminates the pointless extract/place in fracture_rock, followed by extract/place in the caller in the two places causing the crash - it covers any similar situations that we might have missed or that someone might add accidentally (you might not expect the location of an object to change inside fracture_rock()) - it allows fracturing to take place on the other object chains if we ever need it (statues falling down stairs, perhaps?) - it doesn't move objects from other chains onto the floor briefly as the current code does --- src/explode.c | 6 ++---- src/zap.c | 14 ++++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/explode.c b/src/explode.c index cd8e92f1f..b755e1f9c 100644 --- a/src/explode.c +++ b/src/explode.c @@ -441,8 +441,7 @@ struct obj *obj; /* only scatter this obj */ && rn2(10)) { if (otmp->otyp == BOULDER) { pline("%s apart.", Tobjnam(otmp, "break")); - fracture_rock(otmp); /* this will place fragments on floor */ - obj_extract_self(otmp); + fracture_rock(otmp); place_object(otmp, sx, sy); if ((otmp = sobj_at(BOULDER, sx, sy)) != 0) { /* another boulder here, restack it to the top */ @@ -455,8 +454,7 @@ struct obj *obj; /* only scatter this obj */ if ((trap = t_at(sx,sy)) && trap->ttyp == STATUE_TRAP) deltrap(trap); pline("%s.", Tobjnam(otmp, "crumble")); - (void) break_statue(otmp); /*this will place fragments on floor */ - obj_extract_self(otmp); + (void) break_statue(otmp); place_object(otmp, sx, sy); /* put fragments on floor */ } used_up = TRUE; diff --git a/src/zap.c b/src/zap.c index 62ba27b0c..ca26d524c 100644 --- a/src/zap.c +++ b/src/zap.c @@ -3708,12 +3708,14 @@ register struct obj *obj; /* no texts here! */ obj->onamelth = 0; /* no names */ obj->oxlth = 0; /* no extra data */ obj->oattached = OATTACHED_NOTHING; - obj_extract_self(obj); /* move rocks back on top */ - place_object(obj, obj->ox, obj->oy); - if(!does_block(obj->ox,obj->oy,&levl[obj->ox][obj->oy])) - unblock_point(obj->ox,obj->oy); - if(cansee(obj->ox,obj->oy)) - newsym(obj->ox,obj->oy); + if (obj->where == OBJ_FLOOR) { + obj_extract_self(obj); /* move rocks back on top */ + place_object(obj, obj->ox, obj->oy); + if(!does_block(obj->ox,obj->oy,&levl[obj->ox][obj->oy])) + unblock_point(obj->ox,obj->oy); + if(cansee(obj->ox,obj->oy)) + newsym(obj->ox,obj->oy); + } } /* handle statue hit by striking/force bolt/pick-axe */ -- 2.40.0