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 timer_get_left(timer_type* ptimer)
93 {
94   return (ptimer->period - (ptimer->get_ticks() - ptimer->time));
95 }
96
97 int timer_get_gone(timer_type* ptimer)
98 {
99   return (ptimer->get_ticks() - ptimer->time);
100 }
101
102 void timer_fwrite(timer_type* ptimer, FILE* fi)
103 {
104   unsigned int diff_ticks;
105   int tick_mode;
106   if(ptimer->time != 0)
107     diff_ticks = ptimer->get_ticks() - ptimer->time;
108   else
109     diff_ticks = 0;
110
111   fwrite(&ptimer->period,sizeof(unsigned int),1,fi);
112   fwrite(&diff_ticks,sizeof(unsigned int),1,fi);
113   if(ptimer->get_ticks == st_get_ticks)
114       tick_mode = true;
115   else
116       tick_mode = false;
117   fwrite(&tick_mode,sizeof(unsigned int),1,fi);
118 }
119
120 void timer_fread(timer_type* ptimer, FILE* fi)
121 {
122   unsigned int diff_ticks;
123   int tick_mode;
124   fread(&ptimer->period,sizeof(unsigned int),1,fi);
125   fread(&diff_ticks,sizeof(unsigned int),1,fi);
126   fread(&tick_mode,sizeof(unsigned int),1,fi);
127
128   if (tick_mode)
129     ptimer->get_ticks = st_get_ticks;
130   else
131     ptimer->get_ticks = SDL_GetTicks;
132
133   if (diff_ticks != 0)
134     ptimer->time = ptimer->get_ticks() - diff_ticks;
135   else
136     ptimer->time = 0;
137
138 }
139