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