Finally!!
[supertux.git] / src / timer.cpp
1 //
2 // C Implementation: timer
3 //
4 // Description:
5 //
6 //
7 // Author: Tobias Glaesser <tobi.web@gmx.de>, (C) 2004
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12
13 #include "SDL.h"
14 #include "defines.h"
15 #include "timer.h"
16
17 unsigned int st_pause_ticks, st_pause_count;
18
19 unsigned int st_get_ticks(void)
20 {
21   if(st_pause_count != 0)
22     return /*SDL_GetTicks()*/ - st_pause_ticks /*- SDL_GetTicks()*/ + st_pause_count;
23   else
24     return SDL_GetTicks() - st_pause_ticks;
25 }
26
27 void st_pause_ticks_init(void)
28 {
29   st_pause_ticks = 0;
30   st_pause_count = 0;
31 }
32
33 void st_pause_ticks_start(void)
34 {
35   if(st_pause_count == 0)
36     st_pause_count = SDL_GetTicks();
37 }
38
39 void st_pause_ticks_stop(void)
40 {
41 if(st_pause_count == 0)
42 return;
43
44   st_pause_ticks += SDL_GetTicks() - st_pause_count;
45   st_pause_count = 0;
46 }
47
48 void
49 Timer::init(bool st_ticks)
50 {
51   period    = 0;
52   time      = 0;
53   get_ticks = st_ticks ? st_get_ticks : SDL_GetTicks;
54 }
55
56 void
57 Timer::start(unsigned int period_)
58 {
59   time   = get_ticks();
60   period = period_;
61 }
62
63 void
64 Timer::stop()
65 {
66   if(get_ticks == st_get_ticks)
67     init(true);
68   else
69     init(false);
70 }
71
72 int
73 Timer::check()
74 {
75   if((time != 0) && (time + period > get_ticks()))
76     return true;
77   else
78     {
79       time = 0;
80       return false;
81     }
82 }
83
84 int
85 Timer::started()
86 {
87   if(time != 0)
88     return true;
89   else
90     return false;
91 }
92
93 int
94 Timer::get_left()
95 {
96   return (period - (get_ticks() - time));
97 }
98
99 int
100 Timer::get_gone()
101 {
102   return (get_ticks() - time);
103 }
104
105 void
106 Timer::fwrite(FILE* fi)
107 {
108   unsigned int diff_ticks;
109   int tick_mode;
110   if(time != 0)
111     diff_ticks = get_ticks() - time;
112   else
113     diff_ticks = 0;
114
115   ::fwrite(&period,sizeof(unsigned int),1,fi);
116   ::fwrite(&diff_ticks,sizeof(unsigned int),1,fi);
117   if(get_ticks == st_get_ticks)
118       tick_mode = true;
119   else
120       tick_mode = false;
121   ::fwrite(&tick_mode,sizeof(unsigned int),1,fi);
122 }
123
124 void
125 Timer::fread(FILE* fi)
126 {
127   unsigned int diff_ticks;
128   int tick_mode;
129
130   ::fread(&period,sizeof(unsigned int),1,fi);
131   ::fread(&diff_ticks,sizeof(unsigned int),1,fi);
132   ::fread(&tick_mode,sizeof(unsigned int),1,fi);
133
134   if (tick_mode)
135     get_ticks = st_get_ticks;
136   else
137     get_ticks = SDL_GetTicks;
138
139   if (diff_ticks != 0)
140     time = get_ticks() - diff_ticks;
141   else
142     time = 0;
143
144 }
145
146 /* EOF */