1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
7 // static char *VB_Name = "modZonk";
10 // ==========================================================================
12 // Animate Zonks (falling)
13 // ==========================================================================
15 int subAnimateZonks(int si)
22 // int ax, bx, cx, dx, di, X, Y;
24 // int ah, bh, ch, dh, al, bl, cl, dl;
27 tFld = PlayField16[si];
28 if ((tFld & 0xFF) != fiZonk)
29 return subAnimateZonks;
33 if (FreezeZonks == 2) // Do Zonks fall? (debug)
34 return subAnimateZonks;
36 ax = PlayField16[si + FieldWidth]; // select case playfield16(si+60)
49 return subAnimateZonks;
51 loc_g_0D35: // Case fiZonk, fiInfotron, fiRAM
52 ax = PlayField16[si + FieldWidth - 1];
53 if (ax == 0 || ax == 0x8888 || ax == 0xAAAA)
57 ax = PlayField16[si + FieldWidth + 1];
58 if (ax == 0 || ax == 0x8888 || ax == 0xAAAA)
61 return subAnimateZonks;
63 loc_g_0D64: // Case fiSpace
64 MovHighByte(&PlayField16[si], 0x40);
67 loc_g_0D6B: // roll left?
68 if (PlayField16[si - 1] == 0)
74 MovHighByte(&PlayField16[si], 0x50);
75 PlayField16[si - 1] = 0x8888;
78 loc_g_0D81: // roll right?
79 if (PlayField16[si + 1] == 0)
82 if (PlayField16[si + 1] != 0x9999) // wow right is different from left!
83 return subAnimateZonks;
85 if (LowByte(PlayField16[si - FieldWidth + 1]) != 1)
86 return subAnimateZonks;
89 MovHighByte(&PlayField16[si], 0x60);
90 PlayField16[si + 1] = 0x8888;
94 // from now on the zonk is definitely moving,
95 // maybe the sequence is in an advanced frame
96 // or just beeing initialized due to the code above
97 bl = HighByte(PlayField16[si]);
101 if (al == 0x10) // zonk comes falling from above
104 if (al == 0x20) // zonk comes rolling from right to left
107 if (al == 0x30) // zonk comes rolling from left to right
110 if (FreezeZonks == 2)
111 return subAnimateZonks;
113 if (al == 0x40) // zonk falls straight down
116 if (al == 0x50) // zonk rolls left
119 if (al == 0x60) // zonk rolls right
122 if (al == 0x70) // intermediate state
125 return subAnimateZonks;
127 loc_g_0DE8: // zonk comes falling from above
128 // To Do: draw zonk falling from above
129 // according to position in (bl And &H07)
130 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
132 Y = GetStretchY(si - FieldWidth);
134 StretchedSprites.BltEx(X, Y, 0);
135 StretchedSprites.BltEx(X, Y + TwoPixels * (dx + 1), fiZonk);
136 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
137 bl = HighByte(PlayField16[si]) + 1;
140 MovHighByte(&PlayField16[si], bl);
141 subCleanUpForZonksAbove(si - FieldWidth);
142 return subAnimateZonks;
147 MovHighByte(&PlayField16[si], bl);
148 return subAnimateZonks;
151 MovHighByte(&PlayField16[si], 0); // zonk arrived at the field
152 if ((FreezeZonks & 0xFF) == 2)
153 return subAnimateZonks;
155 // loc_g_0E42: // now check if the zonk may go on falling somehow
156 ax = PlayField16[si + FieldWidth];
157 if (ax == 0) // below is empty!-> go on falling 'loc_g_0E4C:
160 if (ax == 0x9999) // below is only temporarily used ' loc_g_0E57:
163 if ((ax & 0xFF) == fiMurphy) // Murphy dies 'loc_g_0E61:
166 if ((ax & 0xFF) == fiSnikSnak) // SnikSnak dies 'loc_g_0E6B:
169 if (ax == 0x2BB) // loc_g_0E76:
172 if (ax == 0x4BB) // loc_g_0E81:
175 if ((ax & 0xFF) == fiElectron) // Electron cracked! 'loc_g_0E8B:
178 if (ax == fiOrangeDisk) // OrangeDisk explodes 'loc_g_0E95:
181 subSoundFXZonk(); // play the zonk sound,'cause zonk hits something "hard"
183 if (! (ax == fiZonk || ax == fiInfotron || ax == fiRAM))
184 return subAnimateZonks;
186 // loc_g_0EAE: ' Zonk rolls somewhere
187 ax = PlayField16[si + FieldWidth - 1];
188 if (ax == 0 || ax == 0x8888 || ax == 0xAAAA) // may roll left
191 ax = PlayField16[si + FieldWidth + 1];
192 if (ax == 0 || ax == 0x8888 || ax == 0xAAAA) // may roll right
195 return subAnimateZonks;
197 loc_g_0EDD: // go on falling down?
198 PlayField16[si] = 0x7001; // go into intermediate waitstate
199 PlayField16[si + FieldWidth] = 0x9999; // mark as "zonk waiting to access"
200 return subAnimateZonks;
202 loc_g_0EEA: // test if zonk may roll left
203 // This if(if true) jumps up far above
204 // to the according rountine for fixed zonks!
205 if (PlayField16[si - 1] != 0) // Remarkable!!! ' loc_g_0EF4:
208 MovHighByte(&PlayField16[si], 0x50); // zonk rolls left
209 Mov(&PlayField16[si - 1], 0x8888); // mark as zonk accessing?
210 return subAnimateZonks;
212 loc_g_0F00: // test if zonk may roll right
213 if (PlayField16[si + 1] != 0) // loc_g_0F08:
214 return subAnimateZonks;
216 MovHighByte(&PlayField16[si], 0x60); // zonk rolls right
217 Mov(&PlayField16[si + 1], 0x8888); // mark as zonk accessing?
218 return subAnimateZonks;
220 loc_g_0F14: // Murphy dies, but not in any case
221 bl = HighByte(PlayField16[si + FieldWidth]);
222 if (bl == 0xE || bl == 0xF || bl == 0x28)
223 return subAnimateZonks;
225 if (bl == 0x29 || bl == 0x25 || bl == 0x26)
226 return subAnimateZonks;
229 ax = LowByte(PlayField16[si + FieldWidth - 1]);
230 if (ax == fiElectron) // loc_g_0F43:
231 PlayField16[si + FieldWidth] = fiElectron;
234 PlayField16[si + FieldWidth - 1] = 0;
239 ax = LowByte(PlayField16[si + FieldWidth + 1]);
240 if (ax == fiElectron) // loc_g_0F5F:
241 PlayField16[si + FieldWidth] = fiElectron;
244 PlayField16[si + FieldWidth + 1] = 0;
248 loc_g_0F6E: // someone dies/explodes
249 si = si + FieldWidth; // 1 field down
250 ExplodeFieldSP(si); // Explode
251 return subAnimateZonks;
253 loc_g_0F75: // OrangeDisk explodes next cycle
254 si = si + FieldWidth; // 1 field down
255 PlayField8[si] = fiHardWare;
256 return subAnimateZonks;
258 loc_g_0F83: // zonk comes rolling from right to left
259 // To Do: draw zonk rolling from right
260 // according to position in (bl And &H07)
261 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
262 X = GetStretchX(si + 1);
265 StretchedSprites.BltEx(X, Y, 0);
266 StretchedSprites.BltEx(X - (TwoPixels * dx), Y, aniZonkRollLeft[dx - 1]);
267 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
268 bl = HighByte(PlayField16[si]) + 1; // get and increment sequence#
270 PlayField16[si + 1] = 0xAAAA;
274 MovHighByte(&PlayField16[si], bl);
275 subCleanUpForZonksAbove(si + 1);
279 MovHighByte(&PlayField16[si], bl);
283 PlayField16[si] = 0xFFFF;
284 si = si + FieldWidth; // 1 field down
285 PlayField16[si] = 0x1001; // convert rolling zonk to a falling zonk
288 return subAnimateZonks;
290 loc_g_0FE8: // zonk comes rolling from left to right
291 // To Do: draw zonk rolling from left
292 // according to position in (bl And &H07)
293 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
294 X = GetStretchX(si - 1);
297 StretchedSprites.BltEx(X, Y, 0);
298 StretchedSprites.BltEx(X + (TwoPixels * dx), Y, aniZonkRollRight[dx - 1]);
299 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
300 bl = HighByte(PlayField16[si]) + 1;
302 PlayField16[si - 1] = 0xAAAA;
306 MovHighByte(&PlayField16[si], bl);
307 subCleanUpForZonksAbove(si - 1);
311 MovHighByte(&PlayField16[si], bl);
315 PlayField16[si] = 0xFFFF;
316 si = si + FieldWidth; // 1 field down
317 PlayField16[si] = 0x1001; // convert rolling zonk to a falling zonk
320 return subAnimateZonks;
322 loc_g_104D: // zonk falls straight down
326 MovHighByte(&PlayField16[si], bl);
328 else if (PlayField16[si + FieldWidth] != 0)
330 bl = bl - 1; // stay waiting
331 MovHighByte(&PlayField16[si], bl);
335 PlayField16[si] = 0xFFFF; // mark as "zonk leaving"
336 si = si + FieldWidth; // 1 field down
337 PlayField16[si] = 0x1001; // go falling
340 return subAnimateZonks;
342 loc_g_107B: // zonk rolls left
343 // To Do: draw zonk rolling to left
344 // according to position in (bl And &H0F)
345 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
349 StretchedSprites.BltEx(X, Y, 0);
350 StretchedSprites.BltEx(X - (TwoPixels * dx), Y, aniZonkRollLeft[dx - 1]);
351 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
352 bl = HighByte(PlayField16[si]) + 1; // retrieve and increment sequence#
355 MovHighByte(&PlayField16[si], bl);
356 return subAnimateZonks;
359 if (PlayField16[si + FieldWidth - 1] != 0)
362 if (PlayField16[si - 1] != 0)
364 if (PlayField16[si - 1] != 0x8888)
368 PlayField16[si] = 0xFFFF;
369 si = si - 1; // 1 field left
370 PlayField16[si] = 0x2201;
371 PlayField16[si + FieldWidth] = 0xFFFF;
372 return subAnimateZonks;
374 loc_g_10E2: // stay waiting
376 MovHighByte(&PlayField16[si], bl);
377 return subAnimateZonks;
379 loc_g_10E9: // zonk rolls right
380 // To Do: draw zonk rolling to right
381 // according to position in (bl And &H07)
382 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
386 StretchedSprites.BltEx(X, Y, 0);
387 StretchedSprites.BltEx(X + (TwoPixels * dx), Y, aniZonkRollRight[dx - 1]);
388 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
389 bl = HighByte(PlayField16[si]) + 1;
392 MovHighByte(&PlayField16[si], bl);
393 return subAnimateZonks;
396 if (PlayField16[si + FieldWidth + 1] != 0)
399 if (PlayField16[si + 1] != 0)
401 if (PlayField16[si + 1] != 0x8888)
405 PlayField16[si] = 0xFFFF;
407 PlayField16[si] = 0x3201;
408 PlayField16[si + FieldWidth] = 0xFFFF;
409 return subAnimateZonks;
411 loc_g_1150: // stay waiting
413 MovHighByte(&PlayField16[si], bl);
414 return subAnimateZonks;
416 loc_g_1157: // intermediate state
417 ax = PlayField16[si + FieldWidth];
418 if (ax == 0 || ax == 0x9999)
420 PlayField16[si] = 0xFFFF;
421 si = si + FieldWidth; // 1 field down
422 PlayField16[si] = 0x1001; // start falling down
426 return subAnimateZonks;
427 } // subAnimateZonks endp
429 int subCleanUpForZonksAbove(int si)
431 int subCleanUpForZonksAbove;
435 if (LowByte(PlayField16[si]) != fiExplosion)
438 if (PlayField16[si - FieldWidth] != 0)
440 if (PlayField16[si - FieldWidth] != 0x9999)
441 return subCleanUpForZonksAbove;
443 if (LowByte(PlayField16[si - 2 * FieldWidth]) != fiInfotron)
444 return subCleanUpForZonksAbove;
447 if (PlayField16[si - FieldWidth - 1] != fiZonk)
449 if (PlayField16[si - FieldWidth + 1] != fiZonk)
450 return subCleanUpForZonksAbove;
455 ax = PlayField16[si - 1];
456 if (ax == fiZonk || ax == fiInfotron || ax == fiRAM)
458 PlayField16[si - FieldWidth - 1] = 0x6001;
459 PlayField16[si - FieldWidth] = 0x8888;
460 return subCleanUpForZonksAbove;
463 if (PlayField16[si - FieldWidth + 1] != fiZonk)
464 return subCleanUpForZonksAbove;
467 ax = PlayField16[si + 1];
468 if (ax == fiZonk || ax == fiInfotron || ax == fiRAM)
470 PlayField16[si - FieldWidth + 1] = 0x5001;
471 PlayField16[si - FieldWidth] = 0x8888;
474 return subCleanUpForZonksAbove;
475 } // subCleanUpForZonksAbove