rnd-20100224-1-src
[rocksndiamonds.git] / src / game_sp / OrangeDisk.c
1 // ----------------------------------------------------------------------------
2 // OrangeDisk.c
3 // ----------------------------------------------------------------------------
4
5 #include "OrangeDisk.h"
6
7 // static char *VB_Name = "modOrangeDisk";
8
9 // --- Option Explicit
10 // ==========================================================================
11 //                              SUBROUTINE
12 // Animate/move orange disks (falling)
13 // ==========================================================================
14
15 int subAnimateOrangeDisks(int si)
16 {
17   int subAnimateOrangeDisks;
18
19   int ax, bl, dx, X, Y;
20
21   ax = PlayField16[si];
22   if (LowByte(ax) != fiOrangeDisk)
23     return subAnimateOrangeDisks;
24
25   if (ax >= 0x3008) // disk is falling
26     goto loc_g_2804;
27
28   if (ax >= 0x2008) // disk is in wait state before falling
29     goto loc_g_27DA;
30
31   if (PlayField16[si + FieldWidth] == 0)
32     goto loc_g_27CF;
33
34   return subAnimateOrangeDisks;
35
36 loc_g_27CF: // below is empty -> disk may start to fall
37   MovHighByte(&PlayField16[si], 0x20);
38   MovHighByte(&PlayField16[si + FieldWidth], fiOrangeDisk);
39   return subAnimateOrangeDisks;
40
41 loc_g_27DA:
42   if (PlayField16[si + FieldWidth] == 0)
43   {
44     PlayField16[si] = fiOrangeDisk;
45     return subAnimateOrangeDisks;
46   } // loc_g_27E8:
47
48   bl = HighByte(PlayField16[si]) + 1;
49   if (bl == 0x22) // wait phase is finished
50     bl = 0x30;
51
52   MovHighByte(&PlayField16[si], bl);
53   return subAnimateOrangeDisks;
54
55 loc_g_2804: // disk is falling
56   // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57   dx = HighByte(PlayField16[si]) & 0x7;
58   X = GetStretchX(si);
59   Y = GetStretchY(si);
60 #if 1
61   StretchedSprites.BltImg(X, Y, aniSpace, 0);
62   StretchedSprites.BltImg(X, Y + TwoPixels * (dx + 1), aniOrangeDisk, dx);
63 #else
64   StretchedSprites.BltEx(X, Y, 0);
65   StretchedSprites.BltEx(X, Y + TwoPixels * (dx + 1), fiOrangeDisk);
66 #endif
67   // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
68   bl = HighByte(PlayField16[si]) + 1;
69   if ((bl & 0x7) != 0)
70   {
71     MovHighByte(&PlayField16[si], bl);
72     return subAnimateOrangeDisks;
73   }
74
75   PlayField16[si] = 0;
76   PlayField16[si + FieldWidth] = fiOrangeDisk;
77   si = si + FieldWidth;
78   if (PlayField16[si + FieldWidth] == 0)
79   {
80     MovHighByte(&PlayField16[si], 0x30); // go on falling down
81     MovHighByte(&PlayField16[si + FieldWidth], fiOrangeDisk);
82     return subAnimateOrangeDisks;
83   } // loc_g_2867:
84
85   if (LowByte(PlayField16[si + FieldWidth]) == fiExplosion)
86     return subAnimateOrangeDisks;
87
88   ExplodeFieldSP(si);                 // Explode
89
90   return subAnimateOrangeDisks;
91 } // subAnimateOrangeDisks
92