1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
|
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
|
-
+
|
if(a==VOIDLINK || b==VOIDLINK) return 0;
if((objects[a]->oflags|objects[b]->oflags)&OF_DESTROYED) return 0;
if((objects[a]->oflags^objects[b]->oflags)&OF_BIZARRO) return 0;
return (objects[a]->x==objects[b]->x && objects[a]->y==objects[b]->y);
}
static Uint32 pat_find_at(int xy,Uint32 m4,Uint32 m5,Uint32 m6,Uint32 m7,Uint8 cl) {
Uint8 n=playfield[xy];
Uint32 n=playfield[xy];
Object*o;
while(n!=VOIDLINK) {
o=objects[n];
if(!(o->oflags&(OF_DESTROYED|OF_VISUALONLY))) {
if(o->misc4.t==TY_SOUND || o->misc4.t==TY_USOUND) Throw("Cannot convert sound to type");
if(o->misc5.t==TY_SOUND || o->misc5.t==TY_USOUND) Throw("Cannot convert sound to type");
if(o->misc6.t==TY_SOUND || o->misc6.t==TY_USOUND) Throw("Cannot convert sound to type");
|
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
|
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
|
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
|
x+=x_delta[(code[ptr-1]+objects[obj]->dir)&7];
y+=y_delta[(code[ptr-1]+objects[obj]->dir)&7];
if(x<1 || x>pfwidth || y<1 || y>pfheight) goto fail;
break;
case 0x0200 ... 0x02FF:
g=code[ptr-1]&255;
goto message;
case 0x1000 ... 0x10FF:
case 0x1000 ... 0x11FF:
g=code[ptr-1]&255;
if(g<0x20) n=pat_find_at(x+y*64-65,1UL<<(g&31),0,0,0,0);
else if(g<0x40) n=pat_find_at(x+y*64-65,0,1UL<<(g&31),0,0,0);
else if(g<0x60) n=pat_find_at(x+y*64-65,0,0,1UL<<(g&31),0,0);
else if(g<0x80) n=pat_find_at(x+y*64-65,0,0,0,1UL<<(g&31),0);
else n=pat_find_at(x+y*64-65,0,0,0,0,1U<<(g&7));
if(n==VOIDLINK) goto fail;
if(g<0x20) m=pat_find_at(x+y*64-65,1UL<<(g&31),0,0,0,0);
else if(g<0x40) m=pat_find_at(x+y*64-65,0,1UL<<(g&31),0,0,0);
else if(g<0x60) m=pat_find_at(x+y*64-65,0,0,1UL<<(g&31),0,0);
else if(g<0x80) m=pat_find_at(x+y*64-65,0,0,0,1UL<<(g&31),0);
else m=pat_find_at(x+y*64-65,0,0,0,0,1U<<(g&7));
if(code[ptr-1]&0x0100) {
if(m!=VOIDLINK) goto fail;
} else {
n=m;
if(n==VOIDLINK) goto fail;
}
break;
case 0x4000 ... 0x7FFF:
n=obj_class_at(code[ptr-1]&0x3FFF,x,y);
if(n==VOIDLINK) goto fail;
break;
case 0xC000 ... 0xFFFF:
g=(code[ptr-1]&0x3FFF)+256;
|