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)
106 subSoundFX(si, fiBug, actActive); // play dangerous sound
108 subSoundFXBug(); // play dangerous sound
112 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
118 graphic = (bl == 0 ? aniBugActivating :
119 bl == 12 ? aniBugDeactivating :
120 bl == 13 ? aniBug : aniBugActive);
121 sync_frame = (bl >= 1 && bl <= 11 ? (bl - 1) * 4 : 0) + (TimerVar & 3);
124 // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame);
127 /* a general random frame treatment would be needed for _all_ animations */
129 if (isRandomAnimation_SP(graphic) &&
130 !isNextAnimationFrame_SP(graphic, sync_frame))
131 return subAnimateBugs;
136 GfxGraphic[GetX(si)][GetY(si)] = (bl == 0 ? aniBugActivating :
137 bl == 12 ? aniBugDeactivating :
138 bl == 13 ? aniBug : aniBugActive);
141 subCopyAnimToScreen(si, graphic, sync_frame);
145 subCopyFieldToScreen(si, aniFramesBug[bl]);
149 cx = aniFramesBug[bl];
150 StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
152 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
154 return subAnimateBugs;
157 // ==========================================================================
160 // ==========================================================================
161 int subAnimateTerminals(int si)
163 int subAnimateTerminals;
165 // int bl, ax, al, X, Y;
178 if (LowByte(PlayField16[si]) != fiTerminal)
179 return subAnimateTerminals;
181 /* use native frame handling (undo frame incrementation in main loop) */
182 if (game.use_native_sp_graphics_engine)
185 /* get last random animation delay */
186 bl = HighByte(PlayField16[si]);
187 if ((bl & 0x80) == 0x80)
191 if (bl <= 0) /* return if random animation delay not yet reached */
193 MovHighByte(&PlayField16[si], bl);
196 if (game.use_native_sp_graphics_engine)
197 return subAnimateTerminals;
199 return subAnimateTerminals;
203 /* calculate new random animation delay */
204 bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
205 MovHighByte(&PlayField16[si], bl); // save new sequence#
207 /* check terminal state (active or inactive) */
208 bl = TerminalState[si] + 1;
218 TerminalState[si] = bl;
220 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
223 graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
225 if (game.use_native_sp_graphics_engine)
226 GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
232 GfxGraphic[GetX(si)][GetY(si)] = (bl < 8 ? aniTerminal : aniTerminalActive);
235 subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
241 StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
246 al = aniTerminal + bl;
249 subCopyFieldToScreen(si, al);
253 StretchedSprites.BltEx(X, Y, al);
257 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
259 return subAnimateTerminals;
260 } // subAnimateElectrons
262 // ==========================================================================
264 // Randomize random number generator
265 // ==========================================================================
273 Tick = MyGetTickCount();
274 Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
275 RandomSeed = 0x7FFF & Tmp;
276 if ((Tmp & 0x8000) != 0)
277 RandomSeed = RandomSeed | 0x8000;
283 for (i = 0; i < 10; i++)
284 printf("::: TEST random number: %d\n", subGetRandomNumber());
289 printf("::: BugsTerminals.c: ========== subRandomize()\n");
296 // ==========================================================================
298 // Generate new random number, first method (see also sub_g_8580)
299 // ==========================================================================
301 int subGetRandomNumber()
303 int subGetRandomNumber;
310 RSeed = (long)(0x7FFF & RandomSeed);
311 if (0x8000 == (RandomSeed & 0x8000))
312 RSeed = RSeed | 0x8000;
316 Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
318 Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
322 Tst = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
323 printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld] [%ld, %ld]\n",
324 RandomSeed, RSeed, Tmp, Tst);
326 printf("::: !!!!!!!!!!\n");
329 RandomSeed = 0x7FFF & Tmp;
330 if ((Tmp & 0x8000) != 0)
331 RandomSeed = RandomSeed | 0x8000;
333 subGetRandomNumber = Tmp / 2;
335 // Mov ax, randomseed
337 // mul bx ' dx:ax = reg * ax
339 // Mov randomseed, ax
343 printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
348 printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld, %d]\n",
349 subGetRandomNumber, Tmp, RandomSeed);
352 return subGetRandomNumber;
353 } // subGetRandomNumber