Fixed audio playing
[kvidha.git] / executor.c
CommitLineData
02f87e18
FT
1#include "dblbuf.h"\r
2#include "kvidha.h"\r
3#include "sb.h"\r
4\r
5unsigned long Color16To32(unsigned short c)\r
6{\r
7 Color Temp;\r
8\r
9 Temp.Reserved = 0;\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
14}\r
15\r
16unsigned short Color32To16(unsigned long c)\r
17{\r
18 Color Temp;\r
19 unsigned short Result;\r
20\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
25 return(Result);\r
26}\r
27\r
28signed short GetArg(unsigned char *Code, unsigned short *Offset, signed short *Variables)\r
29{\r
30 unsigned char ArgType;\r
31 signed short Result;\r
32\r
33 ArgType = Code[*Offset];\r
34 switch(ArgType)\r
35 {\r
36 case 0:\r
37 Result = (signed short)((unsigned short)Code[*Offset + 1] + (unsigned short)(Code[*Offset + 2] << 8));\r
38 *Offset += 3;\r
39 break;\r
40 case 1:\r
41 Result = Regs[Code[*Offset + 1]];\r
42 *Offset += 2;\r
43 break;\r
44 case 2:\r
45 Result = Variables[Code[*Offset + 1]];\r
46 *Offset += 2;\r
47 break;\r
48 }\r
49 return(Result);\r
50}\r
51\r
52void Execute(unsigned char *WorkCode, signed short *Variables, unsigned short StartOffset)\r
53{\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
66 unsigned short Max;\r
67 unsigned char Register, Player, Reg2, Reg3, Reg4, Reg5, Reg6;\r
68 unsigned char Data3, Data4;\r
69 unsigned short Color;\r
70 unsigned short i;\r
71 unsigned char DisplayInfo;\r
72 unsigned char Choice;\r
73 unsigned short LocalStackPos;\r
74 unsigned long Misc;\r
75 float Data5, Data6;\r
76 static unsigned short DbgPtr = 0;\r
77\r
78 Finished = 0;\r
79 DisplayInfo = 1;\r
80 Choice = 0;\r
81 Offset = StartOffset;\r
82 LocalStackPos = 0;\r
83 while(Finished == 0)\r
84 {\r
85 if((DebugMode == 1) && (DisplayInfo == 1))\r
86 {\r
87 for(i = 0; i < NumClasses; i++)\r
88 {\r
89 if(WorkCode == Classes[i]->Code)\r
90 break;\r
91 }\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
96 {\r
97 for(x = 0; x < 15; x++)\r
98 {\r
99 Data += sprintf(TextBuffer + Data, " %02X", WorkCode[Offset + x + (y * 15)]);\r
100 }\r
101 Data += sprintf(TextBuffer + Data, "\n\r");\r
102 }\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
107 {\r
108 for(x = 0; x < 8; x++)\r
109 {\r
110 Data += sprintf(TextBuffer + Data, " %-6i", Regs[x + (y * 8)]);\r
111 }\r
112 Data += sprintf(TextBuffer + Data, "\n\r");\r
113 }\r
114 sprintf(TextBuffer + Data, "\0");\r
115 DBPrint(TextBuffer, 35, 105, 255);\r
116 DisplayDB();\r
117 while(KeyTable[57] == 0)\r
118 {\r
119 GetEvents();\r
120 if(KeyTable[203] == 1)\r
121 {\r
122 if(Choice > 0)\r
123 Choice--;\r
124 while(KeyTable[203] == 1)\r
125 GetEvents();\r
126 }\r
127 if(KeyTable[205] == 1)\r
128 {\r
129 if(Choice < 2)\r
130 Choice++;\r
131 while(KeyTable[205] == 1)\r
132 GetEvents();\r
133 }\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
136 DisplayDB();\r
137 }\r
138 while(KeyTable[57] == 1)\r
139 GetEvents();\r
140 if(Choice == 1)\r
141 DisplayInfo = 2;\r
142 if(Choice == 2)\r
143 DisplayInfo = 0;\r
144 }\r
145 Instruction = (unsigned short)WorkCode[Offset] + ((unsigned short)WorkCode[Offset + 1] << 8);\r
146 Offset += 2;\r
147 switch(Instruction)\r
148 {\r
149 case 0: //Return\r
150 if(DisplayInfo == 2)\r
151 DisplayInfo = 1;\r
152 if(LocalStackPos == 0)\r
153 {\r
154 Finished = 1;\r
155 } else {\r
156 Offset = Stack[--StackPos];\r
157 LocalStackPos--;\r
158 }\r
159 break;\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
167 break;\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
175 break;\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
180 break;\r
181 case 4: //StoreReg\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
185 break;\r
186 case 5: //Add\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
191 break;\r
192 case 6: //Equals\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
197 break;\r
198 case 7: //If\r
199 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
200 Data2 = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
201 if(Data != 0)\r
202 Offset = Data2;\r
203 break;\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
215 break;\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
221 break;\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
227 break;\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
236 break;\r
237 case 12: //Goto\r
238 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
239 Offset = Data;\r
240 break;\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
245 break;\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
254 break;\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
277 break;\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
294 if(Data == 12)\r
295 {\r
296 Angle = Players[Player]->Angle;\r
297 if(Angle > 90)\r
298 Angle -= 360;\r
299 if(Players[Player]->Dir == 1)\r
300 Angle = 180 - Angle;\r
301 if(Angle < 0)\r
302 Angle += 360;\r
303 Regs[Register] = Angle;\r
304 }\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
311 break;\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
326 break;\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
341 break;\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
346 break;\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
352 break;\r
353 case 21: //Divide\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
358 break;\r
359 case 22: //Call\r
360 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
361 if(StackPos < MAX_STACK)\r
362 {\r
363 Stack[StackPos++] = Offset;\r
364 LocalStackPos++;\r
365 Offset = Data;\r
366 } else {\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
371 DisplayDB();\r
372 while(KeyTable[57] == 1)\r
373 GetEvents();\r
374 while(KeyTable[57] == 0)\r
375 GetEvents();\r
376 }\r
377 break;\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
383 break;\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
390 break;\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
396 break;\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
404 break;\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
410 break;\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
416 break;\r
417 case 27: //GetKey\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
422 break;\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
426 if(Data < 0)\r
427 Data += ((unsigned short)(-Data / 360) + 1) * 360;\r
428 if(Data >= 360)\r
429 Data -= (unsigned short)(Data / 360) * 360;\r
430 Regs[Register] = Sine[Data] * 100;\r
431 break;\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
435 if(Data < 0)\r
436 Data += ((unsigned short)(-Data / 360) + 1) * 360;\r
437 if(Data >= 360)\r
438 Data -= (unsigned short)(Data / 360) * 360;\r
439 Regs[Register] = Cosine[Data] * 100;\r
440 break;\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
448 break;\r
449 case 31: //And\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
454 break;\r
455 case 32: //Or\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
460 break;\r
461 case 33: //BNot\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
465 break;\r
466 case 34: //Not\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
470 break;\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
481 break;\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
487 break;\r
488 case 37: //GetPVar\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
493 break;\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
502 break;\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
510 break;\r
511 case 40: //AddHitTest\r
512 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
513 AddHitTest((unsigned short)Data);\r
514 break;\r
515 case 41: //RemoveHitTest\r
516 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
517 RemoveHitTest((unsigned short)Data);\r
518 break;\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
528 break;\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
538 break;\r
539 case 44: //CollVel\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
550 break;\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
556 break;\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
562 break;\r
563 case 47: //Debug\r
564 DebugMode = 1;\r
565 break;\r
566 case 48: //Trace\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
579 Data = -1;\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
581 Regs[Reg2] = x;\r
582 Regs[Reg3] = y;\r
583 Regs[Reg4] = x2;\r
584 Regs[Reg5] = y2;\r
585 Regs[Reg6] = Data;\r
586 break;\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
591 break;\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
600 break;\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
612 break;\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
620 {\r
621 if((ObjectNum = HitTests[i]) == 0xFFFF)\r
622 break;\r
623 if((x >= Objects[ObjectNum]->x - Data) && (x <= Objects[ObjectNum]->x + Data) && (y >= Objects[ObjectNum]->y - Data) && (y <= Objects[ObjectNum]->y + Data))\r
624 {\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
627 {\r
628 Regs[Register] = ObjectNum;\r
629 break;\r
630 }\r
631 }\r
632 }\r
633 break;\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
638 break;\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
645 break;\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
652 break;\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
662 {\r
663 if((ObjectNum = HitTests[i]) == 0xFFFF)\r
664 break;\r
665 if((ObjectNum == Max) || (Objects[ObjectNum]->Class == (unsigned short)Data2))\r
666 continue;\r
667 if((x >= Objects[ObjectNum]->x - Data) && (x <= Objects[ObjectNum]->x + Data) && (y >= Objects[ObjectNum]->y - Data) && (y <= Objects[ObjectNum]->y + Data))\r
668 {\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
671 {\r
672 Regs[Register] = ObjectNum;\r
673 break;\r
674 }\r
675 }\r
676 }\r
677 break;\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
686 break;\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
694 break;\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
702 break;\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
710 break;\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
720 Data4 = 0;\r
721 if(x2 > x)\r
722 {\r
723 xv = 1;\r
724 dx = x2 - x;\r
725 } else {\r
726 xv = -1;\r
727 dx = x - x2;\r
728 }\r
729 if(y2 > y)\r
730 {\r
731 yv = 1;\r
732 dy = y2 - y;\r
733 } else {\r
734 yv = -1;\r
735 dy = y - y2;\r
736 }\r
737 Max = 0;\r
738 if(dx > dy)\r
739 {\r
740 for(i = 0; i <= dx; i++)\r
741 {\r
742 Regs[Register] = x;\r
743 Regs[Reg2] = y;\r
744 if(++Data4 >= Data3)\r
745 {\r
746 Execute(WorkCode, Variables, Data);\r
747 Data4 = 0;\r
748 }\r
749 GetNextLineCoord(&x, &y, &Max, dx, dy, xv, yv);\r
750 }\r
751 } else {\r
752 for(i = 0; i <= dy; i++)\r
753 {\r
754 Regs[Register] = x;\r
755 Regs[Reg2] = y;\r
756 if(++Data4 >= Data3)\r
757 {\r
758 Execute(WorkCode, Variables, Data);\r
759 Data4 = 0;\r
760 }\r
761 GetNextLineCoord(&x, &y, &Max, dx, dy, xv, yv);\r
762 }\r
763 }\r
764 break;\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
773 break;\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
784 break;\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
791 {\r
792 if(HitTests[i] == 0xFFFF)\r
793 break;\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
798 }\r
799 break;\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
807 break;\r
808 case 66: //Sqrt\r
809 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
810 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
811 if(Data < 0)\r
812 Data = 0;\r
813 Regs[Register] = (unsigned short)sqrt((float)Data);\r
814 break;\r
815 case 67: //Abs\r
816 Register = (unsigned char)GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
817 Data = GetArg(WorkCode, (unsigned short *)&Offset, Variables);\r
818 if(Data < 0)\r
819 Regs[Register] = -Data;\r
820 else\r
821 Regs[Register] = Data;\r
822 break;\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
827 break;\r
828 case 69: //GetGVar\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
832 break;\r
833 case 70: //CondDebug\r
834 if(KeyTable[68] == 1)\r
835 DebugMode = 1;\r
836 break;\r
837 default:\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
842 DisplayDB();\r
843 while(KeyTable[57] == 1)\r
844 GetEvents();\r
845 while(KeyTable[57] == 0)\r
846 GetEvents();\r
847 }\r
848 }\r
849}\r