c3c4443e5d535cd0ec21bda765527e5fa06e0d75
[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)2147483648UL) // the "#" sign is a bug of the VB environment AutoFormat function but causes no real problems; don't  worry 'bout it!
24 #define LongMax                         (2147483647UL)
25
26 #if 0
27
28 long MyGetTickCount();
29 long QueryPerformanceCounter(currency lpPerformanceCount);
30 long QueryPerformanceFrequency(currency lpFrequency);
31
32 #endif
33
34 boolean DelayLoopActive;
35
36 boolean MPause, bHighPerf;
37 currency PFreq; // LARGE_INTEGER
38 double sFactor, msFactor, usFactor;
39
40 #if 0
41
42 boolean TickCountObject_Get_Active()
43 {
44   boolean Active;
45
46   Active = DelayLoopActive;
47
48   return Active;
49 }
50
51 boolean TickCountObject_Get_Pause()
52 {
53   boolean Pause;
54
55   Pause = MPause;
56
57   return Pause;
58 }
59
60 void TickCountObject_Let_Pause(boolean NewVal)
61 {
62   MPause = NewVal;
63 }
64
65 void TickCountObject_DelayMS(long MSInterval, boolean DoEventsFlag) // in ms
66 {
67   currency Start;
68
69   Start = TickCountObject_Get_TickNow();
70   DelayLoopActive = True;
71   do
72   {
73     if (DoEventsFlag)
74       DoEvents();
75
76     if (MSInterval <= TickCountObject_TickDiffMS(Start) && ! MPause)
77       break;
78   }
79   while (1);
80
81   DelayLoopActive = False;
82 }
83
84 // for compatibility with old code:
85 void TickCountObject_DelayS(long SInterval, boolean DoEventsFlag) // in s
86 {
87   // check if SInterval is less than 25 days ...
88   if ((int)(LongMax / 1000) <= SInterval)
89   {
90     Err.Raise(513, "Delay()", "Value Overflow");
91   }
92   else
93   {
94     TickCountObject_DelayMS((long)1000 * SInterval, DoEventsFlag);
95   }
96 }
97
98 currency TickCountObject_Get_TickNow()
99 {
100   currency TickNow;
101
102   if (bHighPerf)
103   {
104     QueryPerformanceCounter(TickNow);
105   }
106   else
107   {
108     TickNow = MyGetTickCount();
109   }
110
111   return TickNow;
112 }
113
114 long TickCountObject_TickDiffS(currency TickStart)
115 {
116   long TickDiffS;
117
118   currency NewTick, TD;
119
120   if (bHighPerf)
121   {
122     QueryPerformanceCounter(NewTick);
123     TD = (NewTick - TickStart);
124     TickDiffS = sFactor * TD;
125   }
126   else
127   {
128     NewTick = MyGetTickCount();
129     if (NewTick < TickStart)
130     {
131       // Overflow occured and needs to be handled
132       TickDiffS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
133     }
134     else
135     {
136       TickDiffS = NewTick - TickStart;
137     }
138
139     TickDiffS = (int)(TickDiffS / 1000);
140   }
141
142   return TickDiffS;
143 }
144
145 long TickCountObject_TickDiffMS(currency TickStart)
146 {
147   long TickDiffMS;
148
149   currency NewTick, TD;
150
151   if (bHighPerf)
152   {
153     QueryPerformanceCounter(NewTick);
154     TD = (NewTick - TickStart);
155     TickDiffMS = msFactor * TD;
156   }
157   else
158   {
159     NewTick = MyGetTickCount();
160     if (NewTick < TickStart)
161     {
162       // Overflow occured and needs to be handled
163       TickDiffMS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
164     }
165     else
166     {
167       TickDiffMS = NewTick - TickStart;
168     }
169   }
170
171   return TickDiffMS;
172 }
173
174 currency TickCountObject_TickDiffUS(currency TickStart)
175 {
176   currency TickDiffUS;
177
178   currency NewTick, TD;
179
180   if (bHighPerf)
181   {
182     QueryPerformanceCounter(NewTick);
183     TD = (NewTick - TickStart);
184     TickDiffUS = usFactor * TD;
185   }
186   else
187   {
188     NewTick = MyGetTickCount();
189     if (NewTick < TickStart)
190     {
191       // Overflow occured and needs to be handled
192       TickDiffUS = ((LongMax - TickStart) + (NewTick - LongMin) + 1) * (currency)1000;
193     }
194     else
195     {
196       TickDiffUS = (NewTick - TickStart) * (currency)1000;
197     }
198   }
199
200   return TickDiffUS;
201 }
202
203 #endif
204
205 #if 0
206
207 static void Class_Initialize()
208 {
209   long L;
210
211   bHighPerf = (0 != QueryPerformanceFrequency(PFreq));
212   if (bHighPerf)
213   {
214     sFactor = (double)1 / PFreq;
215     msFactor = (double)1000 / PFreq;
216     usFactor = (double)1000000 / PFreq;
217   }
218
219   DelayLoopActive = False;
220   TickCountObject_Let_Pause(False);
221 }
222
223 #endif