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