eobish

diff src/main.c @ 4:ce0548d24918

mostly works
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 18 Jan 2015 13:30:30 +0200
parents e32bdd5fb622
children
line diff
     1.1 --- a/src/main.c	Sun Jan 18 05:51:51 2015 +0200
     1.2 +++ b/src/main.c	Sun Jan 18 13:30:30 2015 +0200
     1.3 @@ -1,14 +1,22 @@
     1.4  #include <stdio.h>
     1.5  #include "fblib.h"
     1.6 +#include "rend.h"
     1.7 +#include "level.h"
     1.8 +#include "player.h"
     1.9  
    1.10 -static void display();
    1.11 +static int init(void);
    1.12 +static void cleanup(void);
    1.13 +static void display(void);
    1.14 +static int keyb(int key, int state, void *cls);
    1.15 +
    1.16 +static struct player player;
    1.17 +static struct level level;
    1.18  
    1.19  int main(int argc, char **argv)
    1.20  {
    1.21 -	if(fb_init(320, 240, 8) == -1) {
    1.22 +	if(init() == -1) {
    1.23  		return 1;
    1.24  	}
    1.25 -	fb_set_palette_entry(1, 255, 0, 0);
    1.26  
    1.27  	for(;;) {
    1.28  		if(fb_process_events() == -1) {
    1.29 @@ -17,21 +25,95 @@
    1.30  		display();
    1.31  	}
    1.32  
    1.33 -done:
    1.34 -	fb_shutdown();
    1.35 +	cleanup();
    1.36  	return 0;
    1.37  }
    1.38  
    1.39 -void display()
    1.40 +static int init(void)
    1.41  {
    1.42  	int i;
    1.43 +
    1.44 +	if(fb_init(320, 240, 8) == -1) {
    1.45 +		return -1;
    1.46 +	}
    1.47 +	fb_keyboard_callback(keyb, 0);
    1.48 +
    1.49 +	level_init(&level);
    1.50 +	if(level_load(&level, "data/0.lvl") == -1) {
    1.51 +		return -1;
    1.52 +	}
    1.53 +
    1.54 +	if(init_renderer() == -1) {
    1.55 +		return -1;
    1.56 +	}
    1.57 +
    1.58 +	player_init(&player, &level);
    1.59 +
    1.60 +	/* setup the level tileset palette
    1.61 +	 * TODO: do it properly
    1.62 +	 */
    1.63 +	for(i=0; i<level.tileset.pal_size; i++) {
    1.64 +		struct color *col = level.tileset.pal + i;
    1.65 +		fb_set_palette_entry(i, col->r, col->g, col->b);
    1.66 +	}
    1.67 +
    1.68 +	return 0;
    1.69 +}
    1.70 +
    1.71 +static void cleanup(void)
    1.72 +{
    1.73 +	shutdown_renderer();
    1.74 +	level_destroy(&level);
    1.75 +	fb_shutdown();
    1.76 +}
    1.77 +
    1.78 +static void display(void)
    1.79 +{
    1.80  	int width = fb_get_width();
    1.81  	int height = fb_get_height();
    1.82  	unsigned char *pixels = (unsigned char*)fb_begin_frame();
    1.83  
    1.84 -	for(i=0; i<width * height; i++) {
    1.85 -		*pixels++ = 1;
    1.86 -	}
    1.87 +	setup_renderer(pixels, width, height);
    1.88 +	render_level(&level, player.x, player.y, player.dir);
    1.89  
    1.90  	fb_end_frame();
    1.91  }
    1.92 +
    1.93 +static int keyb(int key, int state, void *cls)
    1.94 +{
    1.95 +	if(!state) return 0;
    1.96 +
    1.97 +	switch(key) {
    1.98 +	case 27:
    1.99 +		return -1;
   1.100 +
   1.101 +	case 'w':
   1.102 +		player_move(&player, 1, 0);
   1.103 +		break;
   1.104 +
   1.105 +	case 's':
   1.106 +		player_move(&player, -1, 0);
   1.107 +		break;
   1.108 +
   1.109 +	case 'q':
   1.110 +		player_move(&player, 0, -1);
   1.111 +		break;
   1.112 +
   1.113 +	case 'e':
   1.114 +		player_move(&player, 0, 1);
   1.115 +		break;
   1.116 +
   1.117 +	case 'a':
   1.118 +		player_turn(&player, -1);
   1.119 +		break;
   1.120 +
   1.121 +	case 'd':
   1.122 +		player_turn(&player, 1);
   1.123 +		break;
   1.124 +
   1.125 +	default:
   1.126 +		break;
   1.127 +	}
   1.128 +
   1.129 +	return 0;
   1.130 +}