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;
33 int graphic, sync_frame;
37 if (fiBug != LowByte(PlayField16[si]))
38 return subAnimateBugs;
41 if (0 != (TimerVar & 3))
42 return subAnimateBugs;
45 bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
48 if ((TimerVar & 3) == 0)
53 bl = subGetRandomNumber(); // generate new random number
54 bl = -((bl & 0x3F) + 0x20);
57 MovHighByte(&PlayField16[si], bl); // save sequence#
63 bl = subGetRandomNumber(); // generate new random number
64 bl = -((bl & 0x3F) + 0x20);
67 MovHighByte(&PlayField16[si], bl); // save sequence#
69 if (bl < 0) // bug sleeps / is inactive
70 return subAnimateBugs;
73 if ((TimerVar & 3) != 0)
77 // now the bug is active! Beware Murphy!
78 if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
81 if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
84 if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
87 if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
90 if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
93 if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
96 if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
99 if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
105 subSoundFXBug(); // play dangerous sound
108 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
114 graphic = (bl == 0 ? aniBugActivating :
115 bl == 12 ? aniBugDeactivating :
116 bl == 13 ? aniBug : aniBugActive);
117 sync_frame = (bl >= 1 && bl <= 11 ? (bl - 1) * 4 : 0) + (TimerVar & 3);
120 // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame);
123 /* a general random frame treatment would be needed for _all_ animations */
125 if (isRandomAnimation_SP(graphic) &&
126 !isNextAnimationFrame_SP(graphic, sync_frame))
127 return subAnimateBugs;
132 GfxGraphic[GetX(si)][GetY(si)] = (bl == 0 ? aniBugActivating :
133 bl == 12 ? aniBugDeactivating :
134 bl == 13 ? aniBug : aniBugActive);
137 subCopyAnimToScreen(si, graphic, sync_frame);
141 subCopyFieldToScreen(si, aniFramesBug[bl]);
145 cx = aniFramesBug[bl];
146 StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
148 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
150 return subAnimateBugs;
153 // ==========================================================================
156 // ==========================================================================
157 int subAnimateTerminals(int si)
159 int subAnimateTerminals;
161 // int bl, ax, al, X, Y;
174 if (LowByte(PlayField16[si]) != fiTerminal)
175 return subAnimateTerminals;
177 /* use native frame handling (undo frame incrementation in main loop) */
178 if (game.use_native_sp_graphics_engine)
181 /* get last random animation delay */
182 bl = HighByte(PlayField16[si]);
183 if ((bl & 0x80) == 0x80)
187 if (bl <= 0) /* return if random animation delay not yet reached */
189 MovHighByte(&PlayField16[si], bl);
192 if (game.use_native_sp_graphics_engine)
193 return subAnimateTerminals;
195 return subAnimateTerminals;
199 /* calculate new random animation delay */
200 bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
201 MovHighByte(&PlayField16[si], bl); // save new sequence#
203 /* check terminal state (active or inactive) */
204 bl = TerminalState[si] + 1;
214 TerminalState[si] = bl;
216 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
219 graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
221 if (game.use_native_sp_graphics_engine)
222 GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
228 GfxGraphic[GetX(si)][GetY(si)] = (bl < 8 ? aniTerminal : aniTerminalActive);
231 subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
237 StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
242 al = aniTerminal + bl;
245 subCopyFieldToScreen(si, al);
249 StretchedSprites.BltEx(X, Y, al);
253 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
255 return subAnimateTerminals;
256 } // subAnimateElectrons
258 // ==========================================================================
260 // Randomize random number generator
261 // ==========================================================================
269 Tick = MyGetTickCount();
270 Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
271 RandomSeed = 0x7FFF & Tmp;
272 if ((Tmp & 0x8000) != 0)
273 RandomSeed = RandomSeed | 0x8000;
279 for (i = 0; i < 10; i++)
280 printf("::: TEST random number: %d\n", subGetRandomNumber());
285 printf("::: BugsTerminals.c: ========== subRandomize()\n");
292 // ==========================================================================
294 // Generate new random number, first method (see also sub_g_8580)
295 // ==========================================================================
297 int subGetRandomNumber()
299 int subGetRandomNumber;
306 RSeed = (long)(0x7FFF & RandomSeed);
307 if (0x8000 == (RandomSeed & 0x8000))
308 RSeed = RSeed | 0x8000;
312 Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
314 Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
318 Tst = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
319 printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld] [%ld, %ld]\n",
320 RandomSeed, RSeed, Tmp, Tst);
322 printf("::: !!!!!!!!!!\n");
325 RandomSeed = 0x7FFF & Tmp;
326 if ((Tmp & 0x8000) != 0)
327 RandomSeed = RandomSeed | 0x8000;
329 subGetRandomNumber = Tmp / 2;
331 // Mov ax, randomseed
333 // mul bx ' dx:ax = reg * ax
335 // Mov randomseed, ax
339 printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
344 printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld, %d]\n",
345 subGetRandomNumber, Tmp, RandomSeed);
348 return subGetRandomNumber;
349 } // subGetRandomNumber