1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
7 static int subDrawSnikSnakFromAbove(int si, int bx);
8 static int subDrawSnikSnakFromBelow(int si, int bx);
9 static int subDrawSnikSnakFromLeft(int si, int bx);
10 static int subDrawSnikSnakFromRight(int si, int bx);
11 static int subDrawSnikSnakTurnLeft(int si, int bx);
12 static int subDrawSnikSnakTurnRight(int si, int bx);
13 static int subSnikSnakFromAbove(int si, int bx);
14 static int subSnikSnakFromBelow(int si, int bx);
15 static int subSnikSnakFromLeft(int si, int bx);
16 static int subSnikSnakFromRight(int si, int bx);
17 static int subSnikSnakTurnLeft(int si, int bx);
18 static int subSnikSnakTurnRight(int si, int bx);
20 static char *VB_Name = "modSnikSnak";
21 // --- Option Explicit
22 // ==========================================================================
24 // Animate/move Snik-Snaks
25 // ==========================================================================
27 int subAnimateSnikSnaks(int si)
29 int subAnimateSnikSnaks;
33 if (SnikSnaksElectronsFrozen == 1)
34 return subAnimateSnikSnaks;
36 // If LowByte(PlayField16(si)) <> fiSnikSnak Then Exit Function
37 // Debug.Assert (LowByte(PlayField16[si]) == fiSnikSnak);
38 bx = HighByte(PlayField16[si]);
43 subSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
47 subSnikSnakTurnRight(si, bx); // turn right
51 subSnikSnakFromBelow(si, bx); // access si from below
55 subSnikSnakFromRight(si, bx); // access si from right
59 subSnikSnakFromAbove(si, bx); // access si from above
63 subSnikSnakFromLeft(si, bx); // access si from left
67 // Debug.Assert(False);
71 return subAnimateSnikSnaks;
72 } // subAnimateSnikSnaks
74 int subDrawAnimatedSnikSnaks(int si)
76 int subDrawAnimatedSnikSnaks;
80 // If SnikSnaksElectronsFrozen = 1 Then Exit Function
81 if (LowByte(PlayField16[si]) != fiSnikSnak)
82 return subDrawAnimatedSnikSnaks;
84 bx = HighByte(PlayField16[si]);
89 subDrawSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
93 subDrawSnikSnakTurnRight(si, bx); // turn right
97 subDrawSnikSnakFromBelow(si, bx); // access si from below
101 subDrawSnikSnakFromRight(si, bx); // access si from right
105 subDrawSnikSnakFromAbove(si, bx); // access si from above
109 subDrawSnikSnakFromLeft(si, bx); // access si from left
113 return subDrawAnimatedSnikSnaks;
114 } // subAnimateSnikSnaks
116 static int subSnikSnakTurnLeft(int si, int bx)
118 static int subSnikSnakTurnLeft;
120 int ax, ah, bl, dx, X, Y;
128 return subSnikSnakTurnLeft;
131 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
134 StretchedSprites.BltEx(X, Y, aniSnikSnak[bx]);
135 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
137 MovHighByte(&PlayField16[si], bx);
138 return subSnikSnakTurnLeft;
143 return subSnikSnakTurnLeft;
146 return subSnikSnakTurnLeft;
149 return subSnikSnakTurnLeft;
152 return subSnikSnakTurnLeft;
154 ExplodeFieldSP(si); // Explode
155 return subSnikSnakTurnLeft;
158 bl = HighByte(PlayField16[si]);
171 return subSnikSnakTurnLeft;
173 loc_g_763B: // pointing up
174 ax = PlayField16[si - FieldWidth];
175 if (ax == 0) // above is empty -> go up
178 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
179 goto locMayExplode760A;
181 return subSnikSnakTurnLeft;
183 loc_g_764E: // above is empty -> go up
184 PlayField16[si] = 0x1BB;
185 si = si - FieldWidth;
186 PlayField16[si] = 0x1011;
187 return subSnikSnakTurnLeft;
189 loc_g_765E: // pointing left
190 ax = PlayField16[si - 1];
191 if (ax == 0) // left is empty -> go there
194 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
195 goto locMayExplode760A;
197 return subSnikSnakTurnLeft;
199 loc_g_7671: // left is empty -> go there
200 PlayField16[si] = 0x2BB;
202 PlayField16[si] = 0x1811;
203 return subSnikSnakTurnLeft;
205 loc_g_7681: // pointing down
206 ax = PlayField16[si + FieldWidth];
207 if (ax == 0) // below is empty -> go down
210 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
211 goto locMayExplode760A;
213 return subSnikSnakTurnLeft;
215 loc_g_7697: // below is empty -> go down
216 PlayField16[si] = 0x3BB;
217 si = si + FieldWidth;
218 PlayField16[si] = 0x2011;
219 return subSnikSnakTurnLeft;
221 loc_g_76A7: // pointing Right
222 ax = PlayField16[si + 1];
223 if (ax == 0) // right is empty -> go there
226 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
227 goto locMayExplode760A;
229 return subSnikSnakTurnLeft;
231 loc_g_76BD: // right is empty -> go there
232 PlayField16[si] = 0x4BB;
234 PlayField16[si] = 0x2811;
236 return subSnikSnakTurnLeft;
237 } // subSnikSnakTurnLeft
239 static int subSnikSnakTurnRight(int si, int bx)
241 static int subSnikSnakTurnRight;
243 int ax, ah, bl, dx, X, Y;
251 return subSnikSnakTurnRight;
254 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
257 StretchedSprites.BltEx(X, Y, aniSnikSnak[0x10 - bx]);
258 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
259 bx = ((bx + 1) & 0x7) | 8;
260 MovHighByte(&PlayField16[si], bx);
261 return subSnikSnakTurnRight;
266 return subSnikSnakTurnRight;
269 return subSnikSnakTurnRight;
272 return subSnikSnakTurnRight;
275 return subSnikSnakTurnRight;
277 ExplodeFieldSP(si); // Explode
278 return subSnikSnakTurnRight;
281 bl = HighByte(PlayField16[si]);
294 return subSnikSnakTurnRight;
296 loc_g_7738: // pointing up
297 ax = PlayField16[si - FieldWidth];
298 if (ax == 0) // above is empty -> go up
301 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
302 goto locMayExplode7707;
304 return subSnikSnakTurnRight;
306 loc_g_774B: // above is empty -> go up
307 PlayField16[si] = 0x1BB;
308 si = si - FieldWidth;
309 PlayField16[si] = 0x1011;
310 return subSnikSnakTurnRight;
312 loc_g_775B: // pointing left
313 ax = PlayField16[si - 1];
314 if (ax == 0) // left is empty -> go there
317 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
318 goto locMayExplode7707;
320 return subSnikSnakTurnRight;
322 loc_g_776E: // left is empty -> go there
323 PlayField16[si] = 0x2BB;
325 PlayField16[si] = 0x1811;
326 return subSnikSnakTurnRight;
328 loc_g_777E: // pointing down
329 ax = PlayField16[si + FieldWidth];
330 if (ax == 0) // below is empty -> go down
333 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
334 goto locMayExplode7707;
336 return subSnikSnakTurnRight;
338 loc_g_7794: // below is empty -> go down
339 PlayField16[si] = 0x3BB;
340 si = si + FieldWidth;
341 PlayField16[si] = 0x2011;
342 return subSnikSnakTurnRight;
344 loc_g_77A4: // pointing Right
345 ax = PlayField16[si + 1];
346 if (ax == 0) // right is empty -> go there
349 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
350 goto locMayExplode7707;
352 return subSnikSnakTurnRight;
354 loc_g_77BA: // right is empty -> go there
355 PlayField16[si] = 0x4BB;
357 PlayField16[si] = 0x2811;
359 return subSnikSnakTurnRight;
360 } // subSnikSnakTurnRight
362 static int subSnikSnakFromBelow(int si, int bx)
364 static int subSnikSnakFromBelow;
366 int ax, ah, bl, dx, X, Y;
368 bx = bx - 0xF; // get and increment sequence#
369 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
371 Y = GetStretchY(si + FieldWidth);
372 StretchedSprites.BltEx(X, Y, 0);
373 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
374 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
376 if (bl == 7 && LowByte(PlayField16[si + FieldWidth]) != fiExplosion)
378 PlayField16[si + FieldWidth] = 0; // sniknak left that field
381 if (bl < 8) // sniksnak still goes up
384 MovHighByte(&PlayField16[si], bl);
385 return subSnikSnakFromBelow;
388 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
389 ax = PlayField16[si - 1]; // check left field
390 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
392 MovHighByte(&PlayField16[si], 1); // start to turn left
393 return subSnikSnakFromBelow;
394 } // loc_g_7826: and 'loc_g_7833:
396 ax = PlayField16[si - FieldWidth]; // cannot turn left -> check above
397 if (ax == 0) // check if empty
399 PlayField16[si] = 0x1BB; // mark as "sniksnak leaving"
400 si = si - FieldWidth; // go up!
401 PlayField16[si] = 0x1011;
402 return subSnikSnakFromBelow;
405 if (LowByte(ax) == fiMurphy) // check for murphy above
407 ExplodeFieldSP(si); // Explode
408 return subSnikSnakFromBelow;
411 ax = PlayField16[si + 1]; // check right field
412 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
414 MovHighByte(&PlayField16[si], 9); // start to turn right
415 return subSnikSnakFromBelow;
416 } // loc_g_7862: and 'loc_g_786F:
418 // else: no way to go, start turning around
419 MovHighByte(&PlayField16[si], 1);
421 return subSnikSnakFromBelow;
422 } // subSnikSnakFromBelow
424 static int subSnikSnakFromRight(int si, int bx)
426 static int subSnikSnakFromRight;
428 int ax, ah, bl, dx, X, Y;
430 bx = bx - 0x17; // get and increment sequence#
431 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
432 X = GetStretchX(si + 1);
434 StretchedSprites.BltEx(X, Y, 0);
435 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
436 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
438 if (bl == 7 && LowByte(PlayField16[si + 1]) != fiExplosion)
440 PlayField16[si + 1] = 0; // sniknak left that field
443 if (bl < 8) // sniksnak still goes left
446 MovHighByte(&PlayField16[si], bl);
447 return subSnikSnakFromRight;
450 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
451 ax = PlayField16[si + FieldWidth]; // check below
452 if (ax == 0 || LowByte(ax) == fiMurphy) // empty or murphy?
454 MovHighByte(&PlayField16[si], 3); // yes -> turn left down
455 return subSnikSnakFromRight;
456 } // loc_g_78CC: and 'loc_g_78D9:
458 ax = PlayField16[si - 1]; // check left, etc ... see the comments on subSnikSnakFromBelow()
461 PlayField16[si] = 0x2BB;
462 si = si - 1; // 1 field left
463 PlayField16[si] = 0x1811;
464 return subSnikSnakFromRight;
467 if (LowByte(ax) == fiMurphy)
469 ExplodeFieldSP(si); // Explode
470 return subSnikSnakFromRight;
473 ax = PlayField16[si - FieldWidth]; // check above
474 if (ax == 0 || LowByte(ax) == fiMurphy)
476 MovHighByte(&PlayField16[si], 0xF);
477 return subSnikSnakFromRight;
478 } // loc_g_7908:loc_g_7915:
480 MovHighByte(&PlayField16[si], 3);
482 return subSnikSnakFromRight;
483 } // subSnikSnakFromRight
485 static int subSnikSnakFromAbove(int si, int bx)
487 static int subSnikSnakFromAbove;
489 int ax, ah, bl, dx, X, Y;
491 bx = bx - 0x1F; // get and increment sequence#
492 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
494 Y = GetStretchY(si - FieldWidth);
495 StretchedSprites.BltEx(X, Y, 0);
496 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
497 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
499 if (bl == 7 && LowByte(PlayField16[si - FieldWidth]) != fiExplosion)
501 PlayField16[si - FieldWidth] = 0; // sniknak left that field
504 if (bl < 8) // sniksnak still goes down
507 MovHighByte(&PlayField16[si], bl);
508 return subSnikSnakFromAbove;
511 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
512 ax = PlayField16[si + 1]; // check right
513 if (ax == 0 || LowByte(ax) == fiMurphy)
515 MovHighByte(&PlayField16[si], 5);
516 return subSnikSnakFromAbove;
519 ax = PlayField16[si + FieldWidth]; // check below
522 PlayField16[si] = 0x3BB;
523 si = si + FieldWidth; // 1 field down
524 PlayField16[si] = 0x2011;
525 return subSnikSnakFromAbove;
528 if (LowByte(ax) == fiMurphy)
530 ExplodeFieldSP(si); // Explode
531 return subSnikSnakFromAbove;
534 ax = PlayField16[si - 1]; // check left
535 if (ax == 0 || LowByte(ax) == fiMurphy)
537 MovHighByte(&PlayField16[si], 0xD);
538 return subSnikSnakFromAbove;
541 MovHighByte(&PlayField16[si], 5);
543 return subSnikSnakFromAbove;
544 } // subSnikSnakFromAbove
546 static int subSnikSnakFromLeft(int si, int bx)
548 static int subSnikSnakFromLeft;
550 int ax, ah, bl, dx, X, Y;
552 bx = bx - 0x27; // get and increment sequence#
553 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
554 X = GetStretchX(si - 1);
556 StretchedSprites.BltEx(X, Y, 0);
557 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
558 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
560 if (bl == 7 && LowByte(PlayField16[si - 1]) != fiExplosion)
562 PlayField16[si - 1] = 0; // sniknak left that field
565 if (bl < 8) // sniksnak still goes right
568 MovHighByte(&PlayField16[si], bl);
569 return subSnikSnakFromLeft;
572 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
573 ax = PlayField16[si - FieldWidth]; // check above
574 if (ax == 0 || LowByte(ax) == fiMurphy)
576 MovHighByte(&PlayField16[si], 7);
577 return subSnikSnakFromLeft;
580 ax = PlayField16[si + 1]; // check right(straight on)
583 PlayField16[si] = 0x4BB;
584 si = si + 1; // 1 field right
585 PlayField16[si] = 0x2811;
586 return subSnikSnakFromLeft;
589 if (LowByte(ax) == fiMurphy)
591 ExplodeFieldSP(si); // Explode
592 return subSnikSnakFromLeft;
595 ax = PlayField16[si + FieldWidth]; // check below
596 if (ax == 0 || LowByte(ax) == fiMurphy)
598 MovHighByte(&PlayField16[si], 0xB);
599 return subSnikSnakFromLeft;
602 MovHighByte(&PlayField16[si], 7);
604 return subSnikSnakFromLeft;
605 } // subSnikSnakFromLeft
607 static int subDrawSnikSnakTurnLeft(int si, int bx)
609 static int subDrawSnikSnakTurnLeft;
613 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
616 StretchedSprites.BltEx(X, Y, aniSnikSnak[bx]);
617 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
619 return subDrawSnikSnakTurnLeft;
622 static int subDrawSnikSnakTurnRight(int si, int bx)
624 static int subDrawSnikSnakTurnRight;
628 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
631 StretchedSprites.BltEx(X, Y, aniSnikSnak[0x10 - bx]);
632 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
634 return subDrawSnikSnakTurnRight;
637 static int subDrawSnikSnakFromBelow(int si, int bx)
639 static int subDrawSnikSnakFromBelow;
643 bx = bx - 0xF; // get and anti-increment sequence#
644 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
646 Y = GetStretchY(si + FieldWidth);
647 StretchedSprites.BltEx(X, Y, 0);
648 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
649 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
651 return subDrawSnikSnakFromBelow;
654 static int subDrawSnikSnakFromRight(int si, int bx)
656 static int subDrawSnikSnakFromRight;
660 bx = bx - 0x17; // get and increment sequence#
661 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
662 X = GetStretchX(si + 1);
664 StretchedSprites.BltEx(X, Y, 0);
665 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
666 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
668 return subDrawSnikSnakFromRight;
671 static int subDrawSnikSnakFromAbove(int si, int bx)
673 static int subDrawSnikSnakFromAbove;
677 bx = bx - 0x1F; // get and increment sequence#
678 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
680 Y = GetStretchY(si - FieldWidth);
681 StretchedSprites.BltEx(X, Y, 0);
682 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
683 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
685 return subDrawSnikSnakFromAbove;
688 static int subDrawSnikSnakFromLeft(int si, int bx)
690 static int subDrawSnikSnakFromLeft;
694 bx = bx - 0x27; // get and increment sequence#
695 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
696 X = GetStretchX(si - 1);
698 StretchedSprites.BltEx(X, Y, 0);
699 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
700 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
702 return subDrawSnikSnakFromLeft;