rnd-20100214-2-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   int graphic, sync_frame;
33   int bl;
34
35   if (fiBug != LowByte(PlayField16[si]))
36     return subAnimateBugs;
37
38 #if 0
39   if (0 != (TimerVar & 3))
40     return subAnimateBugs;
41 #endif
42
43   bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
44
45 #if 1
46   if ((TimerVar & 3) == 0)
47   {
48     bl = bl + 1;
49     if (bl >= 0xE)
50     {
51       bl = subGetRandomNumber(); // generate new random number
52       bl = -((bl & 0x3F) + 0x20);
53     }
54
55     MovHighByte(&PlayField16[si], bl); // save sequence#
56   }
57 #else
58   bl = bl + 1;
59   if (bl >= 0xE)
60   {
61     bl = subGetRandomNumber(); // generate new random number
62     bl = -((bl & 0x3F) + 0x20);
63   }
64
65   MovHighByte(&PlayField16[si], bl); // save sequence#
66 #endif
67   if (bl < 0) // bug sleeps / is inactive
68     return subAnimateBugs;
69
70 #if 1
71   if ((TimerVar & 3) != 0)
72     goto markDisplay;
73 #endif
74
75   // now the bug is active! Beware Murphy!
76   if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
77     goto markPlaySound;
78
79   if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
80     goto markPlaySound;
81
82   if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
83     goto markPlaySound;
84
85   if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
86     goto markPlaySound;
87
88   if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
89     goto markPlaySound;
90
91   if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
92     goto markPlaySound;
93
94   if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
95     goto markPlaySound;
96
97   if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
98     goto markPlaySound;
99
100   goto markDisplay;
101
102 markPlaySound:
103   subSoundFXBug(); // play dangerous sound
104
105 markDisplay:
106   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
107 #if 1
108
109 #if 1
110
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);
115
116   // printf("::: %d [%d]\n", sync_frame, gfx.anim_random_frame);
117
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;
122
123   subCopyAnimToScreen(si, graphic, sync_frame);
124
125 #else
126   subCopyFieldToScreen(si, aniFramesBug[bl]);
127 #endif
128
129 #else
130   cx = aniFramesBug[bl];
131   StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
132 #endif
133   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
134
135   return subAnimateBugs;
136 } // subAnimateBugs
137
138 // ==========================================================================
139 //                              SUBROUTINE
140 // Animate terminals
141 // ==========================================================================
142 int subAnimateTerminals(int si)
143 {
144   int subAnimateTerminals;
145
146   // int bl, ax, al, X, Y;
147 #if 1
148   short bl;
149 #else
150   int bl, al, X, Y;
151 #endif
152
153 #if 1
154   int lx = GetX(si);
155   int ly = GetY(si);
156   int graphic;
157 #endif
158
159   if (LowByte(PlayField16[si]) != fiTerminal)
160     return subAnimateTerminals;
161
162   /* use native frame handling (undo frame incrementation in main loop) */
163   if (game.use_native_sp_graphics_engine)
164     GfxFrame[lx][ly]--;
165
166   /* get last random animation delay */
167   bl = HighByte(PlayField16[si]);
168   if ((bl & 0x80) == 0x80)
169     bl = (bl | 0xFF00);
170
171   bl = bl + 1;
172   if (bl <= 0)          /* return if random animation delay not yet reached */
173   {
174     MovHighByte(&PlayField16[si], bl);
175
176 #if 1
177     if (game.use_native_sp_graphics_engine)
178       return subAnimateTerminals;
179 #else
180     return subAnimateTerminals;
181 #endif
182   }
183
184   /* calculate new random animation delay */
185   bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
186   MovHighByte(&PlayField16[si], bl); // save new sequence#
187
188   /* check terminal state (active or inactive) */
189   bl = TerminalState[si] + 1;
190   if (bl == 8)
191   {
192     bl = 0;
193   }
194   else if (15 < bl)
195   {
196     bl = 8;
197   }
198
199   TerminalState[si] = bl;
200
201   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
202 #if 1
203
204   graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
205
206   if (game.use_native_sp_graphics_engine)
207     GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
208
209 #if 1
210   subCopyAnimToScreen(si, graphic, GfxFrame[lx][ly]);
211 #else
212   X = GetStretchX(si);
213   Y = GetStretchY(si);
214   StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
215 #endif
216
217 #else
218
219   al = aniTerminal + bl;
220
221 #if 1
222   subCopyFieldToScreen(si, al);
223 #else
224   X = GetStretchX(si);
225   Y = GetStretchY(si);
226   StretchedSprites.BltEx(X, Y, al);
227 #endif
228
229 #endif
230   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
231
232   return subAnimateTerminals;
233 } // subAnimateElectrons
234
235 // ==========================================================================
236 //                              SUBROUTINE
237 // Randomize random number generator
238 // ==========================================================================
239
240 int subRandomize()
241 {
242   int subRandomize;
243
244   long Tick, Tmp;
245
246   Tick = MyGetTickCount();
247   Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
248   RandomSeed = 0x7FFF & Tmp;
249   if ((Tmp & 0x8000) != 0)
250     RandomSeed = RandomSeed | 0x8000;
251
252 #if 0
253   {
254     int i;
255
256     for (i = 0; i < 10; i++)
257       printf("::: TEST random number: %d\n", subGetRandomNumber());
258   }
259 #endif
260
261 #if 0
262   printf("::: BugsTerminals.c: ========== subRandomize()\n");
263 #endif
264
265   return subRandomize;
266 } // subRandomize
267
268
269 // ==========================================================================
270 //                              SUBROUTINE
271 // Generate new random number, first method (see also sub_g_8580)
272 // ==========================================================================
273
274 int subGetRandomNumber()
275 {
276   int subGetRandomNumber;
277
278   long Tmp, RSeed;
279
280   RSeed = (long)(0x7FFF & RandomSeed);
281   if (0x8000 == (RandomSeed & 0x8000))
282     RSeed = RSeed | 0x8000;
283
284 #if 0
285   /* !!! TEST !!! */
286   Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
287 #else
288   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
289 #endif
290   RandomSeed = 0x7FFF & Tmp;
291   if ((Tmp & 0x8000) != 0)
292     RandomSeed = RandomSeed | 0x8000;
293
294   subGetRandomNumber = Tmp / 2;
295
296   //  Mov ax, randomseed
297   //  Mov bx, &H5E5
298   //  mul bx                          ' dx:ax = reg * ax
299   //  Add ax, &H31
300   //  Mov randomseed, ax
301   //  shr ax,1
302
303 #if 0
304   printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
305          subGetRandomNumber);
306 #endif
307
308   return subGetRandomNumber;
309 } // subGetRandomNumber