rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@2
|
2 #include "fblib.h"
|
nuclear@4
|
3 #include "rend.h"
|
nuclear@4
|
4 #include "level.h"
|
nuclear@4
|
5 #include "player.h"
|
nuclear@0
|
6
|
nuclear@4
|
7 static int init(void);
|
nuclear@4
|
8 static void cleanup(void);
|
nuclear@4
|
9 static void display(void);
|
nuclear@4
|
10 static int keyb(int key, int state, void *cls);
|
nuclear@4
|
11
|
nuclear@4
|
12 static struct player player;
|
nuclear@4
|
13 static struct level level;
|
nuclear@0
|
14
|
nuclear@0
|
15 int main(int argc, char **argv)
|
nuclear@0
|
16 {
|
nuclear@4
|
17 if(init() == -1) {
|
nuclear@0
|
18 return 1;
|
nuclear@0
|
19 }
|
nuclear@0
|
20
|
nuclear@0
|
21 for(;;) {
|
nuclear@2
|
22 if(fb_process_events() == -1) {
|
nuclear@2
|
23 break;
|
nuclear@0
|
24 }
|
nuclear@0
|
25 display();
|
nuclear@0
|
26 }
|
nuclear@0
|
27
|
nuclear@4
|
28 cleanup();
|
nuclear@0
|
29 return 0;
|
nuclear@0
|
30 }
|
nuclear@0
|
31
|
nuclear@4
|
32 static int init(void)
|
nuclear@0
|
33 {
|
nuclear@3
|
34 int i;
|
nuclear@4
|
35
|
nuclear@4
|
36 if(fb_init(320, 240, 8) == -1) {
|
nuclear@4
|
37 return -1;
|
nuclear@4
|
38 }
|
nuclear@4
|
39 fb_keyboard_callback(keyb, 0);
|
nuclear@4
|
40
|
nuclear@4
|
41 level_init(&level);
|
nuclear@4
|
42 if(level_load(&level, "data/0.lvl") == -1) {
|
nuclear@4
|
43 return -1;
|
nuclear@4
|
44 }
|
nuclear@4
|
45
|
nuclear@4
|
46 if(init_renderer() == -1) {
|
nuclear@4
|
47 return -1;
|
nuclear@4
|
48 }
|
nuclear@4
|
49
|
nuclear@4
|
50 player_init(&player, &level);
|
nuclear@4
|
51
|
nuclear@4
|
52 /* setup the level tileset palette
|
nuclear@4
|
53 * TODO: do it properly
|
nuclear@4
|
54 */
|
nuclear@4
|
55 for(i=0; i<level.tileset.pal_size; i++) {
|
nuclear@4
|
56 struct color *col = level.tileset.pal + i;
|
nuclear@4
|
57 fb_set_palette_entry(i, col->r, col->g, col->b);
|
nuclear@4
|
58 }
|
nuclear@4
|
59
|
nuclear@4
|
60 return 0;
|
nuclear@4
|
61 }
|
nuclear@4
|
62
|
nuclear@4
|
63 static void cleanup(void)
|
nuclear@4
|
64 {
|
nuclear@4
|
65 shutdown_renderer();
|
nuclear@4
|
66 level_destroy(&level);
|
nuclear@4
|
67 fb_shutdown();
|
nuclear@4
|
68 }
|
nuclear@4
|
69
|
nuclear@4
|
70 static void display(void)
|
nuclear@4
|
71 {
|
nuclear@2
|
72 int width = fb_get_width();
|
nuclear@2
|
73 int height = fb_get_height();
|
nuclear@2
|
74 unsigned char *pixels = (unsigned char*)fb_begin_frame();
|
nuclear@0
|
75
|
nuclear@4
|
76 setup_renderer(pixels, width, height);
|
nuclear@4
|
77 render_level(&level, player.x, player.y, player.dir);
|
nuclear@0
|
78
|
nuclear@2
|
79 fb_end_frame();
|
nuclear@0
|
80 }
|
nuclear@4
|
81
|
nuclear@4
|
82 static int keyb(int key, int state, void *cls)
|
nuclear@4
|
83 {
|
nuclear@4
|
84 if(!state) return 0;
|
nuclear@4
|
85
|
nuclear@4
|
86 switch(key) {
|
nuclear@4
|
87 case 27:
|
nuclear@4
|
88 return -1;
|
nuclear@4
|
89
|
nuclear@4
|
90 case 'w':
|
nuclear@4
|
91 player_move(&player, 1, 0);
|
nuclear@4
|
92 break;
|
nuclear@4
|
93
|
nuclear@4
|
94 case 's':
|
nuclear@4
|
95 player_move(&player, -1, 0);
|
nuclear@4
|
96 break;
|
nuclear@4
|
97
|
nuclear@4
|
98 case 'q':
|
nuclear@4
|
99 player_move(&player, 0, -1);
|
nuclear@4
|
100 break;
|
nuclear@4
|
101
|
nuclear@4
|
102 case 'e':
|
nuclear@4
|
103 player_move(&player, 0, 1);
|
nuclear@4
|
104 break;
|
nuclear@4
|
105
|
nuclear@4
|
106 case 'a':
|
nuclear@4
|
107 player_turn(&player, -1);
|
nuclear@4
|
108 break;
|
nuclear@4
|
109
|
nuclear@4
|
110 case 'd':
|
nuclear@4
|
111 player_turn(&player, 1);
|
nuclear@4
|
112 break;
|
nuclear@4
|
113
|
nuclear@4
|
114 default:
|
nuclear@4
|
115 break;
|
nuclear@4
|
116 }
|
nuclear@4
|
117
|
nuclear@4
|
118 return 0;
|
nuclear@4
|
119 }
|