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