rnd-20100216-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   subSoundFXBug(); // play dangerous sound
106
107 markDisplay:
108   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
109 #if 1
110
111 #if 1
112
113 #if 0
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);
118 #endif
119
120   // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame);
121
122 #if 0
123   /* a general random frame treatment would be needed for _all_ animations */
124   /* (DONE) */
125   if (isRandomAnimation_SP(graphic) &&
126       !isNextAnimationFrame_SP(graphic, sync_frame))
127     return subAnimateBugs;
128 #endif
129
130 #if 1
131
132   GfxGraphic[GetX(si)][GetY(si)] = (bl == 0  ? aniBugActivating :
133                                     bl == 12 ? aniBugDeactivating :
134                                     bl == 13 ? aniBug : aniBugActive);
135
136 #else
137   subCopyAnimToScreen(si, graphic, sync_frame);
138 #endif
139
140 #else
141   subCopyFieldToScreen(si, aniFramesBug[bl]);
142 #endif
143
144 #else
145   cx = aniFramesBug[bl];
146   StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
147 #endif
148   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
149
150   return subAnimateBugs;
151 } // subAnimateBugs
152
153 // ==========================================================================
154 //                              SUBROUTINE
155 // Animate terminals
156 // ==========================================================================
157 int subAnimateTerminals(int si)
158 {
159   int subAnimateTerminals;
160
161   // int bl, ax, al, X, Y;
162 #if 1
163   short bl;
164 #else
165   int bl, al, X, Y;
166 #endif
167
168 #if 1
169   int lx = GetX(si);
170   int ly = GetY(si);
171   int graphic;
172 #endif
173
174   if (LowByte(PlayField16[si]) != fiTerminal)
175     return subAnimateTerminals;
176
177   /* use native frame handling (undo frame incrementation in main loop) */
178   if (game.use_native_sp_graphics_engine)
179     GfxFrame[lx][ly]--;
180
181   /* get last random animation delay */
182   bl = HighByte(PlayField16[si]);
183   if ((bl & 0x80) == 0x80)
184     bl = (bl | 0xFF00);
185
186   bl = bl + 1;
187   if (bl <= 0)          /* return if random animation delay not yet reached */
188   {
189     MovHighByte(&PlayField16[si], bl);
190
191 #if 1
192     if (game.use_native_sp_graphics_engine)
193       return subAnimateTerminals;
194 #else
195     return subAnimateTerminals;
196 #endif
197   }
198
199   /* calculate new random animation delay */
200   bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
201   MovHighByte(&PlayField16[si], bl); // save new sequence#
202
203   /* check terminal state (active or inactive) */
204   bl = TerminalState[si] + 1;
205   if (bl == 8)
206   {
207     bl = 0;
208   }
209   else if (15 < bl)
210   {
211     bl = 8;
212   }
213
214   TerminalState[si] = bl;
215
216   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
217 #if 1
218
219   graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
220
221   if (game.use_native_sp_graphics_engine)
222     GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
223
224 #if 1
225
226 #if 1
227
228   GfxGraphic[GetX(si)][GetY(si)] = (bl < 8 ? aniTerminal : aniTerminalActive);
229
230 #else
231   subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
232 #endif
233
234 #else
235   X = GetStretchX(si);
236   Y = GetStretchY(si);
237   StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
238 #endif
239
240 #else
241
242   al = aniTerminal + bl;
243
244 #if 1
245   subCopyFieldToScreen(si, al);
246 #else
247   X = GetStretchX(si);
248   Y = GetStretchY(si);
249   StretchedSprites.BltEx(X, Y, al);
250 #endif
251
252 #endif
253   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
254
255   return subAnimateTerminals;
256 } // subAnimateElectrons
257
258 // ==========================================================================
259 //                              SUBROUTINE
260 // Randomize random number generator
261 // ==========================================================================
262
263 int subRandomize()
264 {
265   int subRandomize;
266
267   long Tick, Tmp;
268
269   Tick = MyGetTickCount();
270   Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
271   RandomSeed = 0x7FFF & Tmp;
272   if ((Tmp & 0x8000) != 0)
273     RandomSeed = RandomSeed | 0x8000;
274
275 #if 0
276   {
277     int i;
278
279     for (i = 0; i < 10; i++)
280       printf("::: TEST random number: %d\n", subGetRandomNumber());
281   }
282 #endif
283
284 #if 0
285   printf("::: BugsTerminals.c: ========== subRandomize()\n");
286 #endif
287
288   return subRandomize;
289 } // subRandomize
290
291
292 // ==========================================================================
293 //                              SUBROUTINE
294 // Generate new random number, first method (see also sub_g_8580)
295 // ==========================================================================
296
297 int subGetRandomNumber()
298 {
299   int subGetRandomNumber;
300
301   long Tmp, RSeed;
302 #if 0
303   long Tst;
304 #endif
305
306   RSeed = (long)(0x7FFF & RandomSeed);
307   if (0x8000 == (RandomSeed & 0x8000))
308     RSeed = RSeed | 0x8000;
309
310 #if 0
311   /* !!! TEST !!! */
312   Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
313 #else
314   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
315 #endif
316
317 #if 0
318   Tst = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
319   printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld] [%ld, %ld]\n",
320          RandomSeed, RSeed, Tmp, Tst);
321   if (Tmp != Tst)
322     printf("::: !!!!!!!!!!\n");
323 #endif
324
325   RandomSeed = 0x7FFF & Tmp;
326   if ((Tmp & 0x8000) != 0)
327     RandomSeed = RandomSeed | 0x8000;
328
329   subGetRandomNumber = Tmp / 2;
330
331   //  Mov ax, randomseed
332   //  Mov bx, &H5E5
333   //  mul bx                          ' dx:ax = reg * ax
334   //  Add ax, &H31
335   //  Mov randomseed, ax
336   //  shr ax,1
337
338 #if 0
339   printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
340          subGetRandomNumber);
341 #endif
342
343 #if 0
344   printf("::: BugsTerminals.c: subGetRandomNumber(): %d [%ld, %d]\n",
345          subGetRandomNumber, Tmp, RandomSeed);
346 #endif
347
348   return subGetRandomNumber;
349 } // subGetRandomNumber