1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
5 #include "BugsTerminals.h"
7 static char *VB_Name = "modBugTerminal";
13 int TerminalMaxCycles;
14 #define aniTerminal (0x80)
16 // ==========================================================================
19 // ==========================================================================
21 int subAnimateBugs(int si)
25 int ax, bx, cx, dx, di;
26 int ah, bh, ch, dh, al, bl, cl, dl;
28 if (fiBug != LowByte(PlayField16[si]))
29 return subAnimateBugs;
31 if (0 != (TimerVar & 3))
32 return subAnimateBugs;
34 bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
38 bl = subGetRandomNumber(); // generate new random number
39 bl = -((bl & 0x3F) + 0x20);
42 MovHighByte(&PlayField16[si], bl); // save sequence#
43 if (bl < 0) // bug sleeps / is inactive
44 return subAnimateBugs;
46 // now the bug is active! Beware Murphy!
47 if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
50 if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
53 if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
56 if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
59 if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
62 if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
65 if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
68 if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
74 subSoundFXBug(); // play dangerous sound
77 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79 StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
80 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82 return subAnimateBugs;
85 // ==========================================================================
88 // ==========================================================================
89 int subAnimateTerminals(int si)
91 int subAnimateTerminals;
95 if (LowByte(PlayField16[si]) != fiTerminal)
96 return subAnimateTerminals;
98 bl = HighByte(PlayField16[si]);
99 if ((bl & 0x80) == 0x80)
105 MovHighByte(&PlayField16[si], bl);
106 return subAnimateTerminals;
109 bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
110 MovHighByte(&PlayField16[si], bl); // save new sequence#
111 bl = TerminalState[si] + 1;
121 TerminalState[si] = bl;
122 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
123 al = aniTerminal + bl;
126 StretchedSprites.BltEx(X, Y, al);
127 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129 return subAnimateTerminals;
130 } // subAnimateElectrons
132 // ==========================================================================
134 // Randomize random number generator
135 // ==========================================================================
143 Tick = GetTickCount();
144 Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
145 RandomSeed = 0x7FFF & Tmp;
146 if ((Tmp & 0x8000) != 0)
147 RandomSeed = RandomSeed | 0x8000;
153 // ==========================================================================
155 // Generate new random number, first method (see also sub_g_8580)
156 // ==========================================================================
158 int subGetRandomNumber()
160 int subGetRandomNumber;
164 RSeed = (long)(0x7FFF & RandomSeed);
165 if (0x8000 == (RandomSeed & 0x8000))
166 RSeed = RSeed | 0x8000;
168 Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
169 RandomSeed = 0x7FFF & Tmp;
170 if ((Tmp & 0x8000) != 0)
171 RandomSeed = RandomSeed | 0x8000;
173 subGetRandomNumber = Tmp / 2;
174 // Mov ax, randomseed
176 // mul bx ' dx:ax = reg * ax
178 // Mov randomseed, ax
181 return subGetRandomNumber;
182 } // subGetRandomNumber