5 unsigned long Color16To32(unsigned short c)
\r
10 Temp.R = (((c & 0xF800) >> 11) * 255) / 31;
\r
11 Temp.G = (((c & 0x07E0) >> 5) * 255) / 63;
\r
12 Temp.B = ((c & 0x001F) * 255) / 31;
\r
13 return(*(unsigned long *)&Temp);
\r
16 unsigned short Color32To16(unsigned long c)
\r
19 unsigned short Result;
\r
21 *(unsigned long *)&Temp = c;
\r
22 Result = (((unsigned short)Temp.R * 31) / 255) << 11;
\r
23 Result |= (((unsigned short)Temp.G * 63) / 255) << 5;
\r
24 Result |= ((unsigned short)Temp.B * 31) / 255;
\r
28 signed short GetArg(unsigned char *Code, unsigned short *Offset, signed short *Variables)
\r
30 unsigned char ArgType;
\r
31 signed short Result;
\r
33 ArgType = Code[*Offset];
\r
37 Result = (signed short)((unsigned short)Code[*Offset + 1] + (unsigned short)(Code[*Offset + 2] << 8));
\r
41 Result = Regs[Code[*Offset + 1]];
\r
45 Result = Variables[Code[*Offset + 1]];
\r
52 void Execute(unsigned char *WorkCode, signed short *Variables, unsigned short StartOffset)
\r
54 unsigned short Offset;
\r
55 unsigned char Finished;
\r
56 unsigned short DestroyObject;
\r
57 unsigned short ObjectNum;
\r
58 unsigned short SpriteNum;
\r
59 unsigned short Instruction;
\r
60 signed short Damage, Damage2;
\r
61 signed short x, y, x2, y2, xv, yv;
\r
62 signed short Data, Data2, Angle;
\r
63 unsigned short dx, dy;
\r
64 unsigned char Frame;
\r
65 unsigned char Smokes;
\r
67 unsigned char Register, Player, Reg2, Reg3, Reg4, Reg5, Reg6;
\r
68 unsigned char Data3, Data4;
\r
69 unsigned short Color;
\r
71 unsigned char DisplayInfo;
\r
72 unsigned char Choice;
\r
73 unsigned short LocalStackPos;
\r
76 static unsigned short DbgPtr = 0;
\r
81 Offset = StartOffset;
\r
83 while(Finished == 0)
\r
85 if((DebugMode == 1) && (DisplayInfo == 1))
\r
87 for(i = 0; i < NumClasses; i++)
\r
89 if(WorkCode == Classes[i]->Code)
\r
92 DBFRect(33, 58, 287, 142, MakeColor(0, 255, 0));
\r
93 DBFRect(34, 59, 286, 141, MakeColor(0, 0, 0));
\r
94 Data = sprintf(TextBuffer, "Debugging!\n\n\rClass: %u\n\rOffset: %u\n\n\rCode dump:\n\r", i, Offset);
\r
95 for(y = 0; y < 2; y++)
\r
97 for(x = 0; x < 15; x++)
\r
99 Data += sprintf(TextBuffer + Data, " %02X", WorkCode[Offset + x + (y * 15)]);
\r
101 Data += sprintf(TextBuffer + Data, "\n\r");
\r
103 sprintf(TextBuffer + Data, "\0");
\r
104 DBPrint(TextBuffer, 35, 60, 255);
\r
105 Data = sprintf(TextBuffer, "Register dump:\n\r");
\r
106 for(y = 0; y < 4; y++)
\r
108 for(x = 0; x < 8; x++)
\r
110 Data += sprintf(TextBuffer + Data, " %-6i", Regs[x + (y * 8)]);
\r
112 Data += sprintf(TextBuffer + Data, "\n\r");
\r
114 sprintf(TextBuffer + Data, "\0");
\r
115 DBPrint(TextBuffer, 35, 105, 255);
\r
117 while(KeyTable[57] == 0)
\r
120 if(KeyTable[203] == 1)
\r
124 while(KeyTable[203] == 1)
\r
127 if(KeyTable[205] == 1)
\r
131 while(KeyTable[205] == 1)
\r
134 sprintf(TextBuffer, " %cStep %cRun to return %cComplete\0", (unsigned short)(Choice == 0)?45:32, (unsigned short)(Choice == 1)?45:32, (unsigned short)(Choice == 2)?45:32);
\r
135 DBPrint(TextBuffer, 35, 135, 255);
\r
138 while(KeyTable[57] == 1)
\r
145 Instruction = (unsigned short)WorkCode[Offset] + ((unsigned short)WorkCode[Offset + 1] << 8);
\r
147 switch(Instruction)
\r
150 if(DisplayInfo == 2)
\r
152 if(LocalStackPos == 0)
\r
156 Offset = Stack[--StackPos];
\r
160 case 1: //DestroyObject
\r
161 DestroyObject = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
162 RemoveHitTest(DestroyObject);
\r
163 if(Objects[DestroyObject]->SpriteLink != 0xFFFF)
\r
164 Sprites[Objects[DestroyObject]->SpriteLink]->Used = 0;
\r
165 Objects[DestroyObject]->SpriteLink = 0xFFFF;
\r
166 Objects[DestroyObject]->Used = 2;
\r
168 case 2: //SpawnExplosion
\r
169 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
170 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
171 Frame = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
172 Smokes = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
173 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
174 SpawnExplosion(x, y, Frame, Smokes, (unsigned char)Data);
\r
176 case 3: //StoreRandom
\r
177 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
178 Max = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
179 Regs[Register] = rand() % Max;
\r
182 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
183 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
184 Regs[Register] = Data;
\r
187 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
188 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
189 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
190 Regs[Register] = Data + Data2;
\r
193 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
194 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
195 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
196 Regs[Register] = (Data == Data2)?1:0;
\r
199 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
200 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
204 case 8: //SpawnPixel
\r
205 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
206 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
207 xv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
208 yv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
209 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
210 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
211 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
212 Damage = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
213 Color = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
214 SpawnPixel((unsigned short)x, (unsigned short)y, (float)xv / 100, (float)yv / 100, Player, (unsigned char)Data, (unsigned char)Data2, Damage, Color16To32(Color));
\r
216 case 9: //NotEquals
\r
217 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
218 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
219 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
220 Regs[Register] = (Data != Data2)?1:0;
\r
222 case 10: //Substract
\r
223 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
224 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
225 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
226 Regs[Register] = Data - Data2;
\r
228 case 11: //SpawnObject
\r
229 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
230 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
231 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
232 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
233 xv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
234 yv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
235 SpawnObject((unsigned short)Data, (unsigned char)Data2, (unsigned short)x, (unsigned short)y, (float)xv / 100, (float)yv / 100);
\r
238 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
241 case 13: //StoreVariable
\r
242 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
243 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
244 Variables[Data] = Data2;
\r
246 case 14: //GetLevelInfo
\r
247 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
248 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
249 if(Data == 0) Regs[Register] = LevelWidth;
\r
250 if(Data == 1) Regs[Register] = LevelHeight;
\r
251 if(Data == 2) Regs[Register] = (signed short)LevelFinished;
\r
252 if(Data == 3) Regs[Register] = (signed short)GameType;
\r
253 if(Data == 4) Regs[Register] = (signed short)((Gravity + 0.005) * 100);
\r
255 case 15: //SetPlayerInfo
\r
256 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
257 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
258 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
259 if(Data == 0) Players[Player]->Object = (unsigned short)Data2;
\r
260 if(Data == 1) Players[Player]->VPObject = (unsigned short)Data2;
\r
261 if(Data == 2) Players[Player]->Used = (unsigned char)Data2;
\r
262 if(Data == 3) Players[Player]->Angle = (float)Data2;
\r
263 if(Data == 4) Players[Player]->Dir = (unsigned char)Data2;
\r
264 if(Data == 5) Players[Player]->CrossColor = (unsigned long)Color16To32(Data2);
\r
265 if(Data == 6) Players[Player]->Left = (unsigned char)Data2;
\r
266 if(Data == 7) Players[Player]->Right = (unsigned char)Data2;
\r
267 if(Data == 8) Players[Player]->Up = (unsigned char)Data2;
\r
268 if(Data == 9) Players[Player]->Down = (unsigned char)Data2;
\r
269 if(Data == 10) Players[Player]->Shoot = (unsigned char)Data2;
\r
270 if(Data == 11) Players[Player]->Change = (unsigned char)Data2;
\r
271 if(Data == 13) Players[Player]->Health = (unsigned short)Data2;
\r
272 if(Data == 14) Players[Player]->MaxHealth = (unsigned short)Data2;
\r
273 if(Data == 15) Players[Player]->Kills = Data2;
\r
274 if(Data == 16) Players[Player]->Lives = Data2;
\r
275 if(Data == 18) Players[Player]->JustShot = (unsigned char)Data2;
\r
276 if(Data == 18) Players[Player]->CurWeapon = Data2;
\r
278 case 16: //GetPlayerInfo
\r
279 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
280 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
281 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
282 if(Data == 0) Regs[Register] = (signed short)Players[Player]->Object;
\r
283 if(Data == 1) Regs[Register] = (signed short)Players[Player]->VPObject;
\r
284 if(Data == 2) Regs[Register] = (signed short)Players[Player]->Used;
\r
285 if(Data == 3) Regs[Register] = (signed short)Players[Player]->Angle;
\r
286 if(Data == 4) Regs[Register] = (signed short)Players[Player]->Dir;
\r
287 if(Data == 5) Regs[Register] = (signed short)Players[Player]->CrossColor;
\r
288 if(Data == 6) Regs[Register] = (signed short)Players[Player]->Left;
\r
289 if(Data == 7) Regs[Register] = (signed short)Players[Player]->Right;
\r
290 if(Data == 8) Regs[Register] = (signed short)Players[Player]->Up;
\r
291 if(Data == 9) Regs[Register] = (signed short)Players[Player]->Down;
\r
292 if(Data == 10) Regs[Register] = (signed short)Players[Player]->Shoot;
\r
293 if(Data == 11) Regs[Register] = (signed short)Players[Player]->Change;
\r
296 Angle = Players[Player]->Angle;
\r
299 if(Players[Player]->Dir == 1)
\r
300 Angle = 180 - Angle;
\r
303 Regs[Register] = Angle;
\r
305 if(Data == 13) Regs[Register] = (signed short)Players[Player]->Health;
\r
306 if(Data == 14) Regs[Register] = (signed short)Players[Player]->MaxHealth;
\r
307 if(Data == 15) Regs[Register] = (signed short)Players[Player]->Kills;
\r
308 if(Data == 16) Regs[Register] = (signed short)Players[Player]->Lives;
\r
309 if(Data == 17) Regs[Register] = (signed short)Players[Player]->JustShot;
\r
310 if(Data == 18) Regs[Register] = (signed short)Players[Player]->CurWeapon;
\r
312 case 17: //SetObjectInfo
\r
313 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
314 ObjectNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
315 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
316 if(Data == 0) Objects[ObjectNum]->x = (float)Data2;
\r
317 if(Data == 1) Objects[ObjectNum]->y = (float)Data2;
\r
318 if(Data == 2) Objects[ObjectNum]->xv = (float)Data2 / 100;
\r
319 if(Data == 3) Objects[ObjectNum]->yv = (float)Data2 / 100;
\r
320 if(Data == 4) Objects[ObjectNum]->SpriteLink = (unsigned short)Data2;
\r
321 if(Data == 5) Objects[ObjectNum]->Owner = (unsigned char)Data2;
\r
322 if(Data == 6) Objects[ObjectNum]->Class = (unsigned short)Data2;
\r
323 if(Data == 7) Objects[ObjectNum]->Used = (unsigned char)Data2;
\r
324 if(Data == 8) Objects[ObjectNum]->xv = (float)(signed short)Objects[ObjectNum]->xv + ((float)Data2 / 10000);
\r
325 if(Data == 9) Objects[ObjectNum]->yv = (float)(signed short)Objects[ObjectNum]->yv + ((float)Data2 / 10000);
\r
327 case 18: //GetObjectInfo
\r
328 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
329 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
330 ObjectNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
331 if(Data == 0) Regs[Register] = (signed short)Objects[ObjectNum]->x;
\r
332 if(Data == 1) Regs[Register] = (signed short)Objects[ObjectNum]->y;
\r
333 if(Data == 2) Regs[Register] = (signed short)(Objects[ObjectNum]->xv * 100);
\r
334 if(Data == 3) Regs[Register] = (signed short)(Objects[ObjectNum]->yv * 100);
\r
335 if(Data == 4) Regs[Register] = (signed short)Objects[ObjectNum]->SpriteLink;
\r
336 if(Data == 5) Regs[Register] = (signed short)Objects[ObjectNum]->Owner;
\r
337 if(Data == 6) Regs[Register] = (signed short)Objects[ObjectNum]->Class;
\r
338 if(Data == 7) Regs[Register] = (signed short)Objects[ObjectNum]->Used;
\r
339 if(Data == 8) Regs[Register] = (signed short)((Objects[ObjectNum]->xv - (float)(signed short)Objects[ObjectNum]->xv) * 10000);
\r
340 if(Data == 9) Regs[Register] = (signed short)((Objects[ObjectNum]->yv - (float)(signed short)Objects[ObjectNum]->yv) * 10000);
\r
342 case 19: //ChangeSign
\r
343 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
344 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
345 Regs[Register] = -Data;
\r
347 case 20: //Multiply
\r
348 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
349 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
350 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
351 Regs[Register] = Data * Data2;
\r
354 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
355 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
356 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
357 Regs[Register] = Data / Data2;
\r
360 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
361 if(StackPos < MAX_STACK)
\r
363 Stack[StackPos++] = Offset;
\r
367 sprintf(TextBuffer, "Stack overflow!\n\n\n\rPress space to continue...\0");
\r
368 DBFRect(68, 88, 252, 112, MakeColor(255, 0, 0));
\r
369 DBFRect(69, 89, 251, 111, MakeColor(0, 0, 0));
\r
370 DBPrint(TextBuffer, 70, 90, 255);
\r
372 while(KeyTable[57] == 1)
\r
374 while(KeyTable[57] == 0)
\r
378 case 23: //SetSpriteInfo
\r
379 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
380 SpriteNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
381 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
382 if((unsigned short)SpriteNum == 0xFFFF)
\r
384 if(Data == 0) Sprites[SpriteNum]->CurFrame = (unsigned char)Data2;
\r
385 if(Data == 1) Sprites[SpriteNum]->AnimTimer = (unsigned char)Data2;
\r
386 if(Data == 2) Sprites[SpriteNum]->AnimDelay = (unsigned char)Data2;
\r
387 if(Data == 3) Sprites[SpriteNum]->Transparent = (unsigned char)Data2;
\r
388 if(Data == 4) Sprites[SpriteNum]->x = (signed short)Data2;
\r
389 if(Data == 5) Sprites[SpriteNum]->y = (signed short)Data2;
\r
391 case 24: //GetSpriteInfo
\r
392 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
393 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
394 SpriteNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
395 if((unsigned short)SpriteNum == 0xFFFF)
\r
397 if(Data == 0) Regs[Register] = (signed short)Sprites[SpriteNum]->CurFrame;
\r
398 if(Data == 1) Regs[Register] = (signed short)Sprites[SpriteNum]->AnimTimer;
\r
399 if(Data == 2) Regs[Register] = (signed short)Sprites[SpriteNum]->AnimDelay;
\r
400 if(Data == 3) Regs[Register] = (signed short)Sprites[SpriteNum]->Transparent;
\r
401 if(Data == 4) Regs[Register] = (signed short)Sprites[SpriteNum]->x;
\r
402 if(Data == 5) Regs[Register] = (signed short)Sprites[SpriteNum]->y;
\r
403 if(Data == 6) Regs[Register] = (signed short)Sprites[SpriteNum]->Template;
\r
405 case 25: //GreaterThan
\r
406 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
407 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
408 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
409 Regs[Register] = (Data > Data2)?1:0;
\r
411 case 26: //LessThan
\r
412 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
413 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
414 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
415 Regs[Register] = (Data < Data2)?1:0;
\r
418 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
419 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
420 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
421 Regs[Register] = Players[Data]->Keys[Data2];
\r
423 case 28: //CalcSine
\r
424 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
425 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
427 Data += ((unsigned short)(-Data / 360) + 1) * 360;
\r
429 Data -= (unsigned short)(Data / 360) * 360;
\r
430 Regs[Register] = Sine[Data] * 100;
\r
432 case 29: //CalcCosine
\r
433 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
434 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
436 Data += ((unsigned short)(-Data / 360) + 1) * 360;
\r
438 Data -= (unsigned short)(Data / 360) * 360;
\r
439 Regs[Register] = Cosine[Data] * 100;
\r
441 case 30: //GetPixelInfo
\r
442 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
443 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
444 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
445 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
446 if(Data == 0) Regs[Register] = (signed short)Color32To16(GetMapPixel((unsigned short)x, (unsigned short)y, 0));
\r
447 if(Data == 1) Regs[Register] = (signed short)GetMapPixel((unsigned short)x, (unsigned short)y, 1);
\r
450 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
451 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
452 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
453 Regs[Register] = Data & Data2;
\r
456 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
457 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
458 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
459 Regs[Register] = Data | Data2;
\r
462 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
463 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
464 Regs[Register] = !Data;
\r
467 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
468 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
469 Regs[Register] = ~Data;
\r
471 case 35: //DrawLine
\r
472 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
473 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
474 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
475 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
476 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
477 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
478 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
479 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
480 DrawLine(x, y, x2, y2, Color16To32(Data), Color16To32(Data2), Data3, Data4);
\r
482 case 36: //StorePVar
\r
483 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
484 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
485 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
486 Players[Player]->PVars[Data] = Data2;
\r
489 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
490 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
491 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
492 Regs[Register] = Players[Player]->PVars[Data];
\r
494 case 38: //CalcDist
\r
495 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
496 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
497 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
498 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
499 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
500 Misc = ((unsigned long)(x - x2) * (unsigned long)(x - x2)) + ((unsigned long)(y - y2) * (unsigned long)(y - y2));
\r
501 Regs[Register] = sqrt((double)Misc);
\r
503 case 39: //CalcAngle
\r
504 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
505 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
506 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
507 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
508 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
509 Regs[Register] = CalcAngle(x, y, x2, y2);
\r
511 case 40: //AddHitTest
\r
512 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
513 AddHitTest((unsigned short)Data);
\r
515 case 41: //RemoveHitTest
\r
516 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
517 RemoveHitTest((unsigned short)Data);
\r
519 case 42: //CopyToMap
\r
520 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
521 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
522 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
523 Frame = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
524 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
525 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
526 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
527 CopyToMap(x - Caches[Data]->cx[Frame], y - Caches[Data]->cy[Frame], Caches[Data]->Frames[Frame], Caches[Data]->w, Caches[Data]->h, 0, Data3, Data4, (unsigned short)Data2);
\r
529 case 43: //HurtRadius
\r
530 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
531 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
532 Damage = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
533 Damage2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
534 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
535 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
536 Player = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
537 HurtRadius(x, y, Damage, Damage2, (unsigned short)Data, (unsigned short)Data2, Player);
\r
540 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
541 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
542 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
543 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
544 Data5 = ((float)GetArg(WorkCode, (unsigned short *)&Offset, Variables)) / 100;
\r
545 Data6 = ((float)GetArg(WorkCode, (unsigned short *)&Offset, Variables)) / 100;
\r
546 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
547 CollVel(x, y, (float *)&Data5, (float *)&Data6, Data3);
\r
548 Regs[Data] = (signed short)(Data5 * 100);
\r
549 Regs[Data2] = (signed short)(Data6 * 100);
\r
551 case 45: //SetObjectVar
\r
552 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
553 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
554 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
555 Objects[Data]->Variables[Data3] = Data2;
\r
557 case 46: //GetObjectVar
\r
558 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
559 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
560 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
561 Regs[Register] = Objects[Data]->Variables[Data3];
\r
567 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
568 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
569 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
570 Reg4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
571 Reg5 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
572 Reg6 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
573 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
574 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
575 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
576 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
577 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
578 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
580 Regs[Register] = CollisionTest((signed short *)&x, (signed short *)&y, (signed short *)&x2, (signed short *)&y2, Data3, Data4, (unsigned short *)&Data, 0xFF, 0);
\r
587 case 49: //CallExternal
\r
588 ObjectNum = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
589 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
590 Execute(Classes[Objects[ObjectNum]->Class]->Code, (signed short *)&Objects[ObjectNum]->Variables[0], Classes[Objects[ObjectNum]->Class]->Scripts[Data]);
\r
592 case 50: //SetLevelInfo
\r
593 Data = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
594 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
595 if(Data == 0) LevelWidth = Data2;
\r
596 if(Data == 1) LevelHeight = Data2;
\r
597 if(Data == 2) LevelFinished = (unsigned short)Data2;
\r
598 if(Data == 3) GameType = (unsigned char)Data2;
\r
599 if(Data == 4) Gravity = (float)Data2 / 100;
\r
601 case 51: //SpawnSprite
\r
602 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
603 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
604 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
605 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
606 xv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
607 yv = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
608 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
609 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
610 Data4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
611 Regs[Register] = SpawnSprite((unsigned char)Data, x, y, (signed char)xv, (signed char)yv, Data2, Data3, Data4);
\r
613 case 52: //Proximity
\r
614 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
615 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
616 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
617 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
618 Regs[Register] = -1;
\r
619 for(i = 0; i < MAX_HITTESTS; i++)
\r
621 if((ObjectNum = HitTests[i]) == 0xFFFF)
\r
623 if((x >= Objects[ObjectNum]->x - Data) && (x <= Objects[ObjectNum]->x + Data) && (y >= Objects[ObjectNum]->y - Data) && (y <= Objects[ObjectNum]->y + Data))
\r
625 Misc = ((unsigned long)(x - (signed short)Objects[ObjectNum]->x) * (unsigned long)(x - (signed short)Objects[ObjectNum]->x)) + ((unsigned long)(y - (signed short)Objects[ObjectNum]->y) * (unsigned long)(y - (signed short)Objects[ObjectNum]->y));
\r
626 if((signed short)sqrt((double)Misc) <= Data)
\r
628 Regs[Register] = ObjectNum;
\r
634 case 53: //PlaySound
\r
635 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
636 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
637 PlaySound((unsigned short)Data, (unsigned char)Data2, 0, MAX_SOUNDS - 1, 22050, 1);
\r
639 case 54: //MakeColor
\r
640 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
641 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
642 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
643 Reg4 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
644 Regs[Register] = (Reg2 << 11) + (Reg3 << 5) + Reg4;
\r
646 case 55: //SetPixelInfo
\r
647 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
648 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
649 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
650 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
651 SetMapPixel((unsigned short)x, (unsigned short)y, (Data == 0)?Color16To32(Data2):Data2, Data);
\r
653 case 56: //ExtProximity
\r
654 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
655 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
656 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
657 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
658 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
659 Max = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
660 Regs[Register] = -1;
\r
661 for(i = 0; i < MAX_HITTESTS; i++)
\r
663 if((ObjectNum = HitTests[i]) == 0xFFFF)
\r
665 if((ObjectNum == Max) || (Objects[ObjectNum]->Class == (unsigned short)Data2))
\r
667 if((x >= Objects[ObjectNum]->x - Data) && (x <= Objects[ObjectNum]->x + Data) && (y >= Objects[ObjectNum]->y - Data) && (y <= Objects[ObjectNum]->y + Data))
\r
669 Misc = ((unsigned long)(x - (signed short)Objects[ObjectNum]->x) * (unsigned long)(x - (signed short)Objects[ObjectNum]->x)) + ((unsigned long)(y - (signed short)Objects[ObjectNum]->y) * (unsigned long)(y - (signed short)Objects[ObjectNum]->y));
\r
670 if((signed short)sqrt((double)Misc) <= Data)
\r
672 Regs[Register] = ObjectNum;
\r
678 case 57: //DrawLightning
\r
679 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
680 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
681 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
682 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
683 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
684 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
685 DrawLightning(x, y, x2, y2, Data, Data3);
\r
687 case 58: //PlaySoundLoop
\r
688 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
689 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
690 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
691 Misc = (unsigned long)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
692 Data5 = (float)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
693 Regs[Register] = (signed short)PlaySound((unsigned short)Data, (unsigned char)Data2, 0, MAX_SOUNDS - 1, Misc * 10, Data5 / 100);
\r
695 case 59: //SetSoundInfo
\r
696 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
697 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
698 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
699 if(Data == 0) Sounds[Data3].Pitch = (unsigned long)Data2 * 10;
\r
700 if(Data == 1) Sounds[Data3].Playing = (unsigned char)Data2;
\r
701 if(Data == 2) Sounds[Data3].Volume = (float)(Data2 / 100);
\r
703 case 60: //GetSoundInfo
\r
704 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
705 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
706 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
707 if(Data == 0) Regs[Register] = (signed short)(Sounds[Data3].Pitch / 10);
\r
708 if(Data == 1) Regs[Register] = (signed short)Sounds[Data3].Playing;
\r
709 if(Data == 2) Regs[Register] = (signed short)(Sounds[Data3].Volume * 100);
\r
711 case 61: //TraceCoords
\r
712 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
713 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
714 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
715 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
716 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
717 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
718 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
719 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
740 for(i = 0; i <= dx; i++)
\r
742 Regs[Register] = x;
\r
744 if(++Data4 >= Data3)
\r
746 Execute(WorkCode, Variables, Data);
\r
749 GetNextLineCoord(&x, &y, &Max, dx, dy, xv, yv);
\r
752 for(i = 0; i <= dy; i++)
\r
754 Regs[Register] = x;
\r
756 if(++Data4 >= Data3)
\r
758 Execute(WorkCode, Variables, Data);
\r
761 GetNextLineCoord(&x, &y, &Max, dx, dy, xv, yv);
\r
765 case 62: //DecodeColor
\r
766 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
767 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
768 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
769 i = (unsigned short)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
770 Regs[Register] = (i & 0xF800) >> 11;
\r
771 Regs[Reg2] = (i & 0x07E0) >> 5;
\r
772 Regs[Reg3] = i & 0x001F;
\r
774 case 63: //DrawPoly
\r
775 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
776 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
777 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
778 y2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
779 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
780 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
781 Color = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
782 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
783 DrawPoly(x, y, x2, y2, Data, Data2, Color16To32(Color), Data3);
\r
785 case 64: //LoopHitTests
\r
786 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
787 Reg2 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
788 Reg3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
789 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
790 for(i = 0; i < MAX_HITTESTS; i++)
\r
792 if(HitTests[i] == 0xFFFF)
\r
794 Regs[Register] = HitTests[i];
\r
795 Regs[Reg2] = (signed short)Objects[HitTests[i]]->x;
\r
796 Regs[Reg3] = (signed short)Objects[HitTests[i]]->y;
\r
797 Execute(WorkCode, Variables, Data);
\r
800 case 65: //DrawCircle
\r
801 x = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
802 y = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
803 x2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
804 Color = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
805 Data3 = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
806 DrawCircle(x, y, x2, Color16To32(Color), Data3);
\r
809 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
810 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
813 Regs[Register] = (unsigned short)sqrt((float)Data);
\r
816 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
817 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
819 Regs[Register] = -Data;
\r
821 Regs[Register] = Data;
\r
823 case 68: //StoreGVar
\r
824 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
825 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
826 GameVars[Data] = Data2;
\r
829 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
830 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);
\r
831 Regs[Register] = GameVars[Data];
\r
833 case 70: //CondDebug
\r
834 if(KeyTable[68] == 1)
\r
838 sprintf(TextBuffer, "Unknown instruction %u at offset %u!\n\rCode address: %p\n\n\rPress space to continue...\0", Instruction, Offset, (void *)WorkCode);
\r
839 DBFRect(68, 88, 252, 112, MakeColor(255, 0, 0));
\r
840 DBFRect(69, 89, 251, 111, MakeColor(0, 0, 0));
\r
841 DBPrint(TextBuffer, 70, 90, 255);
\r
843 while(KeyTable[57] == 1)
\r
845 while(KeyTable[57] == 0)
\r