added an old version of mikmod for dos
[dosdemo] / src / demo.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <errno.h>
6 #include <limits.h>
7 #include "demo.h"
8 #include "screen.h"
9 #include "3dgfx.h"
10 #include "music.h"
11
12 int fb_width = 320;
13 int fb_height = 240;
14 int fb_bpp = 16;
15 uint16_t *fb_pixels, *vmem_back, *vmem_front;
16 unsigned long time_msec;
17 int mouse_x, mouse_y;
18 unsigned int mouse_bmask;
19
20 static unsigned long nframes;
21 static const char *start_scr_name;
22
23 int demo_init(int argc, char **argv)
24 {
25         struct screen *scr;
26
27         start_scr_name = getenv("START_SCR");
28         if(argv[1]) {
29                 start_scr_name = argv[1];
30         }
31
32         if(g3d_init() == -1) {
33                 return -1;
34         }
35         g3d_framebuffer(fb_width, fb_height, fb_pixels);
36
37         if(music_open("data/test.mod") == -1) {
38                 return -1;
39         }
40
41         if(scr_init() == -1) {
42                 return -1;
43         }
44         if(start_scr_name) {
45                 scr = scr_lookup(start_scr_name);
46         } else {
47                 scr = scr_screen(0);
48         }
49
50         if(!scr || scr_change(scr, 4000) == -1) {
51                 fprintf(stderr, "screen %s not found\n", start_scr_name ? start_scr_name : "0");
52                 return -1;
53         }
54
55         /* clear the framebuffer at least once */
56         memset(fb_pixels, 0, fb_width * fb_height * fb_bpp / CHAR_BIT);
57
58         music_play();
59         return 0;
60 }
61
62 void demo_cleanup(void)
63 {
64         music_close();
65         scr_shutdown();
66         g3d_destroy();
67
68         if(time_msec) {
69                 float fps = (float)nframes / ((float)time_msec / 1000.0f);
70                 printf("average framerate: %.1f\n", fps);
71         }
72 }
73
74 void demo_draw(void)
75 {
76         music_update();
77         scr_update();
78         scr_draw();
79
80         ++nframes;
81 }
82
83 void demo_keyboard(int key, int state)
84 {
85         if(state) {
86                 switch(key) {
87                 case 27:
88                         demo_quit();
89                         break;
90
91                 default:
92                         if(key >= '1' && key <= '1' + scr_num_screens()) {
93                                 int idx = key - '1';
94                                 printf("change screen %d\n", idx);
95                                 scr_change(scr_screen(idx), 4000);
96                         }
97                         break;
98                 }
99         }
100 }