1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
5 #include "BugsTerminals.h"
7 // static char *VB_Name = "modBugTerminal";
11 long MyGetTickCount();
14 int TerminalMaxCycles;
17 #define aniTerminal (0x80)
20 // ==========================================================================
23 // ==========================================================================
25 int subAnimateBugs(int si)
29 // int ax, bx, cx, dx, di;
30 // int ah, bh, ch, dh, al, bl, cl, dl;
34 if (fiBug != LowByte(PlayField16[si]))
35 return subAnimateBugs;
37 if (0 != (TimerVar & 3))
38 return subAnimateBugs;
40 bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
44 bl = subGetRandomNumber(); // generate new random number
45 bl = -((bl & 0x3F) + 0x20);
48 MovHighByte(&PlayField16[si], bl); // save sequence#
49 if (bl < 0) // bug sleeps / is inactive
50 return subAnimateBugs;
52 // now the bug is active! Beware Murphy!
53 if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
56 if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
59 if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
62 if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
65 if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
68 if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
71 if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
74 if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
80 subSoundFXBug(); // play dangerous sound
83 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
84 cx = aniFramesBug[bl];
85 StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
86 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
88 return subAnimateBugs;
91 // ==========================================================================
94 // ==========================================================================
95 int subAnimateTerminals(int si)
97 int subAnimateTerminals;
99 // int bl, ax, al, X, Y;
112 if (LowByte(PlayField16[si]) != fiTerminal)
113 return subAnimateTerminals;
115 /* use native frame handling (undo frame incrementation in main loop) */
116 if (game.use_native_sp_graphics_engine)
119 /* get last random animation delay */
120 bl = HighByte(PlayField16[si]);
121 if ((bl & 0x80) == 0x80)
125 if (bl <= 0) /* return if random animation delay not yet reached */
127 MovHighByte(&PlayField16[si], bl);
130 if (game.use_native_sp_graphics_engine)
131 return subAnimateTerminals;
133 return subAnimateTerminals;
137 /* calculate new random animation delay */
138 bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
139 MovHighByte(&PlayField16[si], bl); // save new sequence#
141 /* check terminal state (active or inactive) */
142 bl = TerminalState[si] + 1;
152 TerminalState[si] = bl;
154 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
157 graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
159 if (game.use_native_sp_graphics_engine)
160 GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
163 subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
167 StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
172 al = aniTerminal + bl;
175 subCopyFieldToScreen(si, al);
179 StretchedSprites.BltEx(X, Y, al);
183 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
185 return subAnimateTerminals;
186 } // subAnimateElectrons
188 // ==========================================================================
190 // Randomize random number generator
191 // ==========================================================================
199 Tick = MyGetTickCount();
200 Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
201 RandomSeed = 0x7FFF & Tmp;
202 if ((Tmp & 0x8000) != 0)
203 RandomSeed = RandomSeed | 0x8000;
209 for (i = 0; i < 10; i++)
210 printf("::: TEST random number: %d\n", subGetRandomNumber());
215 printf("::: BugsTerminals.c: ========== subRandomize()\n");
222 // ==========================================================================
224 // Generate new random number, first method (see also sub_g_8580)
225 // ==========================================================================
227 int subGetRandomNumber()
229 int subGetRandomNumber;
233 RSeed = (long)(0x7FFF & RandomSeed);
234 if (0x8000 == (RandomSeed & 0x8000))
235 RSeed = RSeed | 0x8000;
239 Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
241 Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
243 RandomSeed = 0x7FFF & Tmp;
244 if ((Tmp & 0x8000) != 0)
245 RandomSeed = RandomSeed | 0x8000;
247 subGetRandomNumber = Tmp / 2;
249 // Mov ax, randomseed
251 // mul bx ' dx:ax = reg * ax
253 // Mov randomseed, ax
257 printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
261 return subGetRandomNumber;
262 } // subGetRandomNumber