rnd-20090623-1-src
[rocksndiamonds.git] / src / game_sp / TickCountObject.c
1 // ----------------------------------------------------------------------------
2 // TickCountObject.c
3 // ----------------------------------------------------------------------------
4
5 #include "TickCountObject.h"
6
7 // --- VERSION 1.0 CLASS
8 // --- BEGIN
9 // ---   MultiUse = -1  'True  // True
10 // ---   Persistable = 0  'NotPersistable  // NotPersistable
11 // ---   DataBindingBehavior = 0  'vbNone  // vbNone
12 // ---   DataSourceBehavior  = 0  'vbNone  // vbNone
13 // ---   MTSTransactionMode  = 0  'NotAnMTSObject  // NotAnMTSObject
14 // --- END
15
16 // static char *VB_Name = "TickCountObject";
17 // static boolean VB_GlobalNameSpace = False;
18 // static boolean VB_Creatable = True;
19 // static boolean VB_PredeclaredId = False;
20 // static boolean VB_Exposed = False;
21 // --- Option Explicit
22
23 #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!
24 #define LongMax                         (2147483647)
25
26 long GetTickCount();
27 long QueryPerformanceCounter(currency lpPerformanceCount);
28 long QueryPerformanceFrequency(currency lpFrequency);
29
30 boolean DelayLoopActive;
31
32 boolean MPause, bHighPerf;
33 currency PFreq; // LARGE_INTEGER
34 double sFactor, msFactor, usFactor;
35
36 boolean TickCountObject_Get_Active()
37 {
38   boolean Active;
39
40   Active = DelayLoopActive;
41
42   return Active;
43 }
44
45 boolean TickCountObject_Get_Pause()
46 {
47   boolean Pause;
48
49   Pause = MPause;
50
51   return Pause;
52 }
53
54 void TickCountObject_Let_Pause(boolean NewVal)
55 {
56   MPause = NewVal;
57 }
58
59 void TickCountObject_DelayMS(long MSInterval, boolean DoEventsFlag) // in ms
60 {
61   currency Start;
62
63   Start = TickNow();
64   DelayLoopActive = True;
65   do
66   {
67     if (DoEventsFlag)
68       DoEvents();
69
70     if (MSInterval <= TickDiffMS(Start) && ! MPause)
71       break;
72   }
73   while (1);
74
75   DelayLoopActive = False;
76 }
77
78 // for compatibility with old code:
79 void TickCountObject_DelayS(long SInterval, boolean DoEventsFlag) // in s
80 {
81   // check if SInterval is less than 25 days ...
82   if ((int)(LongMax / 1000) <= SInterval)
83   {
84     Err.Raise(513, "Delay()", "Value Overflow");
85   }
86   else
87   {
88     TickCountObject_DelayMS((long)1000 * SInterval, DoEventsFlag);
89   }
90 }
91
92 currency TickCountObject_Get_TickNow()
93 {
94   currency TickNow;
95
96   if (bHighPerf)
97   {
98     QueryPerformanceCounter(TickNow);
99   }
100   else
101   {
102     TickNow = GetTickCount();
103   }
104
105   return TickNow;
106 }
107
108 long TickCountObject_TickDiffS(currency TickStart)
109 {
110   long TickDiffS;
111
112   currency NewTick, TD;
113
114   if (bHighPerf)
115   {
116     QueryPerformanceCounter(NewTick);
117     TD = (NewTick - TickStart);
118     TickDiffS = sFactor * TD;
119   }
120   else
121   {
122     NewTick = GetTickCount();
123     if (NewTick < TickStart)
124     {
125       // Overflow occured and needs to be handled
126       TickDiffS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
127     }
128     else
129     {
130       TickDiffS = NewTick - TickStart;
131     }
132
133     TickDiffS = Int(TickDiffS / 1000);
134   }
135
136   return TickDiffS;
137 }
138
139 long TickCountObject_TickDiffMS(currency TickStart)
140 {
141   long TickDiffMS;
142
143   currency NewTick, TD;
144
145   if (bHighPerf)
146   {
147     QueryPerformanceCounter(NewTick);
148     TD = (NewTick - TickStart);
149     TickDiffMS = msFactor * TD;
150   }
151   else
152   {
153     NewTick = GetTickCount();
154     if (NewTick < TickStart)
155     {
156       // Overflow occured and needs to be handled
157       TickDiffMS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
158     }
159     else
160     {
161       TickDiffMS = NewTick - TickStart;
162     }
163   }
164
165   return TickDiffMS;
166 }
167
168 currency TickCountObject_TickDiffUS(currency TickStart)
169 {
170   currency TickDiffUS;
171
172   currency NewTick, TD;
173
174   if (bHighPerf)
175   {
176     QueryPerformanceCounter(NewTick);
177     TD = (NewTick - TickStart);
178     TickDiffUS = usFactor * TD;
179   }
180   else
181   {
182     NewTick = GetTickCount();
183     if (NewTick < TickStart)
184     {
185       // Overflow occured and needs to be handled
186       TickDiffUS = ((LongMax - TickStart) + (NewTick - LongMin) + 1) * (currency)1000;
187     }
188     else
189     {
190       TickDiffUS = (NewTick - TickStart) * (currency)1000;
191     }
192   }
193
194   return TickDiffUS;
195 }
196
197 #if 0
198
199 static void Class_Initialize()
200 {
201   long L;
202
203   bHighPerf = (0 != QueryPerformanceFrequency(PFreq));
204   if (bHighPerf)
205   {
206     sFactor = (double)1 / PFreq;
207     msFactor = (double)1000 / PFreq;
208     usFactor = (double)1000000 / PFreq;
209   }
210
211   DelayLoopActive = False;
212   TickCountObject_Let_Pause(False);
213 }
214
215 #endif