A game engine for top-down 2D RPG games.
rpg
game-engine
raylib
c99
1#include "keraforge/time.h"
2#include <keraforge.h>
3#include <time.h>
4
5
6void kf_timer_start(struct kf_timer *timer)
7{
8 time(&timer->start);
9 time(&timer->now);
10 timer->stop = 0;
11
12 if (timer->mode == kf_timermode_oneshot)
13 timer->age = 0;
14}
15
16void kf_timer_tick(struct kf_timer *timer)
17{
18 if (timer->stop)
19 return;
20
21 time_t now = time(NULL);
22 time_t dif = now - timer->now;
23 timer->age += dif;
24 timer->now = now;
25
26 switch (timer->mode)
27 {
28 case kf_timermode_stopwatch:
29 break;
30 case kf_timermode_repeat:
31 if (timer->age >= timer->length)
32 {
33 timer->age = 0;
34 if (timer->callback)
35 timer->callback(timer);
36 }
37 break;
38 case kf_timermode_oneshot:
39 if (timer->age >= timer->length)
40 {
41 timer->stop = now;
42 timer->age = 0;
43 if (timer->callback)
44 timer->callback(timer);
45 }
46 break;
47 }
48
49}
50
51void kf_timer_stop(struct kf_timer *timer)
52{
53 time(&timer->stop);
54 if (timer->mode == kf_timermode_stopwatch)
55 {
56 timer->length = timer->stop - timer->start;
57 if (timer->callback)
58 timer->callback(timer);
59 }
60}
61
62size_t kf_timer_snprint(struct kf_timer *timer, char *buf, size_t bufsiz)
63{
64 size_t n = 0;
65 switch (timer->mode)
66 {
67 case kf_timermode_stopwatch:
68 n += strftime(buf, bufsiz, "%Hh:%Mm:%Ss", gmtime(&timer->length));
69 break;
70 case kf_timermode_repeat:
71 case kf_timermode_oneshot:
72 n += strftime(buf, bufsiz, "%Hh:%Mm:%Ss/", gmtime(&timer->age));
73 n += strftime(buf + n, bufsiz - n, "%Hh:%Mm:%Ss", gmtime(&timer->length));
74 break;
75 }
76 return n;
77}