major cleanup of preprocessor hell
[rocksndiamonds.git] / src / game_sp / BugsTerminals.c
index 952ccb624fbac8fddc594b2737440004c09ab6c0..afa7345e8bf40d7a843b5df8cdbf18667cecdd3f 100644 (file)
 
 #include "BugsTerminals.h"
 
-// static char *VB_Name = "modBugTerminal";
 
-// --- Option Explicit
+byte TerminalState[SP_MAX_PLAYFIELD_SIZE + SP_HEADER_SIZE];
 
-long GetTickCount();
-
-byte *TerminalState;
 int TerminalMaxCycles;
-#define aniTerminal                    (0x80)
+
 
 // ==========================================================================
 //                              SUBROUTINE
 // Animate bugs
 // ==========================================================================
 
-int subAnimateBugs(int si)
+void subAnimateBugs(int si)
 {
-  int subAnimateBugs;
-
-  // int ax, bx, cx, dx, di;
-  // int ah, bh, ch, dh, al, bl, cl, dl;
-  int cx;
   int bl;
 
   if (fiBug != LowByte(PlayField16[si]))
-    return subAnimateBugs;
+    return;
 
-  if (0 != (TimerVar & 3))
-    return subAnimateBugs;
+  bl = SgnHighByte(PlayField16[si]);   // get and increment sequence number
 
-  bl = SgnHighByte(PlayField16[si]); // get and increment sequence#
-  bl = bl + 1;
-  if (bl >= 0xE)
+  if ((TimerVar & 3) == 0)
   {
-    bl = subGetRandomNumber(); // generate new random number
-    bl = -((bl & 0x3F) + 0x20);
+    bl = bl + 1;
+    if (bl >= 14)                      // bugs animation has 14 frames
+    {
+      bl = subGetRandomNumber();       // generate new random number
+      bl = -((bl & 0x3F) + 0x20);
+    }
+
+    MovHighByte(&PlayField16[si], bl); // save sequence number
   }
 
-  MovHighByte(&PlayField16[si], bl); // save sequence#
-  if (bl < 0) // bug sleeps / is inactive
-    return subAnimateBugs;
+  if (bl < 0)                          // bug sleeps / is inactive
+    return;
 
   // now the bug is active! Beware Murphy!
-  if ((ByteMask && PlayField16[si - FieldWidth - 1]) == fiMurphy)
-    goto markPlaySound;
-
-  if ((ByteMask && PlayField16[si - FieldWidth]) == fiMurphy)
-    goto markPlaySound;
-
-  if ((ByteMask && PlayField16[si - FieldWidth + 1]) == fiMurphy)
-    goto markPlaySound;
-
-  if ((ByteMask && PlayField16[si - 1]) == fiMurphy)
-    goto markPlaySound;
-
-  if ((ByteMask && PlayField16[si + 1]) == fiMurphy)
-    goto markPlaySound;
-
-  if ((ByteMask && PlayField16[si + FieldWidth - 1]) == fiMurphy)
-    goto markPlaySound;
-
-  if ((ByteMask && PlayField16[si + FieldWidth]) == fiMurphy)
-    goto markPlaySound;
+  if ((TimerVar & 3) == 0 &&
+      (LowByte(PlayField16[si - FieldWidth - 1]) == fiMurphy ||
+       LowByte(PlayField16[si - FieldWidth])     == fiMurphy ||
+       LowByte(PlayField16[si - FieldWidth + 1]) == fiMurphy ||
+       LowByte(PlayField16[si - 1])              == fiMurphy ||
+       LowByte(PlayField16[si + 1])              == fiMurphy ||
+       LowByte(PlayField16[si + FieldWidth - 1]) == fiMurphy ||
+       LowByte(PlayField16[si + FieldWidth])     == fiMurphy ||
+       LowByte(PlayField16[si + FieldWidth + 1]) == fiMurphy))
+    subSoundFX(si, fiBug, actActive);          // play dangerous sound
 
-  if ((ByteMask && PlayField16[si + FieldWidth + 1]) == fiMurphy)
-    goto markPlaySound;
-
-  goto markDisplay;
-
-markPlaySound:
-  subSoundFXBug(); // play dangerous sound
-
-markDisplay:
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  cx = aniBug[bl];
-  StretchedSprites.BltEx(GetStretchX(si), GetStretchY(si), cx);
+  GfxGraphic[GetX(si)][GetY(si)] = (bl == 0  ? aniBugActivating :
+                                   bl == 12 ? aniBugDeactivating :
+                                   bl == 13 ? aniBug : aniBugActive);
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+}
 
-  return subAnimateBugs;
-} // subAnimateBugs
 
 // ==========================================================================
 //                              SUBROUTINE
 // Animate terminals
 // ==========================================================================
-int subAnimateTerminals(int si)
+
+void subAnimateTerminals(int si)
 {
-  int subAnimateTerminals;
+  int bl;
 
-  // int bl, ax, al, X, Y;
-#if 1
-  short bl, al, X, Y;
-#else
-  int bl, al, X, Y;
-#endif
+  int lx = GetX(si);
+  int ly = GetY(si);
+  int graphic;
 
   if (LowByte(PlayField16[si]) != fiTerminal)
-    return subAnimateTerminals;
+    return;
 
-  bl = HighByte(PlayField16[si]);
-  if ((bl & 0x80) == 0x80)
-    bl = (bl | 0xFF00);
+  /* use native frame handling (undo frame incrementation in main loop) */
+  if (game.use_native_sp_graphics_engine)
+    GfxFrame[lx][ly]--;
+
+  /* get last random animation delay */
+  bl = SgnHighByte(PlayField16[si]);
 
   bl = bl + 1;
-  if (bl <= 0)
+  if (bl <= 0)         /* return if random animation delay not yet reached */
   {
     MovHighByte(&PlayField16[si], bl);
-    return subAnimateTerminals;
+
+    return;
   }
 
+  /* calculate new random animation delay */
   bl = -(subGetRandomNumber() & TerminalMaxCycles); // generate new random number
-  MovHighByte(&PlayField16[si], bl); // save new sequence#
+  MovHighByte(&PlayField16[si], bl); // save new sequence number
+
+  /* check terminal state (active or inactive) */
   bl = TerminalState[si] + 1;
   if (bl == 8)
-  {
     bl = 0;
-  }
   else if (15 < bl)
-  {
     bl = 8;
-  }
 
   TerminalState[si] = bl;
+
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  al = aniTerminal + bl;
-  X = GetStretchX(si);
-  Y = GetStretchY(si);
-  StretchedSprites.BltEx(X, Y, al);
+
+  graphic = (bl < 8 ? aniTerminal : aniTerminalActive);
+
+  if (game.use_native_sp_graphics_engine)
+    GfxFrame[lx][ly] += getGraphicInfo_Delay(graphic);
+
+  GfxGraphic[lx][ly] = (bl < 8 ? aniTerminal : aniTerminalActive);
+
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+}
 
-  return subAnimateTerminals;
-} // subAnimateElectrons
 
 // ==========================================================================
 //                              SUBROUTINE
 // Randomize random number generator
 // ==========================================================================
 
-int subRandomize()
+void subRandomize()
 {
-  int subRandomize;
+  int Tick = MyGetTickCount();
 
-  long Tick, Tmp;
-
-  Tick = GetTickCount();
-  Tmp = ((Tick ^ (long)(Tick / (1 << 16))) & 0xFFFF);
-  RandomSeed = 0x7FFF & Tmp;
-  if ((Tmp & 0x8000) != 0)
-    RandomSeed = RandomSeed | 0x8000;
-
-#if 0
-  {
-    int i;
-
-    for (i = 0; i < 10; i++)
-      printf("::: TEST random number: %d\n", subGetRandomNumber());
-  }
-#endif
-
-#if 0
-  printf("::: BugsTerminals.c: ========== subRandomize()\n");
-#endif
-
-  return subRandomize;
-} // subRandomize
+  RandomSeed = (Tick ^ (Tick >> 16)) & 0xFFFF;
+}
 
 
 // ==========================================================================
@@ -178,25 +136,9 @@ int subRandomize()
 
 int subGetRandomNumber()
 {
-  int subGetRandomNumber;
-
-  long Tmp, RSeed;
+  RandomSeed = (RandomSeed * 0x5E5 + 0x31) & 0xFFFF;
 
-  RSeed = (long)(0x7FFF & RandomSeed);
-  if (0x8000 == (RandomSeed & 0x8000))
-    RSeed = RSeed | 0x8000;
-
-#if 0
-  /* !!! TEST !!! */
-  Tmp = 0xFFFF & (((0x5E5 * RSeed) & 0xFFFF) + 0x31);
-#else
-  Tmp = 0xFFFF & (((0x5E5 * RandomSeed) & 0xFFFF) + 0x31);
-#endif
-  RandomSeed = 0x7FFF & Tmp;
-  if ((Tmp & 0x8000) != 0)
-    RandomSeed = RandomSeed | 0x8000;
-
-  subGetRandomNumber = Tmp / 2;
+  return (RandomSeed >> 1);
 
   //  Mov ax, randomseed
   //  Mov bx, &H5E5
@@ -204,11 +146,4 @@ int subGetRandomNumber()
   //  Add ax, &H31
   //  Mov randomseed, ax
   //  shr ax,1
-
-#if 0
-  printf("::: BugsTerminals.c: ---------- subGetRandomNumber(): %d\n",
-        subGetRandomNumber);
-#endif
-
-  return subGetRandomNumber;
-} // subGetRandomNumber
+}