rnd-20100207-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 #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   bl = HighByte(PlayField16[si]);
117   if ((bl & 0x80) == 0x80)
118     bl = (bl | 0xFF00);
119
120   bl = bl + 1;
121   if (bl <= 0)
122   {
123     MovHighByte(&PlayField16[si], bl);
124
125 #if 1
126     if (game.use_native_sp_graphics_engine)
127       return subAnimateTerminals;
128 #else
129     return subAnimateTerminals;
130 #endif
131   }
132
133   bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
134   MovHighByte(&PlayField16[si], bl); // save new sequence#
135   bl = TerminalState[si] + 1;
136   if (bl == 8)
137   {
138     bl = 0;
139   }
140   else if (15 < bl)
141   {
142     bl = 8;
143   }
144
145 #if 1
146   graphic = (bl < 8 ? IMG_SP_TERMINAL : IMG_SP_TERMINAL_ACTIVE);
147
148   if (game.use_native_sp_graphics_engine)
149     GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
150 #endif
151
152   TerminalState[si] = bl;
153   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
154   al = aniTerminal + bl;
155   X = GetStretchX(si);
156   Y = GetStretchY(si);
157 #if 1
158   StretchedSprites.BltImg(X, Y, graphic, GfxFrame[lx][ly]);
159 #else
160   StretchedSprites.BltEx(X, Y, al);
161 #endif
162   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
163
164   return subAnimateTerminals;
165 } // subAnimateElectrons
166
167 // ==========================================================================
168 //                              SUBROUTINE
169 // Randomize random number generator
170 // ==========================================================================
171
172 int subRandomize()
173 {
174   int subRandomize;
175
176   long Tick, Tmp;
177
178   Tick = MyGetTickCount();
179   Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
180   RandomSeed = 0x7FFF & Tmp;
181   if ((Tmp & 0x8000) != 0)
182     RandomSeed = RandomSeed | 0x8000;
183
184 #if 0
185   {
186     int i;
187
188     for (i = 0; i < 10; i++)
189       printf("::: TEST random number: %d\n", subGetRandomNumber());
190   }
191 #endif
192
193 #if 0
194   printf("::: BugsTerminals.c: ========== subRandomize()\n");
195 #endif
196
197   return subRandomize;
198 } // subRandomize
199
200
201 // ==========================================================================
202 //                              SUBROUTINE
203 // Generate new random number, first method (see also sub_g_8580)
204 // ==========================================================================
205
206 int subGetRandomNumber()
207 {
208   int subGetRandomNumber;
209
210   long Tmp, RSeed;
211
212   RSeed = (long)(0x7FFF & RandomSeed);
213   if (0x8000 == (RandomSeed & 0x8000))
214     RSeed = RSeed | 0x8000;
215
216 #if 0
217   /* !!! TEST !!! */
218   Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
219 #else
220   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
221 #endif
222   RandomSeed = 0x7FFF & Tmp;
223   if ((Tmp & 0x8000) != 0)
224     RandomSeed = RandomSeed | 0x8000;
225
226   subGetRandomNumber = Tmp / 2;
227
228   //  Mov ax, randomseed
229   //  Mov bx, &H5E5
230   //  mul bx                          ' dx:ax = reg * ax
231   //  Add ax, &H31
232   //  Mov randomseed, ax
233   //  shr ax,1
234
235 #if 0
236   printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
237          subGetRandomNumber);
238 #endif
239
240   return subGetRandomNumber;
241 } // subGetRandomNumber