Index: exec.c ================================================================== --- exec.c +++ exec.c @@ -708,10 +708,11 @@ if(objLF!=VOIDLINK) vol+=volume_at(objects[objLF]->x,objects[objLF]->y); if(objRF!=VOIDLINK) vol+=volume_at(objects[objRF]->x,objects[objRF]->y); if(vol<=max_volume) { objE=objF; while(objE!=VOIDLINK) { + if(o->oflags&(OF_DESTROYED|OF_VISUALONLY)) break; oE=objects[objE]; if(oE->height>0) { v=send_message(objE,obj,MSG_HIT,NVALUE(oE->x),NVALUE(oE->y),NVALUE(hit|0x80000)); if(v.t) Throw("Type mismatch in HIT/HITBY"); hit=v.u&(classes[o->class]->cflags&CF_COMPATIBLE?0xFC098F7F:-1); @@ -732,10 +733,11 @@ if(move_to(from,obj,oF->x,oF->y)) goto success; else goto fail; } } } else { // Volume is too much; hit the objects it won't go between + if(o->oflags&(OF_DESTROYED|OF_VISUALONLY)) goto fail; objE=objLF; while(objE!=VOIDLINK) { oE=objects[objE]; if(oE->height>0) { v=send_message(objE,obj,MSG_HIT,NVALUE(oE->x),NVALUE(oE->y),NVALUE(0x80008)); @@ -742,10 +744,11 @@ if(v.t) Throw("Type mismatch in HIT/HITBY"); if(!(v.u&1)) v=send_message(obj,objE,MSG_HITBY,NVALUE(o->x),NVALUE(o->y),NVALUE(v.u|0x80008)); } objE=obj_below(objE); } + if(o->oflags&(OF_DESTROYED|OF_VISUALONLY)) goto fail; objE=objRF; while(objE!=VOIDLINK) { oE=objects[objE]; if(oE->height>0) { v=send_message(objE,obj,MSG_HIT,NVALUE(oE->x),NVALUE(oE->y),NVALUE(0x80008)); @@ -759,10 +762,11 @@ // Orthogonal movement if(hit) hit=(hit&0x0C000000)|0x800; if(!oF) goto fail; objE=objF; while(objE!=VOIDLINK) { + if(o->oflags&(OF_DESTROYED|OF_VISUALONLY)) break; oE=objects[objE]; if(oE->height>0) { hit&=~7; // HIT/HITBY messages v=send_message(objE,obj,MSG_HIT,NVALUE(oE->x),NVALUE(oE->y),NVALUE(hit));