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