b1f87f4dcb5d2fff6b06a2303039597b2efe42b8
[eradicate] / src / game.c
1 #include <stdio.h>
2 #include <stdarg.h>
3 #include "game.h"
4 #include "screens.h"
5 #include "sprite.h"
6
7 int fb_width, fb_height;
8 long fb_size;
9 uint16_t *fb_pixels, *vmem;
10
11 long time_msec;
12
13 void (*draw)(void);
14 void (*key_event)(int key, int pressed);
15
16 static struct sprites dbgfont;
17
18
19 int init(int argc, char **argv)
20 {
21         if(load_sprites(&dbgfont, "data/dbgfont.spr") == -1) {
22                 return -1;
23         }
24         if(intro_init() == -1) {
25                 return -1;
26         }
27         if(menu_init() == -1) {
28                 return -1;
29         }
30
31         intro_start();
32         return 0;
33 }
34
35 void cleanup(void)
36 {
37         intro_cleanup();
38         menu_cleanup();
39 }
40
41 void dbg_print(void *fb, int x, int y, const char *str)
42 {
43         uint16_t *dest = (uint16_t*)fb + y * fb_width + x;
44
45         while(*str) {
46                 int c = *str++;
47
48                 if(c > ' ' && c < 128) {
49                         draw_sprite(dest, fb_width * 2, &dbgfont, c - ' ');
50                 }
51                 dest += 8;
52         }
53 }
54
55 void dbg_printf(void *fb, int x, int y, const char *fmt, ...)
56 {
57         static char buf[2048];
58         va_list ap;
59
60         va_start(ap, fmt);
61         vsprintf(buf, fmt, ap);
62         va_end(ap);
63
64         dbg_print(fb, x, y, buf);
65 }
66
67 void dbg_fps(void *fb)
68 {
69         static char fpsbuf[8];
70         static long frame, prev_upd;
71         long msec = time_msec;
72         long delta;
73
74         frame++;
75
76         delta = msec - prev_upd;
77         if(delta >= 1024) {
78                 frame *= 1000;
79                 sprintf(fpsbuf, "%2ld.%1ld", frame >> 10, 10 * (frame & 0x3ff) >> 10);
80                 frame = 0;
81                 prev_upd = msec;
82         }
83
84         dbg_print(fb, 2, 2, fpsbuf);
85 }