1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
5 #include "BugsTerminals.h"
7 // static char *VB_Name = "modBugTerminal";
11 long MyGetTickCount();
14 int TerminalMaxCycles;
15 #define aniTerminal (0x80)
17 // ==========================================================================
20 // ==========================================================================
22 int subAnimateBugs(int si)
26 // int ax, bx, cx, dx, di;
27 // int ah, bh, ch, dh, al, bl, cl, dl;
31 if (fiBug != LowByte(PlayField16[si]))
32 return subAnimateBugs;
34 if (0 != (TimerVar & 3))
35 return subAnimateBugs;
37 bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
41 bl = subGetRandomNumber(); // generate new random number
42 bl = -((bl & 0x3F) + 0x20);
45 MovHighByte(&PlayField16[si], bl); // save sequence#
46 if (bl < 0) // bug sleeps / is inactive
47 return subAnimateBugs;
49 // now the bug is active! Beware Murphy!
50 if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
53 if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
56 if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
59 if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
62 if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
65 if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
68 if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
71 if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
77 subSoundFXBug(); // play dangerous sound
80 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82 StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
83 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
85 return subAnimateBugs;
88 // ==========================================================================
91 // ==========================================================================
92 int subAnimateTerminals(int si)
94 int subAnimateTerminals;
96 // int bl, ax, al, X, Y;
109 if (LowByte(PlayField16[si]) != fiTerminal)
110 return subAnimateTerminals;
112 /* use native frame handling (undo frame incrementation in main loop) */
113 if (game.use_native_sp_graphics_engine)
116 bl = HighByte(PlayField16[si]);
117 if ((bl & 0x80) == 0x80)
123 MovHighByte(&PlayField16[si], bl);
126 if (game.use_native_sp_graphics_engine)
127 return subAnimateTerminals;
129 return subAnimateTerminals;
133 bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
134 MovHighByte(&PlayField16[si], bl); // save new sequence#
135 bl = TerminalState[si] + 1;
146 graphic = (bl < 8 ? IMG_SP_TERMINAL : IMG_SP_TERMINAL_ACTIVE);
148 if (game.use_native_sp_graphics_engine)
149 GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
152 TerminalState[si] = bl;
153 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
154 al = aniTerminal + bl;
158 StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
160 StretchedSprites.BltEx(X, Y, al);
162 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
164 return subAnimateTerminals;
165 } // subAnimateElectrons
167 // ==========================================================================
169 // Randomize random number generator
170 // ==========================================================================
178 Tick = MyGetTickCount();
179 Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
180 RandomSeed = 0x7FFF & Tmp;
181 if ((Tmp & 0x8000) != 0)
182 RandomSeed = RandomSeed | 0x8000;
188 for (i = 0; i < 10; i++)
189 printf("::: TEST random number: %d\n", subGetRandomNumber());
194 printf("::: BugsTerminals.c: ========== subRandomize()\n");
201 // ==========================================================================
203 // Generate new random number, first method (see also sub_g_8580)
204 // ==========================================================================
206 int subGetRandomNumber()
208 int subGetRandomNumber;
212 RSeed = (long)(0x7FFF & RandomSeed);
213 if (0x8000 == (RandomSeed & 0x8000))
214 RSeed = RSeed | 0x8000;
218 Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
220 Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
222 RandomSeed = 0x7FFF & Tmp;
223 if ((Tmp & 0x8000) != 0)
224 RandomSeed = RandomSeed | 0x8000;
226 subGetRandomNumber = Tmp / 2;
228 // Mov ax, randomseed
230 // mul bx ' dx:ax = reg * ax
232 // Mov randomseed, ax
236 printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
240 return subGetRandomNumber;
241 } // subGetRandomNumber