Index: exec.c ================================================================== --- exec.c +++ exec.c @@ -56,10 +56,11 @@ #define Xbit(a) ((a)%5-2) #define Ybit(a) (2-(a)/5) static Value send_message(Uint32 from,Uint32 to,Uint16 msg,Value arg1,Value arg2,Value arg3); static Uint32 broadcast(Uint32 from,int c,Uint16 msg,Value arg1,Value arg2,Value arg3,int s); +static Value destroy(Uint32 from,Uint32 to,Uint32 why); static const Sint8 x_delta[8]={1,1,0,-1,-1,-1,0,1}; static const Sint8 y_delta[8]={0,-1,-1,-1,0,1,1,1}; const char*value_string_ptr(Value v) { @@ -153,19 +154,10 @@ #define animfree free void objtrash(Uint32 n) { Object*o=objects[n]; if(!o) return; - if(o->anim && !(o->oflags&(OF_INVISIBLE|OF_BIZARRO))) { - //TODO: Check that the animation is actually playing - // If there is an animation, continue to display it, but let it have no effect on the game behaviour - // This may happen if the LASTIMAGE message destroys the object. - o->oflags=OF_DESTROYED|OF_STEALTHY|OF_VISUALONLY; - o->generation=0; - //TODO - return; - } animfree(o->anim); if(o->down==VOIDLINK) playfield[o->x+o->y*64-65]=o->up; else objects[o->down]->up=o->up; if(o->up!=VOIDLINK) objects[o->up]->down=o->down; o->down=o->up=VOIDLINK; @@ -232,10 +224,21 @@ if(objects[i]->class==c && !(objects[i]->oflags&OF_DESTROYED)) return i; i=objects[i]->up; } return VOIDLINK; } + +static Uint32 obj_layer_at(Uint8 b,Uint32 x,Uint32 y) { + Uint32 i; + if(x<1 || x>pfwidth || y<1 || y>pfheight) return VOIDLINK; + i=playfield[x+y*64-65]; + while(i!=VOIDLINK) { + if(!(objects[i]->oflags&OF_DESTROYED) && (classes[objects[i]->class]->collisionLayers&b)) return i; + i=objects[i]->up; + } + return VOIDLINK; +} static Uint32 obj_top_at(Uint32 x,Uint32 y) { Uint32 i,r; if(x<1 || x>pfwidth || y<1 || y>pfheight) return VOIDLINK; i=playfield[x+y*64-65]; @@ -262,17 +265,20 @@ static void sink(Uint32 x,Uint32 y) { // Before, x(o) was above y(p); now make y(p) above x(o) Object*o=objects[x]; Object*p=objects[y]; + int i=o->x+o->y*64-65; Value v; p->up=o->up; o->down=p->down; o->up=y; p->down=x; - if(!(o->oflags&p->oflags&OF_VISUALONLY)) v=send_message(x,y,MSG_FLOATED,NVALUE(0),NVALUE(0),NVALUE(0)); - if(!(o->oflags&p->oflags&OF_VISUALONLY)) send_message(y,x,MSG_SUNK,NVALUE(0),NVALUE(0),v); + if(o->down==VOIDLINK && !(o->oflags&OF_BIZARRO)) playfield[i]=x; + if(p->down==VOIDLINK && !(p->oflags&OF_BIZARRO)) playfield[i]=y; + v=send_message(x,y,MSG_FLOATED,NVALUE(0),NVALUE(0),NVALUE(0)); + if(!((o->oflags|p->oflags)&(OF_VISUALONLY|OF_DESTROYED))) send_message(y,x,MSG_SUNK,NVALUE(0),NVALUE(0),v); } static void change_density(Uint32 n,Sint32 v) { Object*o=objects[n]; Uint32 i; @@ -336,20 +342,75 @@ static inline int v_unsigned_greater(Value x,Value y) { if(x.t!=TY_NUMBER || y.t!=TY_NUMBER) Throw("Type mismatch"); return x.u>y.u; } + +static Uint8 collisions_at(Uint32 x,Uint32 y) { + Uint8 c=0; + Uint32 n; + if(x<1 || y<1 || x>pfwidth || y>pfheight) return 0; + n=playfield[x+y*64-65]; + while(n!=VOIDLINK) { + if(!(objects[n]->oflags&OF_DESTROYED)) c|=classes[objects[n]->class]->collisionLayers; + n=objects[n]->up; + } + return c; +} + +static Uint8 collide_with(Uint8 b,Uint32 n,Uint8 x,Uint8 y,Uint16 c) { + int i,j; + Uint8 r=0; + Uint32 e[8]={VOIDLINK,VOIDLINK,VOIDLINK,VOIDLINK,VOIDLINK,VOIDLINK,VOIDLINK,VOIDLINK}; + Uint8 re[8]={0,0,0,0,0,0,0,0}; + Value v; + if(StackProtection()) Throw("Call stack overflow"); + for(i=0;i<8;i++) if(b&(1<x),NVALUE(n==VOIDLINK?0:objects[n]->y),CVALUE(c)); + if(v.t) Throw("Type mismatch in COLLIDEBY"); + r|=re[i]=v.u; + } + if(!(r&0x01)) { + // See if we can destroy some objects to make room + b=classes[c]->collisionLayers; + if(obj_layer_at(b,x,y)==VOIDLINK) return r; + n=playfield[x+y*64-65]; + while(n!=VOIDLINK) { + if(!(objects[n]->oflags&OF_DESTROYED)) { + if(i=classes[objects[n]->class]->collisionLayers) { + i=__builtin_ctz(i); + if(e[i]!=n || !(re[i]&0x10)) return r|0x01; + } + } + n=objects[n]->up; + } + for(i=0;i<8;i++) { + if(e[i]!=VOIDLINK && (re[i]&0x10) && objects[e[i]]->x==x && objects[e[i]]->y==y && !(objects[e[i]]->oflags&OF_DESTROYED)) { + destroy(n,e[i],3); + } + } + if(obj_layer_at(b,x,y)!=VOIDLINK) r|=0x01; + } + return r; +} static Uint32 create(Uint32 from,Uint16 c,Uint32 x,Uint32 y,Uint32 im,Uint32 d) { Uint32 m,n; int i,xx,yy; Object*o; Object*p; Value v; if(d>7) d=0; if(x<1 || y<1 || x>pfwidth || y>pfheight) return VOIDLINK; - //TODO: Handle collisions + if(!(classes[c]->oflags&OF_BIZARRO) && (i=classes[c]->collisionLayers) && (xx=collisions_at(x,y)&i)) { + if(collide_with(xx,VOIDLINK,x,y,c)&0x01) return VOIDLINK; + } n=objalloc(c); if(n==VOIDLINK) return VOIDLINK; o=objects[n]; o->x=x; o->y=y; @@ -367,16 +428,16 @@ if(p->arrivals&(1<up; } } if(o->oflags&OF_DESTROYED) return VOIDLINK; - m=obj_above(n); + m=objects[n]->up; if(m!=VOIDLINK) { v=send_message(VOIDLINK,n,MSG_SUNK,NVALUE(0),NVALUE(0),v); while(m!=VOIDLINK) { send_message(n,m,MSG_FLOATED,NVALUE(0),NVALUE(0),v); - m=obj_above(m); + m=objects[m]->up; } } if(o->oflags&OF_DESTROYED) return VOIDLINK; return n; } @@ -387,18 +448,18 @@ int i,x,y,xx,yy; Uint32 n; if(to==VOIDLINK) return NVALUE(0); o=objects[to]; // EKS Hero Mesh doesn't check if it already destroyed. - v=send_message(from,to,MSG_DESTROY,NVALUE(0),NVALUE(0),NVALUE(why)); + v=why==8?NVALUE(0):send_message(from,to,MSG_DESTROY,NVALUE(0),NVALUE(0),NVALUE(why)); if(!v_bool(v)) { o->oflags|=OF_DESTROYED; if(firstobj==to) firstobj=o->next; if(lastobj==to) lastobj=o->prev; if(o->prev!=VOIDLINK) objects[o->prev]->next=o->next; if(o->next!=VOIDLINK) objects[o->next]->prev=o->prev; - if(!(o->oflags&OF_VISUALONLY)) { + if(why!=8 && !(o->oflags&OF_VISUALONLY)) { // Not checking for stealth; stealth only applies to movement, not destruction xx=o->x; yy=o->y; for(i=25;i>=0;i--) { x=xx+Xbit(i); y=yy+Ybit(i); if(x<1 || x>pfwidth || y<1 || y>pfheight) continue; @@ -411,10 +472,84 @@ } } } return v; } + +static int move_to(Uint32 from,Uint32 n,Uint32 x,Uint32 y) { + Uint32 m; + int i,xx,yy; + Object*o; + Object*p; + Value v; + if(n==VOIDLINK || (objects[n]->oflags&OF_DESTROYED)) return 0; + o=objects[n]; + if(lastimage_processing && (classes[o->class]->cflags&CF_COMPATIBLE)) Throw("Can't move during animation processing"); + if(x<1 || y<1 || x>pfwidth || y>pfheight) return 0; + if(v_bool(send_message(from,n,MSG_MOVING,NVALUE(x),NVALUE(y),NVALUE(0)))) return 0; + if(classes[o->class]->cflags&CF_PLAYER) { + m=lastobj; + while(m!=VOIDLINK) { + if(v_bool(send_message(n,m,MSG_PLAYERMOVING,NVALUE(x),NVALUE(y),OVALUE(from)))) return 0; + m=objects[m]->prev; + } + } + if(!(o->oflags&OF_BIZARRO) && (i=classes[o->class]->collisionLayers) && (xx=collisions_at(x,y)&i)) { + if((i=collide_with(xx,VOIDLINK,x,y,o->class))&0x01) return i&0x04?1:0; + } + if(!(o->oflags&((classes[o->class]->cflags&CF_COMPATIBLE?OF_VISUALONLY:0)|OF_STEALTHY))) { + for(i=25;i>=0;i--) { + xx=o->x+Xbit(i); yy=o->y+Ybit(i); + if(xx<1 || xx>pfwidth || yy<1 || yy>pfheight) continue; + m=playfield[xx+yy*64-65]; + while(m!=VOIDLINK) { + p=objects[m]; + if(p->departures&(1<departed|=1<up; + } + } + } + pfunlink(n); + o->distance+=abs(x-o->x)+abs(y-o->y); + o->x=x; + o->y=y; + pflink(n); + if(!(o->oflags&((classes[o->class]->cflags&CF_COMPATIBLE?OF_VISUALONLY:0)|OF_STEALTHY))) { + for(i=25;i>=0;i--) { + xx=x+Xbit(i); yy=y+Ybit(i); + if(xx<1 || xx>pfwidth || yy<1 || yy>pfheight) continue; + m=playfield[xx+yy*64-65]; + while(m!=VOIDLINK) { + p=objects[m]; + if(p->arrivals&(1<arrived|=1<up; + } + } + } + if(!(o->oflags&OF_VISUALONLY)) { + m=objects[n]->up; + if(m!=VOIDLINK) { + v=send_message(VOIDLINK,n,MSG_SUNK,NVALUE(0),NVALUE(0),v); + while(m!=VOIDLINK) { + send_message(n,m,MSG_FLOATED,NVALUE(0),NVALUE(0),v); + m=objects[m]->up; + } + } + } + // The OF_MOVED flag is set elsewhere, not here + return 1; +} + +static int jump_to(Uint32 from,Uint32 n,Uint32 x,Uint32 y) { + int xx,yy; + if(n==VOIDLINK) return 0; + xx=objects[n]->x; + yy=objects[n]->y; + if(!move_to(from,n,x,y)) return 0; + send_message(VOIDLINK,n,MSG_JUMPED,NVALUE(xx),NVALUE(yy),OVALUE(from)); + return 1; +} static void trace_stack(Uint32 obj) { Value t2=Pop(); Value t1=Pop(); Value t0=Pop(); @@ -580,10 +715,12 @@ case OP_ARRIVALS_EC: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->arrivals=t1.u; break; case OP_ARRIVED: StackReq(0,1); Push(NVALUE(o->arrived&0x1FFFFFF)); break; case OP_ARRIVED_C: StackReq(1,1); Push(GetVariableOf(arrived&0x1FFFFFF,NVALUE)); break; case OP_ARRIVED_E: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->arrived=t1.u; break; case OP_ARRIVED_EC: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->arrived=t1.u; break; + case OP_ASSASSINATE: NoIgnore(); destroy(obj,obj,8); break; + case OP_ASSASSINATE_C: NoIgnore(); StackReq(1,0); i=v_object(Pop()); destroy(obj,i,8); break; case OP_BAND: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.u&t2.u)); break; case OP_BNOT: StackReq(1,1); t1=Pop(); Numeric(t1); Push(NVALUE(~t1.u)); break; case OP_BOR: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.u|t2.u)); break; case OP_BROADCAST: StackReq(4,1); t4=Pop(); t3=Pop(); t2=Pop(); t1=Pop(); Push(v_broadcast(obj,t1,t2,t3,t4,NVALUE(0),0)); break; case OP_BROADCAST_D: StackReq(4,0); t4=Pop(); t3=Pop(); t2=Pop(); t1=Pop(); v_broadcast(obj,t1,t2,t3,t4,NVALUE(0),0); break; @@ -640,10 +777,14 @@ case OP_DISTANCE_C: StackReq(1,1); Push(GetVariableOf(distance,NVALUE)); break; case OP_DISTANCE_E: StackReq(1,0); t1=Pop(); Numeric(t1); o->distance=t1.u; break; case OP_DISTANCE_EC: StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->distance=t1.u; break; case OP_DIV: StackReq(2,1); t2=Pop(); DivideBy(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.u/t2.u)); break; case OP_DIV_C: StackReq(2,1); t2=Pop(); DivideBy(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.s/t2.s)); break; + case OP_DONE: StackReq(0,1); if(o->oflags&OF_DONE) Push(NVALUE(1)); else Push(NVALUE(0)); break; + case OP_DONE_C: StackReq(1,1); GetFlagOf(OF_DONE); break; + case OP_DONE_E: StackReq(1,0); if(v_bool(Pop())) o->oflags|=OF_DONE; else o->oflags&=~OF_BUSY; break; + case OP_DONE_EC: StackReq(2,0); SetFlagOf(OF_DONE); break; case OP_DROP: StackReq(1,0); Pop(); break; case OP_DROP_D: StackReq(2,0); Pop(); Pop(); break; case OP_DUP: StackReq(1,2); t1=Pop(); Push(t1); Push(t1); break; case OP_EQ: StackReq(2,1); t2=Pop(); t1=Pop(); Push(NVALUE(v_equal(t1,t2)?1:0)); break; case OP_FOR: NoIgnore(); StackReq(3,1); t3=Pop(); t2=Pop(); t1=Pop(); ptr=v_for(code,ptr,t1,t2,t3); break; @@ -678,10 +819,14 @@ case OP_INT32: StackReq(0,1); t1=UVALUE(code[ptr++]<<16,TY_NUMBER); t1.u|=code[ptr++]; Push(t1); break; case OP_INVISIBLE: StackReq(0,1); if(o->oflags&OF_INVISIBLE) Push(NVALUE(1)); else Push(NVALUE(0)); break; case OP_INVISIBLE_C: StackReq(1,1); GetFlagOf(OF_INVISIBLE); break; case OP_INVISIBLE_E: NoIgnore(); StackReq(1,0); if(v_bool(Pop())) o->oflags|=OF_INVISIBLE; else o->oflags&=~OF_INVISIBLE; break; case OP_INVISIBLE_EC: NoIgnore(); StackReq(2,0); SetFlagOf(OF_INVISIBLE); break; + case OP_JUMPTO: NoIgnore(); StackReq(2,1); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); Push(NVALUE(jump_to(obj,obj,t2.u,t3.u))); break; + case OP_JUMPTO_C: NoIgnore(); StackReq(3,1); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); i=v_object(Pop()); Push(NVALUE(jump_to(obj,i,t2.u,t3.u))); break; + case OP_JUMPTO_D: NoIgnore(); StackReq(2,0); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); jump_to(obj,obj,t2.u,t3.u); break; + case OP_JUMPTO_CD: NoIgnore(); StackReq(3,0); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); i=v_object(Pop()); jump_to(obj,i,t2.u,t3.u); break; case OP_KEY: StackReq(0,1); Push(NVALUE(current_key)); break; case OP_KEYCLEARED: StackReq(0,1); if(o->oflags&OF_KEYCLEARED) Push(NVALUE(1)); else Push(NVALUE(0)); break; case OP_KEYCLEARED_C: StackReq(1,1); GetFlagOf(OF_KEYCLEARED); break; case OP_KEYCLEARED_E: StackReq(1,0); if(v_bool(Pop())) o->oflags|=OF_KEYCLEARED; else o->oflags&=~OF_KEYCLEARED; break; case OP_KEYCLEARED_EC: StackReq(2,0); SetFlagOf(OF_KEYCLEARED); break; @@ -700,10 +845,14 @@ case OP_MOD_C: StackReq(2,1); t2=Pop(); DivideBy(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.s%t2.s)); break; case OP_MOVED: StackReq(0,1); if(o->oflags&OF_MOVED) Push(NVALUE(1)); else Push(NVALUE(0)); break; case OP_MOVED_C: StackReq(1,1); GetFlagOf(OF_MOVED); break; case OP_MOVED_E: NoIgnore(); StackReq(1,0); if(v_bool(Pop())) o->oflags|=OF_MOVED; else o->oflags&=~OF_MOVED; break; case OP_MOVED_EC: NoIgnore(); StackReq(2,0); SetFlagOf(OF_MOVED); break; + case OP_MOVETO: NoIgnore(); StackReq(2,1); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); Push(NVALUE(move_to(obj,obj,t2.u,t3.u))); break; + case OP_MOVETO_C: NoIgnore(); StackReq(3,1); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); i=v_object(Pop()); Push(NVALUE(move_to(obj,i,t2.u,t3.u))); break; + case OP_MOVETO_D: NoIgnore(); StackReq(2,0); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); move_to(obj,obj,t2.u,t3.u); break; + case OP_MOVETO_CD: NoIgnore(); StackReq(3,0); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); i=v_object(Pop()); move_to(obj,i,t2.u,t3.u); break; case OP_MSG: StackReq(0,1); Push(MVALUE(msgvars.msg)); break; case OP_MUL: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.u*t2.u)); break; case OP_MUL_C: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.s*t2.s)); break; case OP_NE: StackReq(2,1); t2=Pop(); t1=Pop(); Push(NVALUE(v_equal(t1,t2)?0:1)); break; case OP_NEG: StackReq(1,1); t1=Pop(); Numeric(t1); t1.s=-t1.s; Push(t1); break; @@ -715,10 +864,11 @@ case OP_OBJBELOW_C: StackReq(1,1); i=obj_below(v_object(Pop())); Push(OVALUE(i)); break; case OP_OBJBOTTOMAT: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); i=obj_bottom_at(t1.u,t2.u); Push(OVALUE(i)); break; case OP_OBJCLASSAT: StackReq(3,1); t3=Pop(); t2=Pop(); t1=Pop(); Push(v_obj_class_at(t1,t2,t3)); break; case OP_OBJDIR: StackReq(1,1); t2=Pop(); Numeric(t2); i=obj_dir(obj,t2.u); Push(OVALUE(i)); break; case OP_OBJDIR_C: StackReq(2,1); t2=Pop(); Numeric(t2); i=obj_dir(v_object(Pop()),t2.u); Push(OVALUE(i)); break; + case OP_OBJLAYERAT: StackReq(3,1); t3=Pop(); Numeric(t3); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); i=obj_layer_at(t1.u,t2.u,t3.u); Push(OVALUE(i)); break; case OP_OBJTOPAT: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); i=obj_top_at(t1.u,t2.u); Push(OVALUE(i)); break; case OP_PLAYER: StackReq(0,1); if(classes[o->class]->cflags&CF_PLAYER) Push(NVALUE(1)); else Push(NVALUE(0)); break; case OP_PLAYER_C: StackReq(1,1); GetClassFlagOf(CF_PLAYER); break; case OP_RET: return; case OP_RSH: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t2.u&~31?0:t1.u>>t2.u)); break; @@ -816,11 +966,11 @@ traceprefix=xrm_get_resource(resourcedb,optionquery,optionquery,2); if(!traceprefix) traceprefix=""; } if(msgvars.msg<256) s=standard_message_names[msgvars.msg]; else s=messages[msgvars.msg-256]; o=msgvars.from==VOIDLINK?0:objects[msgvars.from]; - printf("%s%d : %s%s : %d : %u %u",traceprefix,move_number,msgvars.msg<256?"":"#",s,vstackptr,o?o->generation:0,o?msgvars.from:0); + printf("%s%d : %s%s : %d : %u %u",traceprefix,move_number,msgvars.msg<256?"":"#",s,vstackptr,o?o->generation:0,msgvars.from); if(o) printf(" [$%s %d %d]",classes[o->class]->name,o->x,o->y); o=objects[obj]; printf(" : %u %u [$%s %d %d]",o->generation,obj,classes[o->class]->name,o->x,o->y); printf(" : %u %u : %u %u : %u %u\n",msgvars.arg1.t,msgvars.arg1.u,msgvars.arg2.t,msgvars.arg2.u,msgvars.arg3.t,msgvars.arg3.u); } Index: instruc ================================================================== --- instruc +++ instruc @@ -158,10 +158,11 @@ ,=UserSignal ,=UserState ,=VisualOnly ,=Stealthy ,=Moved +,=Done ,Destroyed ,Player ,Compatible ,CollisionLayers Self @@ -215,10 +216,11 @@ ,ObjAbove ,ObjBelow ObjBottomAt ObjClassAt ,ObjDir +ObjLayerAt ObjTopAt PopUp *PopUpArgs ; for (PopUp [number]) QueueTurn ; queue another turn that automatically occurs after this one .,Send Index: instruc.h ================================================================== --- instruc.h +++ instruc.h @@ -234,139 +234,144 @@ #define OP_STEALTHY_EC 39007 #define OP_MOVED 32864 #define OP_MOVED_C 34912 #define OP_MOVED_E 36960 #define OP_MOVED_EC 39008 -#define OP_DESTROYED 32865 -#define OP_DESTROYED_C 34913 -#define OP_PLAYER 32866 -#define OP_PLAYER_C 34914 -#define OP_COMPATIBLE 32867 -#define OP_COMPATIBLE_C 34915 -#define OP_COLLISIONLAYERS 32868 -#define OP_COLLISIONLAYERS_C 34916 -#define OP_SELF 32869 -#define OP_MSG 32870 -#define OP_FROM 32871 -#define OP_ARG1 32872 -#define OP_ARG1_E 36968 -#define OP_ARG2 32873 -#define OP_ARG2_E 36969 -#define OP_ARG3 32874 -#define OP_ARG3_E 36970 -#define OP_MOVENUMBER 32875 -#define OP_LEVEL 32876 -#define OP_KEY 32877 -#define OP_BACKGROUND 32878 -#define OP_INPUT 32879 -#define OP_QUIZ 32880 -#define OP_INPLACE 32881 -#define OP_DEFAULTIMAGE 32882 -#define OP_HELP 32883 -#define OP_EDITORHELP 32884 -#define OP_SUBS 32885 -#define OP_ANIMATE 32886 -#define OP_ASSASSINATE 32887 -#define OP_ASSASSINATE_C 34935 -#define OP_BROADCAST 32888 -#define OP_BROADCAST_D 41080 -#define OP_BROADCASTCLASS 32889 -#define OP_BROADCASTEX 32890 -#define OP_BROADCASTEX_D 41082 -#define OP_BROADCASTSUM 32891 -#define OP_BROADCASTSUMEX 32892 -#define OP_CREATE 32893 -#define OP_CREATE_D 41085 -#define OP_DELINVENTORY 32894 -#define OP_DELTA 32895 -#define OP_DESTROY 32896 -#define OP_DESTROY_C 34944 -#define OP_DESTROY_D 41088 -#define OP_DESTROY_CD 43136 -#define OP_FLUSHCLASS 32897 -#define OP_FLUSHOBJ 32898 -#define OP_GETINVENTORY 32899 -#define OP_HEIGHTAT 32900 -#define OP_IGNOREKEY 32901 -#define OP_INTMOVE 32902 -#define OP_INTMOVE_C 34950 -#define OP_INTMOVE_D 41094 -#define OP_INTMOVE_CD 43142 -#define OP_JUMPTO 32903 -#define OP_JUMPTO_C 34951 -#define OP_JUMPTO_D 41095 -#define OP_JUMPTO_CD 43143 -#define OP_LOC 32904 -#define OP_LOC_C 34952 -#define OP_LOCATEME 32905 -#define OP_LOSELEVEL 32906 -#define OP_MAXINVENTORY 32907 -#define OP_MOVE 32908 -#define OP_MOVE_C 34956 -#define OP_MOVE_D 41100 -#define OP_MOVE_CD 43148 -#define OP_MOVEPLUS 32909 -#define OP_MOVEPLUS_C 34957 -#define OP_MOVEPLUS_D 41101 -#define OP_MOVEPLUS_CD 43149 -#define OP_MOVETO 32910 -#define OP_MOVETO_C 34958 -#define OP_MOVETO_D 41102 -#define OP_MOVETO_CD 43150 -#define OP_NEWX 32911 -#define OP_NEWY 32912 -#define OP_OBJABOVE 32913 -#define OP_OBJABOVE_C 34961 -#define OP_OBJBELOW 32914 -#define OP_OBJBELOW_C 34962 -#define OP_OBJBOTTOMAT 32915 -#define OP_OBJCLASSAT 32916 -#define OP_OBJDIR 32917 -#define OP_OBJDIR_C 34965 -#define OP_OBJTOPAT 32918 -#define OP_POPUP 32919 -#define OP_POPUPARGS 32920 -#define OP_QUEUETURN 32921 -#define OP_SEND 32922 -#define OP_SEND_C 34970 -#define OP_SEND_D 41114 -#define OP_SEND_CD 43162 -#define OP_SENDEX 32923 -#define OP_SENDEX_C 34971 -#define OP_SENDEX_D 41115 -#define OP_SENDEX_CD 43163 -#define OP_SETINVENTORY 32924 -#define OP_SOUND 32925 -#define OP_TRACE 32926 -#define OP_VOLUMEAT 32927 -#define OP_WINLEVEL 32928 -#define OP_XDIR 32929 -#define OP_XDIR_C 34977 -#define OP_YDIR 32930 -#define OP_YDIR_C 34978 -#define OP_FUNCTION 32931 -#define OP_LOCAL 32932 -#define OP_LABEL 32933 -#define OP_STRING 32934 -#define OP_INT16 32935 -#define OP_INT32 32936 +#define OP_DONE 32865 +#define OP_DONE_C 34913 +#define OP_DONE_E 36961 +#define OP_DONE_EC 39009 +#define OP_DESTROYED 32866 +#define OP_DESTROYED_C 34914 +#define OP_PLAYER 32867 +#define OP_PLAYER_C 34915 +#define OP_COMPATIBLE 32868 +#define OP_COMPATIBLE_C 34916 +#define OP_COLLISIONLAYERS 32869 +#define OP_COLLISIONLAYERS_C 34917 +#define OP_SELF 32870 +#define OP_MSG 32871 +#define OP_FROM 32872 +#define OP_ARG1 32873 +#define OP_ARG1_E 36969 +#define OP_ARG2 32874 +#define OP_ARG2_E 36970 +#define OP_ARG3 32875 +#define OP_ARG3_E 36971 +#define OP_MOVENUMBER 32876 +#define OP_LEVEL 32877 +#define OP_KEY 32878 +#define OP_BACKGROUND 32879 +#define OP_INPUT 32880 +#define OP_QUIZ 32881 +#define OP_INPLACE 32882 +#define OP_DEFAULTIMAGE 32883 +#define OP_HELP 32884 +#define OP_EDITORHELP 32885 +#define OP_SUBS 32886 +#define OP_ANIMATE 32887 +#define OP_ASSASSINATE 32888 +#define OP_ASSASSINATE_C 34936 +#define OP_BROADCAST 32889 +#define OP_BROADCAST_D 41081 +#define OP_BROADCASTCLASS 32890 +#define OP_BROADCASTEX 32891 +#define OP_BROADCASTEX_D 41083 +#define OP_BROADCASTSUM 32892 +#define OP_BROADCASTSUMEX 32893 +#define OP_CREATE 32894 +#define OP_CREATE_D 41086 +#define OP_DELINVENTORY 32895 +#define OP_DELTA 32896 +#define OP_DESTROY 32897 +#define OP_DESTROY_C 34945 +#define OP_DESTROY_D 41089 +#define OP_DESTROY_CD 43137 +#define OP_FLUSHCLASS 32898 +#define OP_FLUSHOBJ 32899 +#define OP_GETINVENTORY 32900 +#define OP_HEIGHTAT 32901 +#define OP_IGNOREKEY 32902 +#define OP_INTMOVE 32903 +#define OP_INTMOVE_C 34951 +#define OP_INTMOVE_D 41095 +#define OP_INTMOVE_CD 43143 +#define OP_JUMPTO 32904 +#define OP_JUMPTO_C 34952 +#define OP_JUMPTO_D 41096 +#define OP_JUMPTO_CD 43144 +#define OP_LOC 32905 +#define OP_LOC_C 34953 +#define OP_LOCATEME 32906 +#define OP_LOSELEVEL 32907 +#define OP_MAXINVENTORY 32908 +#define OP_MOVE 32909 +#define OP_MOVE_C 34957 +#define OP_MOVE_D 41101 +#define OP_MOVE_CD 43149 +#define OP_MOVEPLUS 32910 +#define OP_MOVEPLUS_C 34958 +#define OP_MOVEPLUS_D 41102 +#define OP_MOVEPLUS_CD 43150 +#define OP_MOVETO 32911 +#define OP_MOVETO_C 34959 +#define OP_MOVETO_D 41103 +#define OP_MOVETO_CD 43151 +#define OP_NEWX 32912 +#define OP_NEWY 32913 +#define OP_OBJABOVE 32914 +#define OP_OBJABOVE_C 34962 +#define OP_OBJBELOW 32915 +#define OP_OBJBELOW_C 34963 +#define OP_OBJBOTTOMAT 32916 +#define OP_OBJCLASSAT 32917 +#define OP_OBJDIR 32918 +#define OP_OBJDIR_C 34966 +#define OP_OBJLAYERAT 32919 +#define OP_OBJTOPAT 32920 +#define OP_POPUP 32921 +#define OP_POPUPARGS 32922 +#define OP_QUEUETURN 32923 +#define OP_SEND 32924 +#define OP_SEND_C 34972 +#define OP_SEND_D 41116 +#define OP_SEND_CD 43164 +#define OP_SENDEX 32925 +#define OP_SENDEX_C 34973 +#define OP_SENDEX_D 41117 +#define OP_SENDEX_CD 43165 +#define OP_SETINVENTORY 32926 +#define OP_SOUND 32927 +#define OP_TRACE 32928 +#define OP_VOLUMEAT 32929 +#define OP_WINLEVEL 32930 +#define OP_XDIR 32931 +#define OP_XDIR_C 34979 +#define OP_YDIR 32932 +#define OP_YDIR_C 34980 +#define OP_FUNCTION 32933 +#define OP_LOCAL 32934 +#define OP_LABEL 32935 +#define OP_STRING 32936 +#define OP_INT16 32937 +#define OP_INT32 32938 #ifdef HEROMESH_CLASS static const Op_Names op_names[]={ {"*",8486933}, {"+",8421395}, {"-",8421396}, {".",10518528}, {"/",8486934}, {"ANHH",8389394}, {"ARRIVED",8389124}, -{"Animate",8421494}, -{"Arg1",8552552}, -{"Arg2",8552553}, -{"Arg3",8552554}, +{"Animate",8421495}, +{"Arg1",8552553}, +{"Arg2",8552554}, +{"Arg3",8552555}, {"Arrivals",8618071}, {"Arrived",8618069}, -{"Assassinate",8487031}, +{"Assassinate",8487032}, {"B",9437196}, {"BANG",8389380}, {"BEDOINGNG",8389406}, {"BEEDEEP",8389404}, {"BEGIN_TURN",8389123}, @@ -375,15 +380,15 @@ {"BOUNCE",8389415}, {"BRRREEET",8389396}, {"BRRRT",8389395}, {"BUZZER",8389420}, {"BWEEP",8389397}, -{"Background",8683630}, -{"Broadcast",10518648}, -{"BroadcastEx",10518650}, -{"BroadcastSum",8421499}, -{"BroadcastSumEx",8421500}, +{"Background",8683631}, +{"Broadcast",10518649}, +{"BroadcastEx",10518651}, +{"BroadcastSum",8421500}, +{"BroadcastSumEx",8421501}, {"Busy",8618073}, {"CHEEP",8389393}, {"CHYEW",8389392}, {"CLEANUP",8389140}, {"CLICK",8389388}, @@ -391,119 +396,121 @@ {"COLLIDEBY",8389141}, {"CREATE",8389121}, {"CREATED",8389137}, {"Class",8486955}, {"Climb",9142335}, -{"CollisionLayers",8487012}, -{"Compatible",8487011}, -{"Create",10518653}, +{"CollisionLayers",8487013}, +{"Compatible",8487012}, +{"Create",10518654}, {"DEEP_POP",8389417}, {"DEPARTED",8389125}, {"DESTROY",8389122}, {"DESTROYED",8389136}, {"DINK",8389390}, {"DOOR",8389378}, {"DRLRLRINK",8389398}, {"DYUPE",8389413}, -{"DefaultImage",8683634}, -{"DelInventory",8421502}, -{"Delta",8421503}, +{"DefaultImage",8683635}, +{"DelInventory",8421503}, +{"Delta",8421504}, {"Density",9142327}, {"Departed",8618070}, {"Departures",8618072}, -{"Destroy",10584192}, -{"Destroyed",8487009}, +{"Destroy",10584193}, +{"Destroyed",8487010}, {"Dir",8618033}, {"Distance",9142325}, +{"Done",8618081}, {"E",9437184}, {"END_TURN",8389139}, -{"EditorHelp",8683636}, +{"EditorHelp",8683637}, {"F",9437192}, {"FAROUT",8389421}, {"FFFFTT",8389399}, {"FLOATED",8389132}, {"FROG",8389383}, -{"FlushClass",8421505}, -{"FlushObj",8421506}, -{"From",8421479}, +{"FlushClass",8421506}, +{"FlushObj",8421507}, +{"From",8421480}, {"GLASS",8389379}, {"GLISSANT",8389419}, -{"GetInventory",8421507}, +{"GetInventory",8421508}, {"HAWK",8389425}, {"HEARTBEAT",8389407}, {"HIT",8389134}, {"HITBY",8389135}, {"Hard",8618051}, {"Height",9142333}, -{"HeightAt",8421508}, -{"Help",8683635}, +{"HeightAt",8421509}, +{"Help",8683636}, {"INIT",8389120}, -{"IgnoreKey",8421509}, +{"IgnoreKey",8421510}, {"Image",8618034}, -{"InPlace",8683633}, +{"InPlace",8683634}, {"Inertia",9142323}, -{"Input",8683631}, -{"IntMove",10584198}, +{"Input",8683632}, +{"IntMove",10584199}, {"Invisible",8618074}, {"JAYAYAYNG",8389416}, {"JUMPED",8389128}, -{"JumpTo",10584199}, +{"JumpTo",10584200}, {"KEWEL",8389422}, {"KEY",8389129}, {"KLECK",8389387}, {"KLINKK",8389385}, -{"Key",8421485}, +{"Key",8421486}, {"KeyCleared",8618075}, {"L",9437194}, {"LASTIMAGE",8389126}, {"LB",9437195}, {"LF",9437193}, {"LOCK",8389408}, {"LOOP",8388610}, -{"Level",8421484}, -{"Loc",8487048}, -{"LocateMe",8421513}, -{"LoseLevel",8421514}, +{"Level",8421485}, +{"Loc",8487049}, +{"LocateMe",8421514}, +{"LoseLevel",8421515}, {"MOVED",8389127}, {"MOVING",8389130}, -{"MaxInventory",8421515}, +{"MaxInventory",8421516}, {"Misc1",9142343}, {"Misc2",9142345}, {"Misc3",9142347}, {"Misc4",9142349}, {"Misc5",9142351}, {"Misc6",9142353}, {"Misc7",9142355}, -{"Move",10584204}, -{"Move+",10584205}, -{"MoveNumber",8421483}, -{"MoveTo",10584206}, +{"Move",10584205}, +{"Move+",10584206}, +{"MoveNumber",8421484}, +{"MoveTo",10584207}, {"Moved",8618080}, -{"Msg",8421478}, +{"Msg",8421479}, {"N",9437186}, {"NE",9437185}, {"NW",9437187}, -{"NewX",8421519}, -{"NewY",8421520}, +{"NewX",8421520}, +{"NewY",8421521}, {"OLDPHONE",8389402}, {"ONCE",8388609}, {"OSC",8388616}, {"OSCLOOP",8388618}, -{"ObjAbove",8487057}, -{"ObjBelow",8487058}, -{"ObjBottomAt",8421523}, -{"ObjClassAt",8421524}, -{"ObjDir",8487061}, -{"ObjTopAt",8421526}, +{"ObjAbove",8487058}, +{"ObjBelow",8487059}, +{"ObjBottomAt",8421524}, +{"ObjClassAt",8421525}, +{"ObjDir",8487062}, +{"ObjLayerAt",8421527}, +{"ObjTopAt",8421528}, {"PLAYERMOVING",8389133}, {"POSTINIT",8389138}, {"POUR",8389377}, {"POWER",8389386}, -{"Player",8487010}, -{"PopUp",8421527}, -{"QueueTurn",8421529}, -{"Quiz",8683632}, +{"Player",8487011}, +{"PopUp",8421529}, +{"QueueTurn",8421531}, +{"Quiz",8683633}, {"R",9437198}, {"RATCHET1",8389418}, {"RATCHET2",8389412}, {"RATTLE",8389403}, {"RB",9437197}, @@ -512,47 +519,47 @@ {"SE",9437191}, {"SMALL_POP",8389389}, {"SPLASH",8389376}, {"STEAM",8389424}, {"STOP",8388608}, -{"SUBS",8683637}, +{"SUBS",8683638}, {"SUNK",8389131}, {"SW",9437189}, -{"Self",8421477}, -{"Send",10584218}, -{"SendEx",10584219}, -{"SetInventory",8421532}, +{"Self",8421478}, +{"Send",10584220}, +{"SendEx",10584221}, +{"SetInventory",8421534}, {"Shape",8618030}, {"ShapeDir",8618053}, {"Sharp",8618052}, {"Shovable",8618054}, -{"Sound",8421533}, +{"Sound",8421535}, {"Stealthy",8618079}, {"Strength",9142337}, {"TAHTASHH",8389409}, {"THMP_thmp",8389405}, {"THWIT",8389384}, {"TICK",8389391}, {"Temperature",9142316}, -{"Trace",8421534}, +{"Trace",8421536}, {"UH_OH",8389382}, {"UNCORK",8389414}, {"UNHH",8389381}, {"UserSignal",8618076}, {"UserState",8618077}, {"VACUUM",8389411}, {"VisualOnly",8618078}, {"Volume",9142329}, -{"VolumeAt",8421535}, +{"VolumeAt",8421537}, {"W",9437188}, {"WAHOO",8389400}, {"WHACK",8389423}, {"Weight",9142331}, -{"WinLevel",8421536}, -{"XDir",8487073}, +{"WinLevel",8421538}, +{"XDir",8487075}, {"Xloc",8486959}, -{"YDir",8487074}, +{"YDir",8487076}, {"YEEHAW",8389401}, {"Yloc",8486960}, {"again",8683530}, {"band",8421403}, {"begin",8683529}, @@ -620,7 +627,7 @@ {"then",8683527}, {"tuck",8421380}, {"until",8683531}, {"while",8683532}, }; -#define N_OP_NAMES 270 +#define N_OP_NAMES 272 #endif