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";
22 // --- Option Explicit
23 // ==========================================================================
25 // Animate/move Snik-Snaks
26 // ==========================================================================
28 int subAnimateSnikSnaks(int si)
30 int subAnimateSnikSnaks;
34 if (SnikSnaksElectronsFrozen == 1)
35 return subAnimateSnikSnaks;
38 /* (not sure why this was removed -- this broke several level solutions) */
39 if (LowByte(PlayField16[si]) != fiSnikSnak)
40 return subAnimateSnikSnaks;
43 // If LowByte(PlayField16(si)) <> fiSnikSnak Then Exit Function
44 // Debug.Assert (LowByte(PlayField16[si]) == fiSnikSnak);
45 bx = HighByte(PlayField16[si]);
50 subSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
54 subSnikSnakTurnRight(si, bx); // turn right
58 subSnikSnakFromBelow(si, bx); // access si from below
62 subSnikSnakFromRight(si, bx); // access si from right
66 subSnikSnakFromAbove(si, bx); // access si from above
70 subSnikSnakFromLeft(si, bx); // access si from left
74 // Debug.Assert(False);
78 return subAnimateSnikSnaks;
79 } // subAnimateSnikSnaks
81 int subDrawAnimatedSnikSnaks(int si)
83 int subDrawAnimatedSnikSnaks;
87 // If SnikSnaksElectronsFrozen = 1 Then Exit Function
88 if (LowByte(PlayField16[si]) != fiSnikSnak)
89 return subDrawAnimatedSnikSnaks;
91 bx = HighByte(PlayField16[si]);
96 subDrawSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
100 subDrawSnikSnakTurnRight(si, bx); // turn right
104 subDrawSnikSnakFromBelow(si, bx); // access si from below
108 subDrawSnikSnakFromRight(si, bx); // access si from right
112 subDrawSnikSnakFromAbove(si, bx); // access si from above
116 subDrawSnikSnakFromLeft(si, bx); // access si from left
120 return subDrawAnimatedSnikSnaks;
121 } // subAnimateSnikSnaks
123 static int subSnikSnakTurnLeft(int si, int bx)
125 static int subSnikSnakTurnLeft;
127 // int ax, ah, bl, dx, X, Y;
136 return subSnikSnakTurnLeft;
140 subDrawSnikSnakTurnLeft(si, bx);
142 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
145 StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[bx]);
146 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
150 MovHighByte(&PlayField16[si], bx);
151 return subSnikSnakTurnLeft;
156 return subSnikSnakTurnLeft;
159 return subSnikSnakTurnLeft;
162 return subSnikSnakTurnLeft;
165 return subSnikSnakTurnLeft;
167 ExplodeFieldSP(si); // Explode
168 return subSnikSnakTurnLeft;
171 bl = HighByte(PlayField16[si]);
184 return subSnikSnakTurnLeft;
186 loc_g_763B: // pointing up
187 ax = PlayField16[si - FieldWidth];
188 if (ax == 0) // above is empty -> go up
191 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
192 goto locMayExplode760A;
194 return subSnikSnakTurnLeft;
196 loc_g_764E: // above is empty -> go up
197 PlayField16[si] = 0x1BB;
198 si = si - FieldWidth;
199 PlayField16[si] = 0x1011;
200 return subSnikSnakTurnLeft;
202 loc_g_765E: // pointing left
203 ax = PlayField16[si - 1];
204 if (ax == 0) // left is empty -> go there
207 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
208 goto locMayExplode760A;
210 return subSnikSnakTurnLeft;
212 loc_g_7671: // left is empty -> go there
213 PlayField16[si] = 0x2BB;
215 PlayField16[si] = 0x1811;
216 return subSnikSnakTurnLeft;
218 loc_g_7681: // pointing down
219 ax = PlayField16[si + FieldWidth];
220 if (ax == 0) // below is empty -> go down
223 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
224 goto locMayExplode760A;
226 return subSnikSnakTurnLeft;
228 loc_g_7697: // below is empty -> go down
229 PlayField16[si] = 0x3BB;
230 si = si + FieldWidth;
231 PlayField16[si] = 0x2011;
232 return subSnikSnakTurnLeft;
234 loc_g_76A7: // pointing Right
235 ax = PlayField16[si + 1];
236 if (ax == 0) // right is empty -> go there
239 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
240 goto locMayExplode760A;
242 return subSnikSnakTurnLeft;
244 loc_g_76BD: // right is empty -> go there
245 PlayField16[si] = 0x4BB;
247 PlayField16[si] = 0x2811;
249 return subSnikSnakTurnLeft;
250 } // subSnikSnakTurnLeft
252 static int subSnikSnakTurnRight(int si, int bx)
254 static int subSnikSnakTurnRight;
256 // int ax, ah, bl, dx, X, Y;
265 return subSnikSnakTurnRight;
269 subDrawSnikSnakTurnRight(si, bx);
271 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
274 StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[0x10 - bx]);
275 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
278 bx = ((bx + 1) & 0x7) | 8;
279 MovHighByte(&PlayField16[si], bx);
280 return subSnikSnakTurnRight;
285 return subSnikSnakTurnRight;
288 return subSnikSnakTurnRight;
291 return subSnikSnakTurnRight;
294 return subSnikSnakTurnRight;
296 ExplodeFieldSP(si); // Explode
297 return subSnikSnakTurnRight;
300 bl = HighByte(PlayField16[si]);
313 return subSnikSnakTurnRight;
315 loc_g_7738: // pointing up
316 ax = PlayField16[si - FieldWidth];
317 if (ax == 0) // above is empty -> go up
320 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
321 goto locMayExplode7707;
323 return subSnikSnakTurnRight;
325 loc_g_774B: // above is empty -> go up
326 PlayField16[si] = 0x1BB;
327 si = si - FieldWidth;
328 PlayField16[si] = 0x1011;
329 return subSnikSnakTurnRight;
331 loc_g_775B: // pointing left
332 ax = PlayField16[si - 1];
333 if (ax == 0) // left is empty -> go there
336 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
337 goto locMayExplode7707;
339 return subSnikSnakTurnRight;
341 loc_g_776E: // left is empty -> go there
342 PlayField16[si] = 0x2BB;
344 PlayField16[si] = 0x1811;
345 return subSnikSnakTurnRight;
347 loc_g_777E: // pointing down
348 ax = PlayField16[si + FieldWidth];
349 if (ax == 0) // below is empty -> go down
352 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
353 goto locMayExplode7707;
355 return subSnikSnakTurnRight;
357 loc_g_7794: // below is empty -> go down
358 PlayField16[si] = 0x3BB;
359 si = si + FieldWidth;
360 PlayField16[si] = 0x2011;
361 return subSnikSnakTurnRight;
363 loc_g_77A4: // pointing Right
364 ax = PlayField16[si + 1];
365 if (ax == 0) // right is empty -> go there
368 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
369 goto locMayExplode7707;
371 return subSnikSnakTurnRight;
373 loc_g_77BA: // right is empty -> go there
374 PlayField16[si] = 0x4BB;
376 PlayField16[si] = 0x2811;
378 return subSnikSnakTurnRight;
379 } // subSnikSnakTurnRight
381 static int subSnikSnakFromBelow(int si, int bx)
383 static int subSnikSnakFromBelow;
385 // int ax, ah, bl, dx, X, Y;
389 subDrawSnikSnakFromBelow(si, bx);
390 bx = bx - 0xF; // get and increment sequence#
392 bx = bx - 0xF; // get and increment sequence#
393 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
395 Y = GetStretchY(si + FieldWidth);
396 StretchedSprites.BltEx(X, Y, 0);
397 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
398 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
402 if (bl == 7 && LowByte(PlayField16[si + FieldWidth]) != fiExplosion)
404 PlayField16[si + FieldWidth] = 0; // sniknak left that field
407 if (bl < 8) // sniksnak still goes up
410 MovHighByte(&PlayField16[si], bl);
411 return subSnikSnakFromBelow;
414 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
415 ax = PlayField16[si - 1]; // check left field
416 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
418 MovHighByte(&PlayField16[si], 1); // start to turn left
419 return subSnikSnakFromBelow;
420 } // loc_g_7826: and 'loc_g_7833:
422 ax = PlayField16[si - FieldWidth]; // cannot turn left -> check above
423 if (ax == 0) // check if empty
425 PlayField16[si] = 0x1BB; // mark as "sniksnak leaving"
426 si = si - FieldWidth; // go up!
427 PlayField16[si] = 0x1011;
428 return subSnikSnakFromBelow;
431 if (LowByte(ax) == fiMurphy) // check for murphy above
433 ExplodeFieldSP(si); // Explode
434 return subSnikSnakFromBelow;
437 ax = PlayField16[si + 1]; // check right field
438 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
440 MovHighByte(&PlayField16[si], 9); // start to turn right
441 return subSnikSnakFromBelow;
442 } // loc_g_7862: and 'loc_g_786F:
444 // else: no way to go, start turning around
445 MovHighByte(&PlayField16[si], 1);
447 return subSnikSnakFromBelow;
448 } // subSnikSnakFromBelow
450 static int subSnikSnakFromRight(int si, int bx)
452 static int subSnikSnakFromRight;
454 // int ax, ah, bl, dx, X, Y;
458 subDrawSnikSnakFromRight(si, bx);
459 bx = bx - 0x17; // get and increment sequence#
461 bx = bx - 0x17; // get and increment sequence#
462 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
463 X = GetStretchX(si + 1);
465 StretchedSprites.BltEx(X, Y, 0);
466 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
467 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
471 if (bl == 7 && LowByte(PlayField16[si + 1]) != fiExplosion)
473 PlayField16[si + 1] = 0; // sniknak left that field
476 if (bl < 8) // sniksnak still goes left
479 MovHighByte(&PlayField16[si], bl);
480 return subSnikSnakFromRight;
483 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
484 ax = PlayField16[si + FieldWidth]; // check below
485 if (ax == 0 || LowByte(ax) == fiMurphy) // empty or murphy?
487 MovHighByte(&PlayField16[si], 3); // yes -> turn left down
488 return subSnikSnakFromRight;
489 } // loc_g_78CC: and 'loc_g_78D9:
491 ax = PlayField16[si - 1]; // check left, etc ... see the comments on subSnikSnakFromBelow()
494 PlayField16[si] = 0x2BB;
495 si = si - 1; // 1 field left
496 PlayField16[si] = 0x1811;
497 return subSnikSnakFromRight;
500 if (LowByte(ax) == fiMurphy)
502 ExplodeFieldSP(si); // Explode
503 return subSnikSnakFromRight;
506 ax = PlayField16[si - FieldWidth]; // check above
507 if (ax == 0 || LowByte(ax) == fiMurphy)
509 MovHighByte(&PlayField16[si], 0xF);
510 return subSnikSnakFromRight;
511 } // loc_g_7908:loc_g_7915:
513 MovHighByte(&PlayField16[si], 3);
515 return subSnikSnakFromRight;
516 } // subSnikSnakFromRight
518 static int subSnikSnakFromAbove(int si, int bx)
520 static int subSnikSnakFromAbove;
522 // int ax, ah, bl, dx, X, Y;
526 subDrawSnikSnakFromAbove(si, bx);
527 bx = bx - 0x1F; // get and increment sequence#
529 bx = bx - 0x1F; // get and increment sequence#
530 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
532 Y = GetStretchY(si - FieldWidth);
533 StretchedSprites.BltEx(X, Y, 0);
534 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
535 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
539 if (bl == 7 && LowByte(PlayField16[si - FieldWidth]) != fiExplosion)
541 PlayField16[si - FieldWidth] = 0; // sniknak left that field
544 if (bl < 8) // sniksnak still goes down
547 MovHighByte(&PlayField16[si], bl);
548 return subSnikSnakFromAbove;
551 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
552 ax = PlayField16[si + 1]; // check right
553 if (ax == 0 || LowByte(ax) == fiMurphy)
555 MovHighByte(&PlayField16[si], 5);
556 return subSnikSnakFromAbove;
559 ax = PlayField16[si + FieldWidth]; // check below
562 PlayField16[si] = 0x3BB;
563 si = si + FieldWidth; // 1 field down
564 PlayField16[si] = 0x2011;
565 return subSnikSnakFromAbove;
568 if (LowByte(ax) == fiMurphy)
570 ExplodeFieldSP(si); // Explode
571 return subSnikSnakFromAbove;
574 ax = PlayField16[si - 1]; // check left
575 if (ax == 0 || LowByte(ax) == fiMurphy)
577 MovHighByte(&PlayField16[si], 0xD);
578 return subSnikSnakFromAbove;
581 MovHighByte(&PlayField16[si], 5);
583 return subSnikSnakFromAbove;
584 } // subSnikSnakFromAbove
586 static int subSnikSnakFromLeft(int si, int bx)
588 static int subSnikSnakFromLeft;
590 // int ax, ah, bl, dx, X, Y;
594 subDrawSnikSnakFromLeft(si, bx);
595 bx = bx - 0x27; // get and increment sequence#
597 bx = bx - 0x27; // get and increment sequence#
598 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
599 X = GetStretchX(si - 1);
601 StretchedSprites.BltEx(X, Y, 0);
602 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
603 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
607 if (bl == 7 && LowByte(PlayField16[si - 1]) != fiExplosion)
609 PlayField16[si - 1] = 0; // sniknak left that field
612 if (bl < 8) // sniksnak still goes right
615 MovHighByte(&PlayField16[si], bl);
616 return subSnikSnakFromLeft;
619 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
620 ax = PlayField16[si - FieldWidth]; // check above
621 if (ax == 0 || LowByte(ax) == fiMurphy)
623 MovHighByte(&PlayField16[si], 7);
624 return subSnikSnakFromLeft;
627 ax = PlayField16[si + 1]; // check right(straight on)
630 PlayField16[si] = 0x4BB;
631 si = si + 1; // 1 field right
632 PlayField16[si] = 0x2811;
633 return subSnikSnakFromLeft;
636 if (LowByte(ax) == fiMurphy)
638 ExplodeFieldSP(si); // Explode
639 return subSnikSnakFromLeft;
642 ax = PlayField16[si + FieldWidth]; // check below
643 if (ax == 0 || LowByte(ax) == fiMurphy)
645 MovHighByte(&PlayField16[si], 0xB);
646 return subSnikSnakFromLeft;
649 MovHighByte(&PlayField16[si], 7);
651 return subSnikSnakFromLeft;
652 } // subSnikSnakFromLeft
654 static int subDrawSnikSnakTurnLeft(int si, int bx)
656 static int subDrawSnikSnakTurnLeft;
660 int pos = ((bx + 7) % 8) / 2;
662 GfxGraphic[GetX(si)][GetY(si)] = aniSnikSnakTurningLeft[pos];
666 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
669 StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[bx]);
670 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
673 return subDrawSnikSnakTurnLeft;
676 static int subDrawSnikSnakTurnRight(int si, int bx)
678 static int subDrawSnikSnakTurnRight;
681 // int pos = (bx - 8) / 2;
682 int pos = ((bx - 1) % 8) / 2;
684 GfxGraphic[GetX(si)][GetY(si)] = aniSnikSnakTurningRight[pos];
688 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
691 StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[0x10 - bx]);
692 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
695 return subDrawSnikSnakTurnRight;
698 static int subDrawSnikSnakFromBelow(int si, int bx)
700 static int subDrawSnikSnakFromBelow;
704 bx = bx - 0xF; // get and anti-increment sequence#
705 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
707 Y = GetStretchY(si + FieldWidth);
709 StretchedSprites.BltImg(X, Y, aniSpace, 0);
710 StretchedSprites.BltImg(X, Y - bx * TwoPixels, aniSnikSnakUp, bx);
712 StretchedSprites.BltEx(X, Y, 0);
713 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
715 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
717 return subDrawSnikSnakFromBelow;
720 static int subDrawSnikSnakFromRight(int si, int bx)
722 static int subDrawSnikSnakFromRight;
726 bx = bx - 0x17; // get and increment sequence#
727 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
728 X = GetStretchX(si + 1);
731 StretchedSprites.BltImg(X, Y, aniSpace, 0);
732 StretchedSprites.BltImg(X - bx * TwoPixels, Y, aniSnikSnakLeft, bx);
734 StretchedSprites.BltEx(X, Y, 0);
735 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
737 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
739 return subDrawSnikSnakFromRight;
742 static int subDrawSnikSnakFromAbove(int si, int bx)
744 static int subDrawSnikSnakFromAbove;
748 bx = bx - 0x1F; // get and increment sequence#
749 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
751 Y = GetStretchY(si - FieldWidth);
753 StretchedSprites.BltImg(X, Y, aniSpace, 0);
754 StretchedSprites.BltImg(X, Y + bx * TwoPixels, aniSnikSnakDown, bx);
756 StretchedSprites.BltEx(X, Y, 0);
757 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
759 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
761 return subDrawSnikSnakFromAbove;
764 static int subDrawSnikSnakFromLeft(int si, int bx)
766 static int subDrawSnikSnakFromLeft;
770 bx = bx - 0x27; // get and increment sequence#
771 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
772 X = GetStretchX(si - 1);
775 StretchedSprites.BltImg(X, Y, aniSpace, 0);
776 StretchedSprites.BltImg(X + bx * TwoPixels, Y, aniSnikSnakRight, bx);
778 StretchedSprites.BltEx(X, Y, 0);
779 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
781 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
783 return subDrawSnikSnakFromLeft;