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