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;
37 // If LowByte(PlayField16(si)) <> fiSnikSnak Then Exit Function
38 // Debug.Assert (LowByte(PlayField16[si]) == fiSnikSnak);
39 bx = HighByte(PlayField16[si]);
44 subSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
48 subSnikSnakTurnRight(si, bx); // turn right
52 subSnikSnakFromBelow(si, bx); // access si from below
56 subSnikSnakFromRight(si, bx); // access si from right
60 subSnikSnakFromAbove(si, bx); // access si from above
64 subSnikSnakFromLeft(si, bx); // access si from left
68 // Debug.Assert(False);
72 return subAnimateSnikSnaks;
73 } // subAnimateSnikSnaks
75 int subDrawAnimatedSnikSnaks(int si)
77 int subDrawAnimatedSnikSnaks;
81 // If SnikSnaksElectronsFrozen = 1 Then Exit Function
82 if (LowByte(PlayField16[si]) != fiSnikSnak)
83 return subDrawAnimatedSnikSnaks;
85 bx = HighByte(PlayField16[si]);
90 subDrawSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
94 subDrawSnikSnakTurnRight(si, bx); // turn right
98 subDrawSnikSnakFromBelow(si, bx); // access si from below
102 subDrawSnikSnakFromRight(si, bx); // access si from right
106 subDrawSnikSnakFromAbove(si, bx); // access si from above
110 subDrawSnikSnakFromLeft(si, bx); // access si from left
114 return subDrawAnimatedSnikSnaks;
115 } // subAnimateSnikSnaks
117 static int subSnikSnakTurnLeft(int si, int bx)
119 static int subSnikSnakTurnLeft;
121 // int ax, ah, bl, dx, X, Y;
122 int ax, ah, bl, X, Y;
130 return subSnikSnakTurnLeft;
133 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
136 StretchedSprites.BltEx(X, Y, aniSnikSnak[bx]);
137 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
139 MovHighByte(&PlayField16[si], bx);
140 return subSnikSnakTurnLeft;
145 return subSnikSnakTurnLeft;
148 return subSnikSnakTurnLeft;
151 return subSnikSnakTurnLeft;
154 return subSnikSnakTurnLeft;
156 ExplodeFieldSP(si); // Explode
157 return subSnikSnakTurnLeft;
160 bl = HighByte(PlayField16[si]);
173 return subSnikSnakTurnLeft;
175 loc_g_763B: // pointing up
176 ax = PlayField16[si - FieldWidth];
177 if (ax == 0) // above is empty -> go up
180 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
181 goto locMayExplode760A;
183 return subSnikSnakTurnLeft;
185 loc_g_764E: // above is empty -> go up
186 PlayField16[si] = 0x1BB;
187 si = si - FieldWidth;
188 PlayField16[si] = 0x1011;
189 return subSnikSnakTurnLeft;
191 loc_g_765E: // pointing left
192 ax = PlayField16[si - 1];
193 if (ax == 0) // left is empty -> go there
196 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
197 goto locMayExplode760A;
199 return subSnikSnakTurnLeft;
201 loc_g_7671: // left is empty -> go there
202 PlayField16[si] = 0x2BB;
204 PlayField16[si] = 0x1811;
205 return subSnikSnakTurnLeft;
207 loc_g_7681: // pointing down
208 ax = PlayField16[si + FieldWidth];
209 if (ax == 0) // below is empty -> go down
212 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
213 goto locMayExplode760A;
215 return subSnikSnakTurnLeft;
217 loc_g_7697: // below is empty -> go down
218 PlayField16[si] = 0x3BB;
219 si = si + FieldWidth;
220 PlayField16[si] = 0x2011;
221 return subSnikSnakTurnLeft;
223 loc_g_76A7: // pointing Right
224 ax = PlayField16[si + 1];
225 if (ax == 0) // right is empty -> go there
228 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
229 goto locMayExplode760A;
231 return subSnikSnakTurnLeft;
233 loc_g_76BD: // right is empty -> go there
234 PlayField16[si] = 0x4BB;
236 PlayField16[si] = 0x2811;
238 return subSnikSnakTurnLeft;
239 } // subSnikSnakTurnLeft
241 static int subSnikSnakTurnRight(int si, int bx)
243 static int subSnikSnakTurnRight;
245 // int ax, ah, bl, dx, X, Y;
246 int ax, ah, bl, X, Y;
254 return subSnikSnakTurnRight;
257 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
260 StretchedSprites.BltEx(X, Y, aniSnikSnak[0x10 - bx]);
261 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
262 bx = ((bx + 1) & 0x7) | 8;
263 MovHighByte(&PlayField16[si], bx);
264 return subSnikSnakTurnRight;
269 return subSnikSnakTurnRight;
272 return subSnikSnakTurnRight;
275 return subSnikSnakTurnRight;
278 return subSnikSnakTurnRight;
280 ExplodeFieldSP(si); // Explode
281 return subSnikSnakTurnRight;
284 bl = HighByte(PlayField16[si]);
297 return subSnikSnakTurnRight;
299 loc_g_7738: // pointing up
300 ax = PlayField16[si - FieldWidth];
301 if (ax == 0) // above is empty -> go up
304 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
305 goto locMayExplode7707;
307 return subSnikSnakTurnRight;
309 loc_g_774B: // above is empty -> go up
310 PlayField16[si] = 0x1BB;
311 si = si - FieldWidth;
312 PlayField16[si] = 0x1011;
313 return subSnikSnakTurnRight;
315 loc_g_775B: // pointing left
316 ax = PlayField16[si - 1];
317 if (ax == 0) // left is empty -> go there
320 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
321 goto locMayExplode7707;
323 return subSnikSnakTurnRight;
325 loc_g_776E: // left is empty -> go there
326 PlayField16[si] = 0x2BB;
328 PlayField16[si] = 0x1811;
329 return subSnikSnakTurnRight;
331 loc_g_777E: // pointing down
332 ax = PlayField16[si + FieldWidth];
333 if (ax == 0) // below is empty -> go down
336 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
337 goto locMayExplode7707;
339 return subSnikSnakTurnRight;
341 loc_g_7794: // below is empty -> go down
342 PlayField16[si] = 0x3BB;
343 si = si + FieldWidth;
344 PlayField16[si] = 0x2011;
345 return subSnikSnakTurnRight;
347 loc_g_77A4: // pointing Right
348 ax = PlayField16[si + 1];
349 if (ax == 0) // right is empty -> go there
352 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
353 goto locMayExplode7707;
355 return subSnikSnakTurnRight;
357 loc_g_77BA: // right is empty -> go there
358 PlayField16[si] = 0x4BB;
360 PlayField16[si] = 0x2811;
362 return subSnikSnakTurnRight;
363 } // subSnikSnakTurnRight
365 static int subSnikSnakFromBelow(int si, int bx)
367 static int subSnikSnakFromBelow;
369 // int ax, ah, bl, dx, X, Y;
372 bx = bx - 0xF; // get and increment sequence#
373 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
375 Y = GetStretchY(si + FieldWidth);
376 StretchedSprites.BltEx(X, Y, 0);
377 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
378 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
380 if (bl == 7 && LowByte(PlayField16[si + FieldWidth]) != fiExplosion)
382 PlayField16[si + FieldWidth] = 0; // sniknak left that field
385 if (bl < 8) // sniksnak still goes up
388 MovHighByte(&PlayField16[si], bl);
389 return subSnikSnakFromBelow;
392 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
393 ax = PlayField16[si - 1]; // check left field
394 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
396 MovHighByte(&PlayField16[si], 1); // start to turn left
397 return subSnikSnakFromBelow;
398 } // loc_g_7826: and 'loc_g_7833:
400 ax = PlayField16[si - FieldWidth]; // cannot turn left -> check above
401 if (ax == 0) // check if empty
403 PlayField16[si] = 0x1BB; // mark as "sniksnak leaving"
404 si = si - FieldWidth; // go up!
405 PlayField16[si] = 0x1011;
406 return subSnikSnakFromBelow;
409 if (LowByte(ax) == fiMurphy) // check for murphy above
411 ExplodeFieldSP(si); // Explode
412 return subSnikSnakFromBelow;
415 ax = PlayField16[si + 1]; // check right field
416 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
418 MovHighByte(&PlayField16[si], 9); // start to turn right
419 return subSnikSnakFromBelow;
420 } // loc_g_7862: and 'loc_g_786F:
422 // else: no way to go, start turning around
423 MovHighByte(&PlayField16[si], 1);
425 return subSnikSnakFromBelow;
426 } // subSnikSnakFromBelow
428 static int subSnikSnakFromRight(int si, int bx)
430 static int subSnikSnakFromRight;
432 // int ax, ah, bl, dx, X, Y;
435 bx = bx - 0x17; // get and increment sequence#
436 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
437 X = GetStretchX(si + 1);
439 StretchedSprites.BltEx(X, Y, 0);
440 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
441 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
443 if (bl == 7 && LowByte(PlayField16[si + 1]) != fiExplosion)
445 PlayField16[si + 1] = 0; // sniknak left that field
448 if (bl < 8) // sniksnak still goes left
451 MovHighByte(&PlayField16[si], bl);
452 return subSnikSnakFromRight;
455 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
456 ax = PlayField16[si + FieldWidth]; // check below
457 if (ax == 0 || LowByte(ax) == fiMurphy) // empty or murphy?
459 MovHighByte(&PlayField16[si], 3); // yes -> turn left down
460 return subSnikSnakFromRight;
461 } // loc_g_78CC: and 'loc_g_78D9:
463 ax = PlayField16[si - 1]; // check left, etc ... see the comments on subSnikSnakFromBelow()
466 PlayField16[si] = 0x2BB;
467 si = si - 1; // 1 field left
468 PlayField16[si] = 0x1811;
469 return subSnikSnakFromRight;
472 if (LowByte(ax) == fiMurphy)
474 ExplodeFieldSP(si); // Explode
475 return subSnikSnakFromRight;
478 ax = PlayField16[si - FieldWidth]; // check above
479 if (ax == 0 || LowByte(ax) == fiMurphy)
481 MovHighByte(&PlayField16[si], 0xF);
482 return subSnikSnakFromRight;
483 } // loc_g_7908:loc_g_7915:
485 MovHighByte(&PlayField16[si], 3);
487 return subSnikSnakFromRight;
488 } // subSnikSnakFromRight
490 static int subSnikSnakFromAbove(int si, int bx)
492 static int subSnikSnakFromAbove;
494 // int ax, ah, bl, dx, X, Y;
497 bx = bx - 0x1F; // get and increment sequence#
498 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
500 Y = GetStretchY(si - FieldWidth);
501 StretchedSprites.BltEx(X, Y, 0);
502 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
503 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
505 if (bl == 7 && LowByte(PlayField16[si - FieldWidth]) != fiExplosion)
507 PlayField16[si - FieldWidth] = 0; // sniknak left that field
510 if (bl < 8) // sniksnak still goes down
513 MovHighByte(&PlayField16[si], bl);
514 return subSnikSnakFromAbove;
517 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
518 ax = PlayField16[si + 1]; // check right
519 if (ax == 0 || LowByte(ax) == fiMurphy)
521 MovHighByte(&PlayField16[si], 5);
522 return subSnikSnakFromAbove;
525 ax = PlayField16[si + FieldWidth]; // check below
528 PlayField16[si] = 0x3BB;
529 si = si + FieldWidth; // 1 field down
530 PlayField16[si] = 0x2011;
531 return subSnikSnakFromAbove;
534 if (LowByte(ax) == fiMurphy)
536 ExplodeFieldSP(si); // Explode
537 return subSnikSnakFromAbove;
540 ax = PlayField16[si - 1]; // check left
541 if (ax == 0 || LowByte(ax) == fiMurphy)
543 MovHighByte(&PlayField16[si], 0xD);
544 return subSnikSnakFromAbove;
547 MovHighByte(&PlayField16[si], 5);
549 return subSnikSnakFromAbove;
550 } // subSnikSnakFromAbove
552 static int subSnikSnakFromLeft(int si, int bx)
554 static int subSnikSnakFromLeft;
556 // int ax, ah, bl, dx, X, Y;
559 bx = bx - 0x27; // get and increment sequence#
560 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
561 X = GetStretchX(si - 1);
563 StretchedSprites.BltEx(X, Y, 0);
564 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
565 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
567 if (bl == 7 && LowByte(PlayField16[si - 1]) != fiExplosion)
569 PlayField16[si - 1] = 0; // sniknak left that field
572 if (bl < 8) // sniksnak still goes right
575 MovHighByte(&PlayField16[si], bl);
576 return subSnikSnakFromLeft;
579 PlayField16[si] = 0x11; // sequence#=8 -> arrived at the new field
580 ax = PlayField16[si - FieldWidth]; // check above
581 if (ax == 0 || LowByte(ax) == fiMurphy)
583 MovHighByte(&PlayField16[si], 7);
584 return subSnikSnakFromLeft;
587 ax = PlayField16[si + 1]; // check right(straight on)
590 PlayField16[si] = 0x4BB;
591 si = si + 1; // 1 field right
592 PlayField16[si] = 0x2811;
593 return subSnikSnakFromLeft;
596 if (LowByte(ax) == fiMurphy)
598 ExplodeFieldSP(si); // Explode
599 return subSnikSnakFromLeft;
602 ax = PlayField16[si + FieldWidth]; // check below
603 if (ax == 0 || LowByte(ax) == fiMurphy)
605 MovHighByte(&PlayField16[si], 0xB);
606 return subSnikSnakFromLeft;
609 MovHighByte(&PlayField16[si], 7);
611 return subSnikSnakFromLeft;
612 } // subSnikSnakFromLeft
614 static int subDrawSnikSnakTurnLeft(int si, int bx)
616 static int subDrawSnikSnakTurnLeft;
620 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
623 StretchedSprites.BltEx(X, Y, aniSnikSnak[bx]);
624 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
626 return subDrawSnikSnakTurnLeft;
629 static int subDrawSnikSnakTurnRight(int si, int bx)
631 static int subDrawSnikSnakTurnRight;
635 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
638 StretchedSprites.BltEx(X, Y, aniSnikSnak[0x10 - bx]);
639 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
641 return subDrawSnikSnakTurnRight;
644 static int subDrawSnikSnakFromBelow(int si, int bx)
646 static int subDrawSnikSnakFromBelow;
650 bx = bx - 0xF; // get and anti-increment sequence#
651 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
653 Y = GetStretchY(si + FieldWidth);
654 StretchedSprites.BltEx(X, Y, 0);
655 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
656 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
658 return subDrawSnikSnakFromBelow;
661 static int subDrawSnikSnakFromRight(int si, int bx)
663 static int subDrawSnikSnakFromRight;
667 bx = bx - 0x17; // get and increment sequence#
668 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
669 X = GetStretchX(si + 1);
671 StretchedSprites.BltEx(X, Y, 0);
672 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
673 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
675 return subDrawSnikSnakFromRight;
678 static int subDrawSnikSnakFromAbove(int si, int bx)
680 static int subDrawSnikSnakFromAbove;
684 bx = bx - 0x1F; // get and increment sequence#
685 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
687 Y = GetStretchY(si - FieldWidth);
688 StretchedSprites.BltEx(X, Y, 0);
689 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
690 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
692 return subDrawSnikSnakFromAbove;
695 static int subDrawSnikSnakFromLeft(int si, int bx)
697 static int subDrawSnikSnakFromLeft;
701 bx = bx - 0x27; // get and increment sequence#
702 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
703 X = GetStretchX(si - 1);
705 StretchedSprites.BltEx(X, Y, 0);
706 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
707 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
709 return subDrawSnikSnakFromLeft;