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