rnd-20090925-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 GetTickCount();
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   StretchedSprites.BltEx(X, Y, al);
135   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
136
137   return subAnimateTerminals;
138 } // subAnimateElectrons
139
140 // ==========================================================================
141 //                              SUBROUTINE
142 // Randomize random number generator
143 // ==========================================================================
144
145 int subRandomize()
146 {
147   int subRandomize;
148
149   long Tick, Tmp;
150
151   Tick = GetTickCount();
152   Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
153   RandomSeed = 0x7FFF & Tmp;
154   if ((Tmp & 0x8000) != 0)
155     RandomSeed = RandomSeed | 0x8000;
156
157 #if 0
158   {
159     int i;
160
161     for (i = 0; i < 10; i++)
162       printf("::: TEST random number: %d\n", subGetRandomNumber());
163   }
164 #endif
165
166 #if 1
167   printf("::: BugsTerminals.c: ========== subRandomize()\n");
168 #endif
169
170   return subRandomize;
171 } // subRandomize
172
173
174 // ==========================================================================
175 //                              SUBROUTINE
176 // Generate new random number, first method (see also sub_g_8580)
177 // ==========================================================================
178
179 int subGetRandomNumber()
180 {
181   int subGetRandomNumber;
182
183   long Tmp, RSeed;
184
185   RSeed = (long)(0x7FFF & RandomSeed);
186   if (0x8000 == (RandomSeed & 0x8000))
187     RSeed = RSeed | 0x8000;
188
189 #if 0
190   /* !!! TEST !!! */
191   Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
192 #else
193   Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
194 #endif
195   RandomSeed = 0x7FFF & Tmp;
196   if ((Tmp & 0x8000) != 0)
197     RandomSeed = RandomSeed | 0x8000;
198
199   subGetRandomNumber = Tmp / 2;
200
201   //  Mov ax, randomseed
202   //  Mov bx, &H5E5
203   //  mul bx                          ' dx:ax = reg * ax
204   //  Add ax, &H31
205   //  Mov randomseed, ax
206   //  shr ax,1
207
208 #if 0
209   printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
210          subGetRandomNumber);
211 #endif
212
213   return subGetRandomNumber;
214 } // subGetRandomNumber