1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
7 // static char *VB_Name = "modElectron";
10 // ==========================================================================
12 // Animate/move Electrons
13 // ==========================================================================
15 int subAnimateElectrons(int si)
17 int subAnimateElectrons;
21 if (SnikSnaksElectronsFrozen == 1)
22 return subAnimateElectrons;
24 if (LowByte(PlayField16[si]) != fiElectron)
25 return subAnimateElectrons;
27 bx = HighByte(PlayField16[si]);
32 subElectronTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
36 subElectronTurnRight(si, bx); // turn right
40 subElectronFromBelow(si, bx); // access si from below
44 subElectronFromRight(si, bx); // access si from right
48 subElectronFromAbove(si, bx); // access si from above
52 subElectronFromLeft(si, bx); // access si from left
56 return subAnimateElectrons;
57 } // subAnimateElectrons
59 int subDrawAnimatedElectrons(int si)
61 int subDrawAnimatedElectrons;
65 // If SnikSnaksElectronsFrozen = 1 Then Exit Function
66 if (LowByte(PlayField16[si]) != fiElectron)
67 return subDrawAnimatedElectrons;
69 bx = HighByte(PlayField16[si]);
74 subDrawElectronTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
78 subDrawElectronTurnRight(si, bx); // turn right
82 subDrawElectronFromBelow(si, bx); // access si from below
86 subDrawElectronFromRight(si, bx); // access si from right
90 subDrawElectronFromAbove(si, bx); // access si from above
94 subDrawElectronFromLeft(si, bx); // access si from left
98 return subDrawAnimatedElectrons;
99 } // subDrawAnimatedElectrons
101 int subElectronTurnLeft(int si, int bx)
103 int subElectronTurnLeft;
105 // int ax, ah, bl, dx, X, Y;
114 return subElectronTurnLeft;
118 subDrawElectronTurnLeft(si, bx);
120 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
123 StretchedSprites.BltEx(X, Y, aniFramesElectron[bx]);
124 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
128 MovHighByte(&PlayField16[si], bx);
129 return subElectronTurnLeft;
132 bl = HighByte(PlayField16[si]);
145 return subElectronTurnLeft;
147 loc_g_7AE6: // pointing up
148 ax = PlayField16[si - FieldWidth];
149 if (ax == 0) // above is empty -> go up
152 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
155 return subElectronTurnLeft;
157 loc_g_7AF5: // above is empty -> go up
158 PlayField16[si] = 0x1BB;
159 si = si - FieldWidth; // 1 field up
160 PlayField16[si] = 0x1018;
161 return subElectronTurnLeft;
163 loc_g_7B05: // pointing left
164 ax = PlayField16[si - 1];
165 if (ax == 0) // left is empty -> go there
168 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
171 return subElectronTurnLeft;
173 loc_g_7B14: // left is empty -> go there
174 PlayField16[si] = 0x2BB;
175 si = si - 1; // 1 field left
176 PlayField16[si] = 0x1818;
177 return subElectronTurnLeft;
179 loc_g_7B24: // pointing down
180 ax = PlayField16[si + FieldWidth];
181 if (ax == 0) // below is empty -> go down
184 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
187 return subElectronTurnLeft;
189 loc_g_7B33: // below is empty -> go down
190 PlayField16[si] = 0x3BB;
191 si = si + FieldWidth; // 1 field down
192 PlayField16[si] = 0x2018;
193 return subElectronTurnLeft;
195 loc_g_7B43: // pointing Right
196 ax = PlayField16[si + 1];
197 if (ax == 0) // right is empty -> go there
200 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
203 return subElectronTurnLeft;
205 loc_g_7B55: // right is empty -> go there
206 PlayField16[si] = 0x4BB;
207 si = si + 1; // 1 field right
208 PlayField16[si] = 0x2818;
210 return subElectronTurnLeft;
211 } // subElectronTurnLeft
213 int subElectronTurnRight(int si, int bx)
215 int subElectronTurnRight;
217 // int ax, ah, bl, dx, X, Y;
226 return subElectronTurnRight;
230 subDrawElectronTurnRight(si, bx);
232 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
235 StretchedSprites.BltEx(X, Y, aniFramesElectron[0x10 - bx]);
236 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
239 bx = ((bx + 1) & 0x7) | 8;
240 MovHighByte(&PlayField16[si], bx);
241 return subElectronTurnRight;
244 bl = HighByte(PlayField16[si]);
257 return subElectronTurnRight;
259 loc_g_7BBC: // pointing up
260 ax = PlayField16[si - FieldWidth];
261 if (ax == 0) // above is empty -> go up
264 if (LowByte(ax) == fiMurphy) // above is murphy -> explode
267 return subElectronTurnRight;
269 loc_g_7BCB: // above is empty -> go up
270 PlayField16[si] = 0x1BB;
271 si = si - FieldWidth; // 1 field up
272 PlayField16[si] = 0x1018;
273 return subElectronTurnRight;
275 loc_g_7BDB: // pointing left
276 ax = PlayField16[si - 1];
277 if (ax == 0) // left is empty -> go there
280 if (LowByte(ax) == fiMurphy) // left is murphy -> explode
283 return subElectronTurnRight;
285 loc_g_7BEA: // left is empty -> go there
286 PlayField16[si] = 0x2BB;
287 si = si - 1; // 1 field left
288 PlayField16[si] = 0x1818;
289 return subElectronTurnRight;
291 loc_g_7BFA: // pointing down
292 ax = PlayField16[si + FieldWidth];
293 if (ax == 0) // below is empty -> go down
296 if (LowByte(ax) == fiMurphy) // below is murphy -> explode
299 return subElectronTurnRight;
301 loc_g_7C09: // below is empty -> go down
302 PlayField16[si] = 0x3BB;
303 si = si + FieldWidth; // 1 field down
304 PlayField16[si] = 0x2018;
305 return subElectronTurnRight;
307 loc_g_7C19: // pointing Right
308 ax = PlayField16[si + 1];
309 if (ax == 0) // right is empty -> go there
312 if (LowByte(ax) == fiMurphy) // right is murphy -> explode
315 return subElectronTurnRight;
317 loc_g_7C2B: // right is empty -> go there
318 PlayField16[si] = 0x4BB;
319 si = si + 1; // 1 field right
320 PlayField16[si] = 0x2818;
322 return subElectronTurnRight;
323 } // subElectronTurnRight
325 int subElectronFromBelow(int si, int bx)
327 int subElectronFromBelow;
329 // int ax, ah, bl, dx, X, Y;
333 subDrawElectronFromBelow(si, bx);
334 bx = bx - 0xF; // get and increment sequence#
336 bx = bx - 0xF; // get and increment sequence#
337 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
339 Y = GetStretchY(si + FieldWidth);
340 StretchedSprites.BltEx(X, Y, 0);
341 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniFramesElectron[bx]);
342 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
346 if (bl == 7 && LowByte(PlayField16[si + FieldWidth]) != fiExplosion)
348 PlayField16[si + FieldWidth] = 0; // electron left that field
351 if (bl < 8) // electron still goes up
354 MovHighByte(&PlayField16[si], bl);
355 return subElectronFromBelow;
358 PlayField16[si] = 0x18; // sequence#=8 -> arrived at the new field
359 ax = PlayField16[si - 1]; // check left field
360 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
362 MovHighByte(&PlayField16[si], 1); // start to turn left
363 return subElectronFromBelow;
366 ax = PlayField16[si - FieldWidth]; // cannot turn left -> check above
367 if (ax == 0) // check if empty
369 PlayField16[si] = 0x1BB; // mark as "electron leaving"
370 si = si - FieldWidth; // go up!
371 PlayField16[si] = 0x1018;
372 return subElectronFromBelow;
375 if (LowByte(ax) == fiMurphy) // check for murphy above
377 ExplodeFieldSP(si); // Explode
378 return subElectronFromBelow;
381 ax = PlayField16[si + 1]; // check right field
382 if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
384 MovHighByte(&PlayField16[si], 9); // start to turn right
385 return subElectronFromBelow;
388 // else: no way to go, start turning around
389 MovHighByte(&PlayField16[si], 1);
391 return subElectronFromBelow;
392 } // subElectronFromBelow
394 int subElectronFromRight(int si, int bx)
396 int subElectronFromRight;
398 // int ax, ah, bl, dx, X, Y;
402 subDrawElectronFromRight(si, bx);
403 bx = bx - 0x17; // get and increment sequence#
405 bx = bx - 0x17; // get and increment sequence#
406 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
407 X = GetStretchX(si + 1);
409 StretchedSprites.BltEx(X, Y, 0);
410 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniFramesElectron[bx]);
411 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
415 if (bl == 7 && LowByte(PlayField16[si + 1]) != fiExplosion)
417 PlayField16[si + 1] = 0; // electron left that field
420 if (bl < 8) // sniksnak still goes left
423 MovHighByte(&PlayField16[si], bl);
424 return subElectronFromRight;
427 PlayField16[si] = 0x18; // sequence#=8 -> arrived at the new field
428 ax = PlayField16[si + FieldWidth]; // check below
429 if (ax == 0 || LowByte(ax) == fiMurphy) // empty or murphy?
431 MovHighByte(&PlayField16[si], 3); // yes -> turn left down
432 return subElectronFromRight;
435 ax = PlayField16[si - 1]; // check left, etc ... see the comments on subElectronFromBelow()
438 PlayField16[si] = 0x2BB;
439 si = si - 1; // 1 field left
440 PlayField16[si] = 0x1818;
441 return subElectronFromRight;
444 if (LowByte(ax) == fiMurphy)
446 ExplodeFieldSP(si); // Explode
447 return subElectronFromRight;
450 ax = PlayField16[si - FieldWidth]; // check above
451 if (ax == 0 || LowByte(ax) == fiMurphy)
453 MovHighByte(&PlayField16[si], 0xF);
454 return subElectronFromRight;
457 MovHighByte(&PlayField16[si], 3);
459 return subElectronFromRight;
460 } // subElectronFromRight
462 int subElectronFromAbove(int si, int bx)
464 int subElectronFromAbove;
466 // int ax, ah, bl, dx, X, Y;
470 subDrawElectronFromAbove(si, bx);
471 bx = bx - 0x1F; // get and increment sequence#
473 bx = bx - 0x1F; // get and increment sequence#
474 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
476 Y = GetStretchY(si - FieldWidth);
477 StretchedSprites.BltEx(X, Y, 0);
478 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniFramesElectron[bx]);
479 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
483 if (bl == 7 && LowByte(PlayField16[si - FieldWidth]) != fiExplosion)
485 PlayField16[si - FieldWidth] = 0; // electron left that field
488 if (bl < 8) // electron still goes down
491 MovHighByte(&PlayField16[si], bl);
492 return subElectronFromAbove;
495 PlayField16[si] = 0x18; // sequence#=8 -> arrived at the new field
496 ax = PlayField16[si + 1]; // check right
497 if (ax == 0 || LowByte(ax) == fiMurphy)
499 MovHighByte(&PlayField16[si], 5);
500 return subElectronFromAbove;
503 ax = PlayField16[si + FieldWidth]; // check below
506 PlayField16[si] = 0x3BB;
507 si = si + FieldWidth; // 1 field down
508 PlayField16[si] = 0x2018;
509 return subElectronFromAbove;
512 if (LowByte(ax) == fiMurphy)
514 ExplodeFieldSP(si); // Explode
515 return subElectronFromAbove;
518 ax = PlayField16[si - 1]; // check left
519 if (ax == 0 || LowByte(ax) == fiMurphy)
521 MovHighByte(&PlayField16[si], 0xD);
522 return subElectronFromAbove;
525 MovHighByte(&PlayField16[si], 5);
527 return subElectronFromAbove;
528 } // subElectronFromAbove
530 int subElectronFromLeft(int si, int bx)
532 int subElectronFromLeft;
534 // int ax, ah, bl, dx, X, Y;
538 subDrawElectronFromLeft(si, bx);
539 bx = bx - 0x27; // get and increment sequence#
541 bx = bx - 0x27; // get and increment sequence#
542 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
543 X = GetStretchX(si - 1);
545 StretchedSprites.BltEx(X, Y, 0);
546 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniFramesElectron[bx]);
547 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
551 if (bl == 7 && LowByte(PlayField16[si - 1]) != fiExplosion)
553 PlayField16[si - 1] = 0; // electron left that field
556 if (bl < 8) // electron still goes right
559 MovHighByte(&PlayField16[si], bl);
560 return subElectronFromLeft;
563 PlayField16[si] = 0x18; // sequence#=8 -> arrived at the new field
564 ax = PlayField16[si - FieldWidth]; // check above
565 if (ax == 0 || LowByte(ax) == fiMurphy)
567 MovHighByte(&PlayField16[si], 7);
568 return subElectronFromLeft;
571 ax = PlayField16[si + 1]; // check right(straight on)
574 PlayField16[si] = 0x4BB;
575 si = si + 1; // 1 field right
576 PlayField16[si] = 0x2818;
577 return subElectronFromLeft;
580 if (LowByte(ax) == fiMurphy)
582 ExplodeFieldSP(si); // Explode
583 return subElectronFromLeft;
586 ax = PlayField16[si + FieldWidth]; // check below
587 if (ax == 0 || LowByte(ax) == fiMurphy)
589 MovHighByte(&PlayField16[si], 0xB);
590 return subElectronFromLeft;
593 MovHighByte(&PlayField16[si], 7);
595 return subElectronFromLeft;
596 } // subElectronFromLeft
598 int subDrawElectronTurnLeft(int si, int bx)
600 int subDrawElectronTurnLeft;
604 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
608 StretchedSprites.BltImg(X, Y, aniElectron, bx);
610 StretchedSprites.BltEx(X, Y, aniFramesElectron[bx]);
612 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
614 return subDrawElectronTurnLeft;
617 int subDrawElectronTurnRight(int si, int bx)
619 int subDrawElectronTurnRight;
623 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
627 StretchedSprites.BltImg(X, Y, aniElectron, 0x10 - bx);
629 StretchedSprites.BltEx(X, Y, aniFramesElectron[0x10 - bx]);
631 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
633 return subDrawElectronTurnRight;
636 int subDrawElectronFromBelow(int si, int bx)
638 int subDrawElectronFromBelow;
642 bx = bx - 0xF; // get and increment sequence#
643 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
645 Y = GetStretchY(si + FieldWidth);
647 StretchedSprites.BltImg(X, Y, aniSpace, 0);
648 StretchedSprites.BltImg(X, Y - bx * TwoPixels, aniElectron, bx);
650 StretchedSprites.BltEx(X, Y, 0);
651 StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniFramesElectron[bx]);
653 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
655 return subDrawElectronFromBelow;
658 int subDrawElectronFromRight(int si, int bx)
660 int subDrawElectronFromRight;
664 bx = bx - 0x17; // get and increment sequence#
665 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
666 X = GetStretchX(si + 1);
669 StretchedSprites.BltImg(X, Y, aniSpace, 0);
670 StretchedSprites.BltImg(X - bx * TwoPixels, Y, aniElectron, bx);
672 StretchedSprites.BltEx(X, Y, 0);
673 StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniFramesElectron[bx]);
675 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
677 return subDrawElectronFromRight;
680 int subDrawElectronFromAbove(int si, int bx)
682 int subDrawElectronFromAbove;
686 bx = bx - 0x1F; // get and increment sequence#
687 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
689 Y = GetStretchY(si - FieldWidth);
691 StretchedSprites.BltImg(X, Y, aniSpace, 0);
692 StretchedSprites.BltImg(X, Y + bx * TwoPixels, aniElectron, bx);
694 StretchedSprites.BltEx(X, Y, 0);
695 StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniFramesElectron[bx]);
697 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
699 return subDrawElectronFromAbove;
702 int subDrawElectronFromLeft(int si, int bx)
704 int subDrawElectronFromLeft;
708 bx = bx - 0x27; // get and increment sequence#
709 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
710 X = GetStretchX(si - 1);
713 StretchedSprites.BltImg(X, Y, aniSpace, 0);
714 StretchedSprites.BltImg(X + bx * TwoPixels, Y, aniElectron, bx);
716 StretchedSprites.BltEx(X, Y, 0);
717 StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniFramesElectron[bx]);
719 // +++++++++++++++++++++++++++++++++++++++++++++++++++++
721 return subDrawElectronFromLeft;