465431849745f3e91430e891b56eba2114c94dcc
[rocksndiamonds.git] / src / game_sp / SnikSnaks.c
1 // ----------------------------------------------------------------------------
2 // SnikSnaks.c
3 // ----------------------------------------------------------------------------
4
5 #include "SnikSnaks.h"
6
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);
19
20 // static char *VB_Name = "modSnikSnak";
21
22 // --- Option Explicit
23 // ==========================================================================
24 //                              SUBROUTINE
25 // Animate/move Snik-Snaks
26 // ==========================================================================
27
28 int subAnimateSnikSnaks(int si)
29 {
30   int subAnimateSnikSnaks;
31
32   int bx, Tmp;
33
34   if (SnikSnaksElectronsFrozen == 1)
35     return subAnimateSnikSnaks;
36
37   //  If LowByte(PlayField16(si)) <> fiSnikSnak Then Exit Function
38   // Debug.Assert (LowByte(PlayField16[si]) == fiSnikSnak);
39   bx = HighByte(PlayField16[si]);
40   Tmp = bx / 8;
41   switch (Tmp)
42   {
43     case 0:
44       subSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
45       break;
46
47     case 1:
48       subSnikSnakTurnRight(si, bx); // turn right
49       break;
50
51     case 2:
52       subSnikSnakFromBelow(si, bx); // access si from below
53       break;
54
55     case 3:
56       subSnikSnakFromRight(si, bx); // access si from right
57       break;
58
59     case 4:
60       subSnikSnakFromAbove(si, bx); // access si from above
61       break;
62
63     case 5:
64       subSnikSnakFromLeft(si, bx); // access si from left
65       break;
66
67     default:
68       // Debug.Assert(False);
69       break;
70   }
71
72   return subAnimateSnikSnaks;
73 } // subAnimateSnikSnaks
74
75 int subDrawAnimatedSnikSnaks(int si)
76 {
77   int subDrawAnimatedSnikSnaks;
78
79   int bx, Tmp;
80
81   // If SnikSnaksElectronsFrozen = 1 Then Exit Function
82   if (LowByte(PlayField16[si]) != fiSnikSnak)
83     return subDrawAnimatedSnikSnaks;
84
85   bx = HighByte(PlayField16[si]);
86   Tmp = bx / 8;
87   switch (Tmp)
88   {
89     case 0:
90       subDrawSnikSnakTurnLeft(si, bx); // turning, bx=0 -> point N, bx = 1 -> point NW etc.
91       break;
92
93     case 1:
94       subDrawSnikSnakTurnRight(si, bx); // turn right
95       break;
96
97     case 2:
98       subDrawSnikSnakFromBelow(si, bx); // access si from below
99       break;
100
101     case 3:
102       subDrawSnikSnakFromRight(si, bx); // access si from right
103       break;
104
105     case 4:
106       subDrawSnikSnakFromAbove(si, bx); // access si from above
107       break;
108
109     case 5:
110       subDrawSnikSnakFromLeft(si, bx); // access si from left
111       break;
112   }
113
114   return subDrawAnimatedSnikSnaks;
115 } // subAnimateSnikSnaks
116
117 static int subSnikSnakTurnLeft(int si, int bx)
118 {
119   static int subSnikSnakTurnLeft;
120
121   // int ax, ah, bl, dx, X, Y;
122   int ax, ah, bl, X, Y;
123
124   ax = (TimerVar & 3);
125   if (ax != 0)
126   {
127     if (ax == 3)
128       goto loc_g_7622;
129
130     return subSnikSnakTurnLeft;
131   } // loc_g_75E0:
132
133   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
134   X = GetStretchX(si);
135   Y = GetStretchY(si);
136   StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[bx]);
137   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
138   bx = (bx + 1) & 0x7;
139   MovHighByte(&PlayField16[si], bx);
140   return subSnikSnakTurnLeft;
141
142 locMayExplode760A:
143   ah = HighByte(ax);
144   if (ah == 0x1B)
145     return subSnikSnakTurnLeft;
146
147   if (ah == 0x19)
148     return subSnikSnakTurnLeft;
149
150   if (ah == 0x18)
151     return subSnikSnakTurnLeft;
152
153   if (ah == 0x1A)
154     return subSnikSnakTurnLeft;
155
156   ExplodeFieldSP(si); // Explode
157   return subSnikSnakTurnLeft;
158
159 loc_g_7622:
160   bl = HighByte(PlayField16[si]);
161   if (bl == 0)
162     goto loc_g_763B;
163
164   if (bl == 2)
165     goto loc_g_765E;
166
167   if (bl == 4)
168     goto loc_g_7681;
169
170   if (bl == 6)
171     goto loc_g_76A7;
172
173   return subSnikSnakTurnLeft;
174
175 loc_g_763B: // pointing up
176   ax = PlayField16[si - FieldWidth];
177   if (ax == 0) // above is empty -> go up
178     goto loc_g_764E;
179
180   if (LowByte(ax) == fiMurphy) // above is murphy -> explode
181     goto locMayExplode760A;
182
183   return subSnikSnakTurnLeft;
184
185 loc_g_764E: // above is empty -> go up
186   PlayField16[si] = 0x1BB;
187   si = si - FieldWidth;
188   PlayField16[si] = 0x1011;
189   return subSnikSnakTurnLeft;
190
191 loc_g_765E: // pointing left
192   ax = PlayField16[si - 1];
193   if (ax == 0) // left is empty -> go there
194     goto loc_g_7671;
195
196   if (LowByte(ax) == fiMurphy) // left is murphy -> explode
197     goto locMayExplode760A;
198
199   return subSnikSnakTurnLeft;
200
201 loc_g_7671: // left is empty -> go there
202   PlayField16[si] = 0x2BB;
203   si = si - 1;
204   PlayField16[si] = 0x1811;
205   return subSnikSnakTurnLeft;
206
207 loc_g_7681: // pointing down
208   ax = PlayField16[si + FieldWidth];
209   if (ax == 0) // below is empty -> go down
210     goto loc_g_7697;
211
212   if (LowByte(ax) == fiMurphy) // below is murphy -> explode
213     goto locMayExplode760A;
214
215   return subSnikSnakTurnLeft;
216
217 loc_g_7697: // below is empty -> go down
218   PlayField16[si] = 0x3BB;
219   si = si + FieldWidth;
220   PlayField16[si] = 0x2011;
221   return subSnikSnakTurnLeft;
222
223 loc_g_76A7: // pointing Right
224   ax = PlayField16[si + 1];
225   if (ax == 0) // right is empty -> go there
226     goto loc_g_76BD;
227
228   if (LowByte(ax) == fiMurphy) // right is murphy -> explode
229     goto locMayExplode760A;
230
231   return subSnikSnakTurnLeft;
232
233 loc_g_76BD: // right is empty -> go there
234   PlayField16[si] = 0x4BB;
235   si = si + 1;
236   PlayField16[si] = 0x2811;
237
238   return subSnikSnakTurnLeft;
239 } // subSnikSnakTurnLeft
240
241 static int subSnikSnakTurnRight(int si, int bx)
242 {
243   static int subSnikSnakTurnRight;
244
245   // int ax, ah, bl, dx, X, Y;
246   int ax, ah, bl, X, Y;
247
248   ax = (TimerVar & 3);
249   if (ax != 0)
250   {
251     if (ax == 3)
252       goto loc_g_771F;
253
254     return subSnikSnakTurnRight;
255   } // loc_g_76DB:
256
257   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
258   X = GetStretchX(si);
259   Y = GetStretchY(si);
260   StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[0x10 - bx]);
261   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
262   bx = ((bx + 1) & 0x7) | 8;
263   MovHighByte(&PlayField16[si], bx);
264   return subSnikSnakTurnRight;
265
266 locMayExplode7707:
267   ah = HighByte(ax);
268   if (ah == 0x1B)
269     return subSnikSnakTurnRight;
270
271   if (ah == 0x19)
272     return subSnikSnakTurnRight;
273
274   if (ah == 0x18)
275     return subSnikSnakTurnRight;
276
277   if (ah == 0x1A)
278     return subSnikSnakTurnRight;
279
280   ExplodeFieldSP(si); // Explode
281   return subSnikSnakTurnRight;
282
283 loc_g_771F:
284   bl = HighByte(PlayField16[si]);
285   if (bl == 0x8)
286     goto loc_g_7738;
287
288   if (bl == 0xA)
289     goto loc_g_77A4;
290
291   if (bl == 0xC)
292     goto loc_g_777E;
293
294   if (bl == 0xE)
295     goto loc_g_775B;
296
297   return subSnikSnakTurnRight;
298
299 loc_g_7738: // pointing up
300   ax = PlayField16[si - FieldWidth];
301   if (ax == 0) // above is empty -> go up
302     goto loc_g_774B;
303
304   if (LowByte(ax) == fiMurphy) // above is murphy -> explode
305     goto locMayExplode7707;
306
307   return subSnikSnakTurnRight;
308
309 loc_g_774B: // above is empty -> go up
310   PlayField16[si] = 0x1BB;
311   si = si - FieldWidth;
312   PlayField16[si] = 0x1011;
313   return subSnikSnakTurnRight;
314
315 loc_g_775B: // pointing left
316   ax = PlayField16[si - 1];
317   if (ax == 0) // left is empty -> go there
318     goto loc_g_776E;
319
320   if (LowByte(ax) == fiMurphy) // left is murphy -> explode
321     goto locMayExplode7707;
322
323   return subSnikSnakTurnRight;
324
325 loc_g_776E: // left is empty -> go there
326   PlayField16[si] = 0x2BB;
327   si = si - 1;
328   PlayField16[si] = 0x1811;
329   return subSnikSnakTurnRight;
330
331 loc_g_777E: // pointing down
332   ax = PlayField16[si + FieldWidth];
333   if (ax == 0) // below is empty -> go down
334     goto loc_g_7794;
335
336   if (LowByte(ax) == fiMurphy) // below is murphy -> explode
337     goto locMayExplode7707;
338
339   return subSnikSnakTurnRight;
340
341 loc_g_7794: // below is empty -> go down
342   PlayField16[si] = 0x3BB;
343   si = si + FieldWidth;
344   PlayField16[si] = 0x2011;
345   return subSnikSnakTurnRight;
346
347 loc_g_77A4: // pointing Right
348   ax = PlayField16[si + 1];
349   if (ax == 0) // right is empty -> go there
350     goto loc_g_77BA;
351
352   if (LowByte(ax) == fiMurphy) // right is murphy -> explode
353     goto locMayExplode7707;
354
355   return subSnikSnakTurnRight;
356
357 loc_g_77BA: // right is empty -> go there
358   PlayField16[si] = 0x4BB;
359   si = si + 1;
360   PlayField16[si] = 0x2811;
361
362   return subSnikSnakTurnRight;
363 } // subSnikSnakTurnRight
364
365 static int subSnikSnakFromBelow(int si, int bx)
366 {
367   static int subSnikSnakFromBelow;
368
369   // int ax, ah, bl, dx, X, Y;
370   int ax, bl, X, Y;
371
372   bx = bx - 0xF;  // get and increment sequence#
373   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
374   X = GetStretchX(si);
375   Y = GetStretchY(si + FieldWidth);
376   StretchedSprites.BltEx(X, Y, 0);
377   StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
378   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
379   bl = LowByte(bx);
380   if (bl == 7 && LowByte(PlayField16[si + FieldWidth]) != fiExplosion)
381   {
382     PlayField16[si + FieldWidth] = 0; // sniknak left that field
383   }
384
385   if (bl < 8) // sniksnak still goes up
386   {
387     bl = bl + 0x10;
388     MovHighByte(&PlayField16[si], bl);
389     return subSnikSnakFromBelow;
390   } // loc_g_7813
391
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
395   {
396     MovHighByte(&PlayField16[si], 1); // start to turn left
397     return subSnikSnakFromBelow;
398   } // loc_g_7826: and 'loc_g_7833:
399
400   ax = PlayField16[si - FieldWidth]; // cannot turn left -> check above
401   if (ax == 0) // check if empty
402   {
403     PlayField16[si] = 0x1BB; // mark as "sniksnak leaving"
404     si = si - FieldWidth; // go up!
405     PlayField16[si] = 0x1011;
406     return subSnikSnakFromBelow;
407   } // loc_g_784A:
408
409   if (LowByte(ax) == fiMurphy) // check for murphy above
410   {
411     ExplodeFieldSP(si); // Explode
412     return subSnikSnakFromBelow;
413   } // loc_g_7855:
414
415   ax = PlayField16[si + 1]; // check right field
416   if (ax == 0 || LowByte(ax) == fiMurphy) // check for empty or murphy
417   {
418     MovHighByte(&PlayField16[si], 9); // start to turn right
419     return subSnikSnakFromBelow;
420   } // loc_g_7862: and 'loc_g_786F:
421
422   // else: no way to go, start turning around
423   MovHighByte(&PlayField16[si], 1);
424
425   return subSnikSnakFromBelow;
426 } // subSnikSnakFromBelow
427
428 static int subSnikSnakFromRight(int si, int bx)
429 {
430   static int subSnikSnakFromRight;
431
432   // int ax, ah, bl, dx, X, Y;
433   int ax, bl, X, Y;
434
435   bx = bx - 0x17;  // get and increment sequence#
436   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
437   X = GetStretchX(si + 1);
438   Y = GetStretchY(si);
439   StretchedSprites.BltEx(X, Y, 0);
440   StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
441   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
442   bl = LowByte(bx);
443   if (bl == 7 && LowByte(PlayField16[si + 1]) != fiExplosion)
444   {
445     PlayField16[si + 1] = 0; // sniknak left that field
446   } // loc_g_78AC:
447
448   if (bl < 8) // sniksnak still goes left
449   {
450     bl = bl + 0x18;
451     MovHighByte(&PlayField16[si], bl);
452     return subSnikSnakFromRight;
453   } // loc_g_78B9:
454
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?
458   {
459     MovHighByte(&PlayField16[si], 3); // yes -> turn left down
460     return subSnikSnakFromRight;
461   } // loc_g_78CC: and 'loc_g_78D9:
462
463   ax = PlayField16[si - 1]; // check left, etc ... see the comments on subSnikSnakFromBelow()
464   if (ax == 0)
465   {
466     PlayField16[si] = 0x2BB;
467     si = si - 1;                // 1 field left
468     PlayField16[si] = 0x1811;
469     return subSnikSnakFromRight;
470   } // loc_g_78F0:
471
472   if (LowByte(ax) == fiMurphy)
473   {
474     ExplodeFieldSP(si);      // Explode
475     return subSnikSnakFromRight;
476   } // loc_g_78FB:
477
478   ax = PlayField16[si - FieldWidth]; // check above
479   if (ax == 0 || LowByte(ax) == fiMurphy)
480   {
481     MovHighByte(&PlayField16[si], 0xF);
482     return subSnikSnakFromRight;
483   } // loc_g_7908:loc_g_7915:
484
485   MovHighByte(&PlayField16[si], 3);
486
487   return subSnikSnakFromRight;
488 } // subSnikSnakFromRight
489
490 static int subSnikSnakFromAbove(int si, int bx)
491 {
492   static int subSnikSnakFromAbove;
493
494   // int ax, ah, bl, dx, X, Y;
495   int ax, bl, X, Y;
496
497   bx = bx - 0x1F;  // get and increment sequence#
498   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
499   X = GetStretchX(si);
500   Y = GetStretchY(si - FieldWidth);
501   StretchedSprites.BltEx(X, Y, 0);
502   StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
503   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
504   bl = LowByte(bx);
505   if (bl == 7 && LowByte(PlayField16[si - FieldWidth]) != fiExplosion)
506   {
507     PlayField16[si - FieldWidth] = 0; // sniknak left that field
508   }
509
510   if (bl < 8) // sniksnak still goes down
511   {
512     bl = bl + 0x20;
513     MovHighByte(&PlayField16[si], bl);
514     return subSnikSnakFromAbove;
515   } // loc_g_7813
516
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)
520   {
521     MovHighByte(&PlayField16[si], 5);
522     return subSnikSnakFromAbove;
523   } // loc_g_7986:
524
525   ax = PlayField16[si + FieldWidth]; // check below
526   if (ax == 0)
527   {
528     PlayField16[si] = 0x3BB;
529     si = si + FieldWidth;                 // 1 field down
530     PlayField16[si] = 0x2011;
531     return subSnikSnakFromAbove;
532   } // loc_g_799D:
533
534   if (LowByte(ax) == fiMurphy)
535   {
536     ExplodeFieldSP(si);        // Explode
537     return subSnikSnakFromAbove;
538   } // loc_g_79A8:
539
540   ax = PlayField16[si - 1]; // check left
541   if (ax == 0 || LowByte(ax) == fiMurphy)
542   {
543     MovHighByte(&PlayField16[si], 0xD);
544     return subSnikSnakFromAbove;
545   } // loc_g_79C2:
546
547   MovHighByte(&PlayField16[si], 5);
548
549   return subSnikSnakFromAbove;
550 } // subSnikSnakFromAbove
551
552 static int subSnikSnakFromLeft(int si, int bx)
553 {
554   static int subSnikSnakFromLeft;
555
556   // int ax, ah, bl, dx, X, Y;
557   int ax, bl, X, Y;
558
559   bx = bx - 0x27;  // get and increment sequence#
560   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
561   X = GetStretchX(si - 1);
562   Y = GetStretchY(si);
563   StretchedSprites.BltEx(X, Y, 0);
564   StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
565   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
566   bl = LowByte(bx);
567   if (bl == 7 && LowByte(PlayField16[si - 1]) != fiExplosion)
568   {
569     PlayField16[si - 1] = 0; // sniknak left that field
570   }
571
572   if (bl < 8) // sniksnak still goes right
573   {
574     bl = bl + 0x28;
575     MovHighByte(&PlayField16[si], bl);
576     return subSnikSnakFromLeft;
577   } // loc_g_78B9:
578
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)
582   {
583     MovHighByte(&PlayField16[si], 7);
584     return subSnikSnakFromLeft;
585   } // loc_g_7A2D:
586
587   ax = PlayField16[si + 1]; // check right(straight on)
588   if (ax == 0)
589   {
590     PlayField16[si] = 0x4BB;
591     si = si + 1;                   // 1 field right
592     PlayField16[si] = 0x2811;
593     return subSnikSnakFromLeft;
594   } // loc_g_7A44:
595
596   if (LowByte(ax) == fiMurphy)
597   {
598     ExplodeFieldSP(si);    // Explode
599     return subSnikSnakFromLeft;
600   } // loc_g_7A4F:
601
602   ax = PlayField16[si + FieldWidth]; // check below
603   if (ax == 0 || LowByte(ax) == fiMurphy)
604   {
605     MovHighByte(&PlayField16[si], 0xB);
606     return subSnikSnakFromLeft;
607   } // loc_g_7A69:
608
609   MovHighByte(&PlayField16[si], 7);
610
611   return subSnikSnakFromLeft;
612 } // subSnikSnakFromLeft
613
614 static int subDrawSnikSnakTurnLeft(int si, int bx)
615 {
616   static int subDrawSnikSnakTurnLeft;
617
618   int X, Y;
619
620   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
621   X = GetStretchX(si);
622   Y = GetStretchY(si);
623   StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[bx]);
624   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
625
626   return subDrawSnikSnakTurnLeft;
627 }
628
629 static int subDrawSnikSnakTurnRight(int si, int bx)
630 {
631   static int subDrawSnikSnakTurnRight;
632
633   int X, Y;
634
635   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
636   X = GetStretchX(si);
637   Y = GetStretchY(si);
638   StretchedSprites.BltEx(X, Y, aniFramesSnikSnak[0x10 - bx]);
639   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
640
641   return subDrawSnikSnakTurnRight;
642 }
643
644 static int subDrawSnikSnakFromBelow(int si, int bx)
645 {
646   static int subDrawSnikSnakFromBelow;
647
648   int X, Y;
649
650   bx = bx - 0xF; // get and anti-increment sequence#
651   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
652   X = GetStretchX(si);
653   Y = GetStretchY(si + FieldWidth);
654   StretchedSprites.BltEx(X, Y, 0);
655   StretchedSprites.BltEx(X, Y - bx * TwoPixels, aniSnikSnakUp + bx);
656   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
657
658   return subDrawSnikSnakFromBelow;
659 }
660
661 static int subDrawSnikSnakFromRight(int si, int bx)
662 {
663   static int subDrawSnikSnakFromRight;
664
665   int X, Y;
666
667   bx = bx - 0x17; // get and increment sequence#
668   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
669   X = GetStretchX(si + 1);
670   Y = GetStretchY(si);
671   StretchedSprites.BltEx(X, Y, 0);
672   StretchedSprites.BltEx(X - bx * TwoPixels, Y, aniSnikSnakLeft + bx);
673   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
674
675   return subDrawSnikSnakFromRight;
676 }
677
678 static int subDrawSnikSnakFromAbove(int si, int bx)
679 {
680   static int subDrawSnikSnakFromAbove;
681
682   int X, Y;
683
684   bx = bx - 0x1F; // get and increment sequence#
685   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
686   X = GetStretchX(si);
687   Y = GetStretchY(si - FieldWidth);
688   StretchedSprites.BltEx(X, Y, 0);
689   StretchedSprites.BltEx(X, Y + bx * TwoPixels, aniSnikSnakDown + bx);
690   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
691
692   return subDrawSnikSnakFromAbove;
693 }
694
695 static int subDrawSnikSnakFromLeft(int si, int bx)
696 {
697   static int subDrawSnikSnakFromLeft;
698
699   int X, Y;
700
701   bx = bx - 0x27; // get and increment sequence#
702   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
703   X = GetStretchX(si - 1);
704   Y = GetStretchY(si);
705   StretchedSprites.BltEx(X, Y, 0);
706   StretchedSprites.BltEx(X + bx * TwoPixels, Y, aniSnikSnakRight + bx);
707   // +++++++++++++++++++++++++++++++++++++++++++++++++++++
708
709   return subDrawSnikSnakFromLeft;
710 }