rnd-20090623-1-src
[rocksndiamonds.git] / src / game_sp / BugsTerminals.c
1 // ----------------------------------------------------------------------------
2 // BugsTerminals.c
3 // ----------------------------------------------------------------------------
4
5 #include "BugsTerminals.h"
6
7 static char *VB_Name = "modBugTerminal";
8 // --- Option Explicit
9
10 long GetTickCount();
11
12 byte *TerminalState;
13 int TerminalMaxCycles;
14 #define aniTerminal                     (0x80)
15
16 // ==========================================================================
17 //                              SUBROUTINE
18 // Animate bugs
19 // ==========================================================================
20
21 int subAnimateBugs(int si)
22 {
23   int subAnimateBugs;
24
25   int ax, bx, cx, dx, di;
26   int ah, bh, ch, dh, al, bl, cl, dl;
27
28   if (fiBug != LowByte(PlayField16[si]))
29     return subAnimateBugs;
30
31   if (0 != (TimerVar & 3))
32     return subAnimateBugs;
33
34   bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
35   bl = bl + 1;
36   if (bl >= 0xE)
37   {
38     bl = subGetRandomNumber(); // generate new random number
39     bl = -((bl & 0x3F) + 0x20);
40   }
41
42   MovHighByte(&PlayField16[si], bl); // save sequence#
43   if (bl < 0) // bug sleeps / is inactive
44     return subAnimateBugs;
45
46   // now the bug is active! Beware Murphy!
47   if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
48     goto markPlaySound;
49
50   if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
51     goto markPlaySound;
52
53   if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
54     goto markPlaySound;
55
56   if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
57     goto markPlaySound;
58
59   if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
60     goto markPlaySound;
61
62   if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
63     goto markPlaySound;
64
65   if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
66     goto markPlaySound;
67
68   if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
69     goto markPlaySound;
70
71   goto markDisplay;
72
73 markPlaySound:
74   subSoundFXBug(); // play dangerous sound
75
76 markDisplay:
77   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
78   cx = aniBug[bl];
79   StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
80   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81
82   return subAnimateBugs;
83 } // subAnimateBugs
84
85 // ==========================================================================
86 //                              SUBROUTINE
87 // Animate terminals
88 // ==========================================================================
89 int subAnimateTerminals(int si)
90 {
91   int subAnimateTerminals;
92
93   int bl, ax, al, X, Y;
94
95   if (LowByte(PlayField16[si]) != fiTerminal)
96     return subAnimateTerminals;
97
98   bl = HighByte(PlayField16[si]);
99   if ((bl & 0x80) == 0x80)
100     bl = (bl | 0xFF00);
101
102   bl = bl + 1;
103   if (bl <= 0)
104   {
105     MovHighByte(&PlayField16[si], bl);
106     return subAnimateTerminals;
107   }
108
109   bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
110   MovHighByte(&PlayField16[si], bl); // save new sequence#
111   bl = TerminalState[si] + 1;
112   if (bl == 8)
113   {
114     bl = 0;
115   }
116   else if (15 < bl)
117   {
118     bl = 8;
119   }
120
121   TerminalState[si] = bl;
122   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
123   al = aniTerminal + bl;
124   X = GetStretchX(si);
125   Y = GetStretchY(si);
126   StretchedSprites.BltEx(X, Y, al);
127   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128
129   return subAnimateTerminals;
130 } // subAnimateElectrons
131
132 // ==========================================================================
133 //                              SUBROUTINE
134 // Randomize random number generator
135 // ==========================================================================
136
137 int subRandomize()
138 {
139   int subRandomize;
140
141   long Tick, Tmp;
142
143   Tick = GetTickCount();
144   Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
145   RandomSeed = 0x7FFF & Tmp;
146   if ((Tmp & 0x8000) != 0)
147     RandomSeed = RandomSeed | 0x8000;
148
149   return subRandomize;
150 } // subRandomize
151
152
153 // ==========================================================================
154 //                              SUBROUTINE
155 // Generate new random number, first method (see also sub_g_8580)
156 // ==========================================================================
157
158 int subGetRandomNumber()
159 {
160   int subGetRandomNumber;
161
162   long Tmp, RSeed;
163
164   RSeed = (long)(0x7FFF & RandomSeed);
165   if (0x8000 == (RandomSeed & 0x8000))
166     RSeed = RSeed | 0x8000;
167
168   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
169   RandomSeed = 0x7FFF & Tmp;
170   if ((Tmp & 0x8000) != 0)
171     RandomSeed = RandomSeed | 0x8000;
172
173   subGetRandomNumber = Tmp / 2;
174   //  Mov ax, randomseed
175   //  Mov bx, &H5E5
176   //  mul bx                          ' dx:ax = reg * ax
177   //  Add ax, &H31
178   //  Mov randomseed, ax
179   //  shr ax,1
180
181   return subGetRandomNumber;
182 } // subGetRandomNumber
183