started to convert timer into a class
[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   st_pause_count = SDL_GetTicks();
36 }
37
38 void st_pause_ticks_stop(void)
39 {
40 if(st_pause_count == 0)
41 return;
42
43   st_pause_ticks += SDL_GetTicks() - st_pause_count;
44   st_pause_count = 0;
45 }
46
47 void
48 timer_type::init(bool st_ticks)
49 {
50   period    = 0;
51   time      = 0;
52   get_ticks = st_ticks ? st_get_ticks : SDL_GetTicks;
53 }
54
55 void
56 timer_type::start(unsigned int period_)
57 {
58   time   = get_ticks();
59   period = period_;
60 }
61
62 void
63 timer_type::stop()
64 {
65   if(get_ticks == st_get_ticks)
66     init(true);
67   else
68     init(false);
69 }
70
71 int
72 timer_type::check()
73 {
74   if((time != 0) && (time + period > get_ticks()))
75     return true;
76   else
77     {
78       time = 0;
79       return false;
80     }
81 }
82
83 int
84 timer_type::started()
85 {
86   if(time != 0)
87     return true;
88   else
89     return false;
90 }
91
92 int
93 timer_type::get_left()
94 {
95   return (period - (get_ticks() - time));
96 }
97
98 int
99 timer_type::get_gone()
100 {
101   return (get_ticks() - time);
102 }
103
104 void
105 timer_type::fwrite(FILE* fi)
106 {
107   unsigned int diff_ticks;
108   int tick_mode;
109   if(time != 0)
110     diff_ticks = get_ticks() - time;
111   else
112     diff_ticks = 0;
113
114   ::fwrite(&period,sizeof(unsigned int),1,fi);
115   ::fwrite(&diff_ticks,sizeof(unsigned int),1,fi);
116   if(get_ticks == st_get_ticks)
117       tick_mode = true;
118   else
119       tick_mode = false;
120   ::fwrite(&tick_mode,sizeof(unsigned int),1,fi);
121 }
122
123 void
124 timer_type::fread(FILE* fi)
125 {
126   unsigned int diff_ticks;
127   int tick_mode;
128
129   ::fread(&period,sizeof(unsigned int),1,fi);
130   ::fread(&diff_ticks,sizeof(unsigned int),1,fi);
131   ::fread(&tick_mode,sizeof(unsigned int),1,fi);
132
133   if (tick_mode)
134     get_ticks = st_get_ticks;
135   else
136     get_ticks = SDL_GetTicks;
137
138   if (diff_ticks != 0)
139     time = get_ticks() - diff_ticks;
140   else
141     time = 0;
142
143 }
144
145 /* EOF */