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