52b1b086168d64b59cc926f584133f2f5a718bd6
[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 timer_init(timer_type* ptimer, bool st_ticks)
48 {
49   ptimer->period    = 0;
50   ptimer->time      = 0;
51   ptimer->get_ticks = st_ticks ? st_get_ticks : SDL_GetTicks;
52 }
53
54 void timer_start(timer_type* ptimer, unsigned int period)
55 {
56   ptimer->time = ptimer->get_ticks();
57   ptimer->period = period;
58 }
59
60 void timer_stop(timer_type* ptimer)
61 {
62   if(ptimer->get_ticks == st_get_ticks)
63     timer_init(ptimer,true);
64   else
65     timer_init(ptimer,false);
66 }
67
68 int timer_check(timer_type* ptimer)
69 {
70   if((ptimer->time != 0) && (ptimer->time + ptimer->period > ptimer->get_ticks()))
71     return true;
72   else
73     {
74       ptimer->time = 0;
75       return false;
76     }
77 }
78
79 int timer_started(timer_type* ptimer)
80 {
81   if(ptimer->time != 0)
82     return true;
83   else
84     return false;
85 }
86
87 int timer_get_left(timer_type* ptimer)
88 {
89   return (ptimer->period - (ptimer->get_ticks() - ptimer->time));
90 }
91
92 int timer_get_gone(timer_type* ptimer)
93 {
94   return (ptimer->get_ticks() - ptimer->time);
95 }
96
97 void timer_fwrite(timer_type* ptimer, FILE* fi)
98 {
99   unsigned int diff_ticks;
100   int tick_mode;
101   if(ptimer->time != 0)
102     diff_ticks = ptimer->get_ticks() - ptimer->time;
103   else
104     diff_ticks = 0;
105
106   fwrite(&ptimer->period,sizeof(unsigned int),1,fi);
107   fwrite(&diff_ticks,sizeof(unsigned int),1,fi);
108   if(ptimer->get_ticks == st_get_ticks)
109       tick_mode = true;
110   else
111       tick_mode = false;
112   fwrite(&tick_mode,sizeof(unsigned int),1,fi);
113 }
114
115 void timer_fread(timer_type* ptimer, FILE* fi)
116 {
117   unsigned int diff_ticks;
118   int tick_mode;
119   fread(&ptimer->period,sizeof(unsigned int),1,fi);
120   fread(&diff_ticks,sizeof(unsigned int),1,fi);
121   fread(&tick_mode,sizeof(unsigned int),1,fi);
122
123   if (tick_mode)
124     ptimer->get_ticks = st_get_ticks;
125   else
126     ptimer->get_ticks = SDL_GetTicks;
127
128   if (diff_ticks != 0)
129     ptimer->time = ptimer->get_ticks() - diff_ticks;
130   else
131     ptimer->time = 0;
132
133 }
134