Index: exec.c ================================================================== --- exec.c +++ exec.c @@ -498,10 +498,28 @@ 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 Uint32 v_is(Value x,Value y) { + Uint32 n; + if(x.t==TY_NUMBER && !x.u) { + return 0; + } else if(x.t>TY_MAXTYPE && y.t==TY_CLASS) { + n=v_object(x); + return (objects[n]->class==y.u)?1:0; + //TODO: subclassing (using CF_GROUP) + } else if((x.t>TY_MAXTYPE || x.t==TY_CLASS) && y.t==TY_NUMBER && !y.u) { + return 1; + } else if(x.t==TY_CLASS && y.t==TY_CLASS) { + return (x.u==y.u)?1:0; + //TODO: subclassing (using CF_GROUP) + } else { + Throw("Type mismatch"); + } +} static Uint8 collisions_at(Uint32 x,Uint32 y) { Uint8 c=0; Uint32 n; if(x<1 || y<1 || x>pfwidth || y>pfheight) return 0; @@ -579,11 +597,11 @@ 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<arrivals&(1<up; } } if(o->oflags&OF_DESTROYED) return VOIDLINK; m=objects[n]->up; @@ -1309,10 +1327,11 @@ case OP_INTMOVE_CD: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) move_dir(obj,i,t1.u); 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_IS: StackReq(2,1); t2=Pop(); t1=Pop(); Push(NVALUE(v_is(t1,t2))); 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;