rnd-20100207-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   StretchedSprites.BltEx(X, Y, 0);
61   StretchedSprites.BltEx(X, Y + TwoPixels * (dx + 1), fiOrangeDisk);
62   // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
63   bl = HighByte(PlayField16[si]) + 1;
64   if ((bl & 0x7) != 0)
65   {
66     MovHighByte(&PlayField16[si], bl);
67     return subAnimateOrangeDisks;
68   }
69
70   PlayField16[si] = 0;
71   PlayField16[si + FieldWidth] = fiOrangeDisk;
72   si = si + FieldWidth;
73   if (PlayField16[si + FieldWidth] == 0)
74   {
75     MovHighByte(&PlayField16[si], 0x30); // go on falling down
76     MovHighByte(&PlayField16[si + FieldWidth], fiOrangeDisk);
77     return subAnimateOrangeDisks;
78   } // loc_g_2867:
79
80   if (LowByte(PlayField16[si + FieldWidth]) == fiExplosion)
81     return subAnimateOrangeDisks;
82
83   ExplodeFieldSP(si);                 // Explode
84
85   return subAnimateOrangeDisks;
86 } // subAnimateOrangeDisks
87