rnd-20090623-1-src
[rocksndiamonds.git] / src / game_sp / TickCountObject.c
diff --git a/src/game_sp/TickCountObject.c b/src/game_sp/TickCountObject.c
new file mode 100644 (file)
index 0000000..ed9c50e
--- /dev/null
@@ -0,0 +1,215 @@
+// ----------------------------------------------------------------------------
+// TickCountObject.c
+// ----------------------------------------------------------------------------
+
+#include "TickCountObject.h"
+
+// --- VERSION 1.0 CLASS
+// --- BEGIN
+// ---   MultiUse = -1  'True  // True
+// ---   Persistable = 0  'NotPersistable  // NotPersistable
+// ---   DataBindingBehavior = 0  'vbNone  // vbNone
+// ---   DataSourceBehavior  = 0  'vbNone  // vbNone
+// ---   MTSTransactionMode  = 0  'NotAnMTSObject  // NotAnMTSObject
+// --- END
+
+// static char *VB_Name = "TickCountObject";
+// static boolean VB_GlobalNameSpace = False;
+// static boolean VB_Creatable = True;
+// static boolean VB_PredeclaredId = False;
+// static boolean VB_Exposed = False;
+// --- Option Explicit
+
+#define LongMin                        (-(double)2147483648) // the "#" sign is a bug of the VB environment AutoFormat function but causes no real problems; don't  worry 'bout it!
+#define LongMax                        (2147483647)
+
+long GetTickCount();
+long QueryPerformanceCounter(currency lpPerformanceCount);
+long QueryPerformanceFrequency(currency lpFrequency);
+
+boolean DelayLoopActive;
+
+boolean MPause, bHighPerf;
+currency PFreq; // LARGE_INTEGER
+double sFactor, msFactor, usFactor;
+
+boolean TickCountObject_Get_Active()
+{
+  boolean Active;
+
+  Active = DelayLoopActive;
+
+  return Active;
+}
+
+boolean TickCountObject_Get_Pause()
+{
+  boolean Pause;
+
+  Pause = MPause;
+
+  return Pause;
+}
+
+void TickCountObject_Let_Pause(boolean NewVal)
+{
+  MPause = NewVal;
+}
+
+void TickCountObject_DelayMS(long MSInterval, boolean DoEventsFlag) // in ms
+{
+  currency Start;
+
+  Start = TickNow();
+  DelayLoopActive = True;
+  do
+  {
+    if (DoEventsFlag)
+      DoEvents();
+
+    if (MSInterval <= TickDiffMS(Start) && ! MPause)
+      break;
+  }
+  while (1);
+
+  DelayLoopActive = False;
+}
+
+// for compatibility with old code:
+void TickCountObject_DelayS(long SInterval, boolean DoEventsFlag) // in s
+{
+  // check if SInterval is less than 25 days ...
+  if ((int)(LongMax / 1000) <= SInterval)
+  {
+    Err.Raise(513, "Delay()", "Value Overflow");
+  }
+  else
+  {
+    TickCountObject_DelayMS((long)1000 * SInterval, DoEventsFlag);
+  }
+}
+
+currency TickCountObject_Get_TickNow()
+{
+  currency TickNow;
+
+  if (bHighPerf)
+  {
+    QueryPerformanceCounter(TickNow);
+  }
+  else
+  {
+    TickNow = GetTickCount();
+  }
+
+  return TickNow;
+}
+
+long TickCountObject_TickDiffS(currency TickStart)
+{
+  long TickDiffS;
+
+  currency NewTick, TD;
+
+  if (bHighPerf)
+  {
+    QueryPerformanceCounter(NewTick);
+    TD = (NewTick - TickStart);
+    TickDiffS = sFactor * TD;
+  }
+  else
+  {
+    NewTick = GetTickCount();
+    if (NewTick < TickStart)
+    {
+      // Overflow occured and needs to be handled
+      TickDiffS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
+    }
+    else
+    {
+      TickDiffS = NewTick - TickStart;
+    }
+
+    TickDiffS = Int(TickDiffS / 1000);
+  }
+
+  return TickDiffS;
+}
+
+long TickCountObject_TickDiffMS(currency TickStart)
+{
+  long TickDiffMS;
+
+  currency NewTick, TD;
+
+  if (bHighPerf)
+  {
+    QueryPerformanceCounter(NewTick);
+    TD = (NewTick - TickStart);
+    TickDiffMS = msFactor * TD;
+  }
+  else
+  {
+    NewTick = GetTickCount();
+    if (NewTick < TickStart)
+    {
+      // Overflow occured and needs to be handled
+      TickDiffMS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
+    }
+    else
+    {
+      TickDiffMS = NewTick - TickStart;
+    }
+  }
+
+  return TickDiffMS;
+}
+
+currency TickCountObject_TickDiffUS(currency TickStart)
+{
+  currency TickDiffUS;
+
+  currency NewTick, TD;
+
+  if (bHighPerf)
+  {
+    QueryPerformanceCounter(NewTick);
+    TD = (NewTick - TickStart);
+    TickDiffUS = usFactor * TD;
+  }
+  else
+  {
+    NewTick = GetTickCount();
+    if (NewTick < TickStart)
+    {
+      // Overflow occured and needs to be handled
+      TickDiffUS = ((LongMax - TickStart) + (NewTick - LongMin) + 1) * (currency)1000;
+    }
+    else
+    {
+      TickDiffUS = (NewTick - TickStart) * (currency)1000;
+    }
+  }
+
+  return TickDiffUS;
+}
+
+#if 0
+
+static void Class_Initialize()
+{
+  long L;
+
+  bHighPerf = (0 != QueryPerformanceFrequency(PFreq));
+  if (bHighPerf)
+  {
+    sFactor = (double)1 / PFreq;
+    msFactor = (double)1000 / PFreq;
+    usFactor = (double)1000000 / PFreq;
+  }
+
+  DelayLoopActive = False;
+  TickCountObject_Let_Pause(False);
+}
+
+#endif