Index: exec.c ================================================================== --- exec.c +++ exec.c @@ -722,11 +722,31 @@ if(hit&0x20000) goto success; 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 + objE=objLF; + while(objE!=VOIDLINK) { + oE=objects[objE]; + if(oE->height>0 && !(oE->oflags&(OF_VISUALONLY|OF_DESTROYED))) { + v=send_message(objE,obj,MSG_HIT,NVALUE(oE->x),NVALUE(oE->y),NVALUE(0x80008)); + 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); + } + objE=objRF; + while(objE!=VOIDLINK) { + oE=objects[objE]; + if(oE->height>0 && !(oE->oflags&(OF_VISUALONLY|OF_DESTROYED))) { + v=send_message(objE,obj,MSG_HIT,NVALUE(oE->x),NVALUE(oE->y),NVALUE(0x80008)); + 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); + } } } else { // Orthogonal movement if(hit) hit=(hit&0x0C000000)|0x800; objE=objF;