rnd-20100313-1-src
[rocksndiamonds.git] / src / game_sp / BugsTerminals.c
1 // ----------------------------------------------------------------------------
2 // BugsTerminals.c
3 // ----------------------------------------------------------------------------
4
5 #include "BugsTerminals.h"
6
7 // static char *VB_Name = "modBugTerminal";
8
9 // --- Option Explicit
10
11 long MyGetTickCount();
12
13 byte *TerminalState;
14 int TerminalMaxCycles;
15
16 #if 0
17 #define aniTerminal                     (0x80)
18 #endif
19
20 // ==========================================================================
21 //                              SUBROUTINE
22 // Animate bugs
23 // ==========================================================================
24
25 int subAnimateBugs(int si)
26 {
27   int subAnimateBugs;
28
29   // int ax, bx, cx, dx, di;
30   // int ah, bh, ch, dh, al, bl, cl, dl;
31   // int cx;
32 #if 0
33   int graphic, sync_frame;
34 #endif
35   int bl;
36
37   if (fiBug != LowByte(PlayField16[si]))
38     return subAnimateBugs;
39
40 #if 0
41   if (0 != (TimerVar & 3))
42     return subAnimateBugs;
43 #endif
44
45   bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
46
47 #if 1
48   if ((TimerVar & 3) == 0)
49   {
50     bl = bl + 1;
51     if (bl >= 0xE)
52     {
53       bl = subGetRandomNumber(); // generate new random number
54       bl = -((bl & 0x3F) + 0x20);
55     }
56
57     MovHighByte(&PlayField16[si], bl); // save sequence#
58   }
59 #else
60   bl = bl + 1;
61   if (bl >= 0xE)
62   {
63     bl = subGetRandomNumber(); // generate new random number
64     bl = -((bl & 0x3F) + 0x20);
65   }
66
67   MovHighByte(&PlayField16[si], bl); // save sequence#
68 #endif
69   if (bl < 0) // bug sleeps / is inactive
70     return subAnimateBugs;
71
72 #if 1
73   if ((TimerVar & 3) != 0)
74     goto markDisplay;
75 #endif
76
77   // now the bug is active! Beware Murphy!
78   if ((ByteMask & PlayField16[si - FieldWidth - 1]) == fiMurphy)
79     goto markPlaySound;
80
81   if ((ByteMask & PlayField16[si - FieldWidth]) == fiMurphy)
82     goto markPlaySound;
83
84   if ((ByteMask & PlayField16[si - FieldWidth + 1]) == fiMurphy)
85     goto markPlaySound;
86
87   if ((ByteMask & PlayField16[si - 1]) == fiMurphy)
88     goto markPlaySound;
89
90   if ((ByteMask & PlayField16[si + 1]) == fiMurphy)
91     goto markPlaySound;
92
93   if ((ByteMask & PlayField16[si + FieldWidth - 1]) == fiMurphy)
94     goto markPlaySound;
95
96   if ((ByteMask & PlayField16[si + FieldWidth]) == fiMurphy)
97     goto markPlaySound;
98
99   if ((ByteMask & PlayField16[si + FieldWidth + 1]) == fiMurphy)
100     goto markPlaySound;
101
102   goto markDisplay;
103
104 markPlaySound:
105 #if 1
106   subSoundFX(si, fiBug, actActive);     // play dangerous sound
107 #else
108   subSoundFXBug(); // play dangerous sound
109 #endif
110
111 markDisplay:
112   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
113 #if 1
114
115 #if 1
116
117 #if 0
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);
122 #endif
123
124   // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame);
125
126 #if 0
127   /* a general random frame treatment would be needed for _all_ animations */
128   /* (DONE) */
129   if (isRandomAnimation_SP(graphic) &&
130       !isNextAnimationFrame_SP(graphic, sync_frame))
131     return subAnimateBugs;
132 #endif
133
134 #if 1
135
136   GfxGraphic[GetX(si)][GetY(si)] = (bl == 0  ? aniBugActivating :
137                                     bl == 12 ? aniBugDeactivating :
138                                     bl == 13 ? aniBug : aniBugActive);
139
140 #else
141   subCopyAnimToScreen(si, graphic, sync_frame);
142 #endif
143
144 #else
145   subCopyFieldToScreen(si, aniFramesBug[bl]);
146 #endif
147
148 #else
149   cx = aniFramesBug[bl];
150   StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
151 #endif
152   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
153
154   return subAnimateBugs;
155 } // subAnimateBugs
156
157 // ==========================================================================
158 //                              SUBROUTINE
159 // Animate terminals
160 // ==========================================================================
161 int subAnimateTerminals(int si)
162 {
163   int subAnimateTerminals;
164
165   // int bl, ax, al, X, Y;
166 #if 1
167   short bl;
168 #else
169   int bl, al, X, Y;
170 #endif
171
172 #if 1
173   int lx = GetX(si);
174   int ly = GetY(si);
175   int graphic;
176 #endif
177
178   if (LowByte(PlayField16[si]) != fiTerminal)
179     return subAnimateTerminals;
180
181   /* use native frame handling (undo frame incrementation in main loop) */
182   if (game.use_native_sp_graphics_engine)
183     GfxFrame[lx][ly]--;
184
185   /* get last random animation delay */
186   bl = HighByte(PlayField16[si]);
187   if ((bl & 0x80) == 0x80)
188     bl = (bl | 0xFF00);
189
190   bl = bl + 1;
191   if (bl <= 0)          /* return if random animation delay not yet reached */
192   {
193     MovHighByte(&PlayField16[si], bl);
194
195 #if 1
196     if (game.use_native_sp_graphics_engine)
197       return subAnimateTerminals;
198 #else
199     return subAnimateTerminals;
200 #endif
201   }
202
203   /* calculate new random animation delay */
204   bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
205   MovHighByte(&PlayField16[si], bl); // save new sequence#
206
207   /* check terminal state (active or inactive) */
208   bl = TerminalState[si] + 1;
209   if (bl == 8)
210   {
211     bl = 0;
212   }
213   else if (15 < bl)
214   {
215     bl = 8;
216   }
217
218   TerminalState[si] = bl;
219
220   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
221 #if 1
222
223   graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
224
225   if (game.use_native_sp_graphics_engine)
226     GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
227
228 #if 1
229
230 #if 1
231
232   GfxGraphic[GetX(si)][GetY(si)] = (bl < 8 ? aniTerminal : aniTerminalActive);
233
234 #else
235   subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
236 #endif
237
238 #else
239   X = GetStretchX(si);
240   Y = GetStretchY(si);
241   StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
242 #endif
243
244 #else
245
246   al = aniTerminal + bl;
247
248 #if 1
249   subCopyFieldToScreen(si, al);
250 #else
251   X = GetStretchX(si);
252   Y = GetStretchY(si);
253   StretchedSprites.BltEx(X, Y, al);
254 #endif
255
256 #endif
257   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
258
259   return subAnimateTerminals;
260 } // subAnimateElectrons
261
262 // ==========================================================================
263 //                              SUBROUTINE
264 // Randomize random number generator
265 // ==========================================================================
266
267 int subRandomize()
268 {
269   int subRandomize;
270
271   long Tick, Tmp;
272
273   Tick = MyGetTickCount();
274   Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
275   RandomSeed = 0x7FFF & Tmp;
276   if ((Tmp & 0x8000) != 0)
277     RandomSeed = RandomSeed | 0x8000;
278
279 #if 0
280   {
281     int i;
282
283     for (i = 0; i < 10; i++)
284       printf("::: TEST random number: %d\n", subGetRandomNumber());
285   }
286 #endif
287
288 #if 0
289   printf("::: BugsTerminals.c: ========== subRandomize()\n");
290 #endif
291
292   return subRandomize;
293 } // subRandomize
294
295
296 // ==========================================================================
297 //                              SUBROUTINE
298 // Generate new random number, first method (see also sub_g_8580)
299 // ==========================================================================
300
301 int subGetRandomNumber()
302 {
303   int subGetRandomNumber;
304
305   long Tmp, RSeed;
306 #if 0
307   long Tst;
308 #endif
309
310   RSeed = (long)(0x7FFF & RandomSeed);
311   if (0x8000 == (RandomSeed & 0x8000))
312     RSeed = RSeed | 0x8000;
313
314 #if 0
315   /* !!! TEST !!! */
316   Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
317 #else
318   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
319 #endif
320
321 #if 0
322   Tst = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
323   printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld] [%ld, %ld]\n",
324          RandomSeed, RSeed, Tmp, Tst);
325   if (Tmp != Tst)
326     printf("::: !!!!!!!!!!\n");
327 #endif
328
329   RandomSeed = 0x7FFF & Tmp;
330   if ((Tmp & 0x8000) != 0)
331     RandomSeed = RandomSeed | 0x8000;
332
333   subGetRandomNumber = Tmp / 2;
334
335   //  Mov ax, randomseed
336   //  Mov bx, &H5E5
337   //  mul bx                          ' dx:ax = reg * ax
338   //  Add ax, &H31
339   //  Mov randomseed, ax
340   //  shr ax,1
341
342 #if 0
343   printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
344          subGetRandomNumber);
345 #endif
346
347 #if 0
348   printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld, %d]\n",
349          subGetRandomNumber, Tmp, RandomSeed);
350 #endif
351
352   return subGetRandomNumber;
353 } // subGetRandomNumber