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;
32 int graphic, sync_frame;
35 if (fiBug != LowByte(PlayField16[si]))
36 return subAnimateBugs;
39 if (0 != (TimerVar & 3))
40 return subAnimateBugs;
43 bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
46 if ((TimerVar & 3) == 0)
51 bl = subGetRandomNumber(); // generate new random number
52 bl = -((bl & 0x3F) + 0x20);
55 MovHighByte(&PlayField16[si], bl); // save sequence#
61 bl = subGetRandomNumber(); // generate new random number
62 bl = -((bl & 0x3F) + 0x20);
65 MovHighByte(&PlayField16[si], bl); // save sequence#
67 if (bl < 0) // bug sleeps / is inactive
68 return subAnimateBugs;
71 if ((TimerVar & 3) != 0)
75 // now the bug is active! Beware Murphy!
76 if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
79 if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
82 if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
85 if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
88 if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
91 if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
94 if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
97 if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
103 subSoundFXBug(); // play dangerous sound
106 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
111 graphic = (bl == 0 ? aniBugActivating :
112 bl == 12 ? aniBugDeactivating :
113 bl == 13 ? aniBug : aniBugActive);
114 sync_frame = (bl >= 1 && bl <= 11 ? (bl - 1) * 4 : 0) + (TimerVar & 3);
116 // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame);
118 /* a general random frame treatment would be needed for _all_ animations */
119 if (isRandomAnimation_SP(graphic) &&
120 !isNextAnimationFrame_SP(graphic, sync_frame))
121 return subAnimateBugs;
123 subCopyAnimToScreen(si, graphic, sync_frame);
126 subCopyFieldToScreen(si, aniFramesBug[bl]);
130 cx = aniFramesBug[bl];
131 StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
133 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
135 return subAnimateBugs;
138 // ==========================================================================
141 // ==========================================================================
142 int subAnimateTerminals(int si)
144 int subAnimateTerminals;
146 // int bl, ax, al, X, Y;
159 if (LowByte(PlayField16[si]) != fiTerminal)
160 return subAnimateTerminals;
162 /* use native frame handling (undo frame incrementation in main loop) */
163 if (game.use_native_sp_graphics_engine)
166 /* get last random animation delay */
167 bl = HighByte(PlayField16[si]);
168 if ((bl & 0x80) == 0x80)
172 if (bl <= 0) /* return if random animation delay not yet reached */
174 MovHighByte(&PlayField16[si], bl);
177 if (game.use_native_sp_graphics_engine)
178 return subAnimateTerminals;
180 return subAnimateTerminals;
184 /* calculate new random animation delay */
185 bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
186 MovHighByte(&PlayField16[si], bl); // save new sequence#
188 /* check terminal state (active or inactive) */
189 bl = TerminalState[si] + 1;
199 TerminalState[si] = bl;
201 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
204 graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
206 if (game.use_native_sp_graphics_engine)
207 GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
210 subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
214 StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
219 al = aniTerminal + bl;
222 subCopyFieldToScreen(si, al);
226 StretchedSprites.BltEx(X, Y, al);
230 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
232 return subAnimateTerminals;
233 } // subAnimateElectrons
235 // ==========================================================================
237 // Randomize random number generator
238 // ==========================================================================
246 Tick = MyGetTickCount();
247 Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
248 RandomSeed = 0x7FFF & Tmp;
249 if ((Tmp & 0x8000) != 0)
250 RandomSeed = RandomSeed | 0x8000;
256 for (i = 0; i < 10; i++)
257 printf("::: TEST random number: %d\n", subGetRandomNumber());
262 printf("::: BugsTerminals.c: ========== subRandomize()\n");
269 // ==========================================================================
271 // Generate new random number, first method (see also sub_g_8580)
272 // ==========================================================================
274 int subGetRandomNumber()
276 int subGetRandomNumber;
280 RSeed = (long)(0x7FFF & RandomSeed);
281 if (0x8000 == (RandomSeed & 0x8000))
282 RSeed = RSeed | 0x8000;
286 Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
288 Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
290 RandomSeed = 0x7FFF & Tmp;
291 if ((Tmp & 0x8000) != 0)
292 RandomSeed = RandomSeed | 0x8000;
294 subGetRandomNumber = Tmp / 2;
296 // Mov ax, randomseed
298 // mul bx ' dx:ax = reg * ax
300 // Mov randomseed, ax
304 printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
308 return subGetRandomNumber;
309 } // subGetRandomNumber