eobish

diff src/player.c @ 4:ce0548d24918

mostly works
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 18 Jan 2015 13:30:30 +0200
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/player.c	Sun Jan 18 13:30:30 2015 +0200
     1.3 @@ -0,0 +1,47 @@
     1.4 +#include <stdio.h>
     1.5 +#include "player.h"
     1.6 +#include "level.h"
     1.7 +
     1.8 +static char *dirnames[] = {
     1.9 +	"north", "east", "south", "west"
    1.10 +};
    1.11 +
    1.12 +void player_init(struct player *p, struct level *lvl)
    1.13 +{
    1.14 +	p->x = lvl->start_pos[0];
    1.15 +	p->y = lvl->start_pos[1];
    1.16 +	p->lvl = lvl;
    1.17 +	p->dir = DIR_NORTH;
    1.18 +}
    1.19 +
    1.20 +int player_move(struct player *p, int dfwd, int dside)
    1.21 +{
    1.22 +	int nx, ny;
    1.23 +	int dx, dy;
    1.24 +
    1.25 +	player_dir_vec(p, &dx, &dy);
    1.26 +	nx = p->x + dx * dfwd - dy * dside;
    1.27 +	ny = p->y + dy * dfwd + dx * dside;
    1.28 +
    1.29 +	if(level_cell(p->lvl, nx, ny) == '#') {
    1.30 +		return -1;
    1.31 +	}
    1.32 +	p->x = nx;
    1.33 +	p->y = ny;
    1.34 +	return 0;
    1.35 +}
    1.36 +
    1.37 +void player_turn(struct player *p, int angle)
    1.38 +{
    1.39 +	int dir = (p->dir + angle) % 4;
    1.40 +	if(dir < 0) dir += 4;
    1.41 +
    1.42 +	printf("turn(%d): %s -> %s\n", angle, dirnames[p->dir], dirnames[dir]);
    1.43 +	p->dir = dir;
    1.44 +}
    1.45 +
    1.46 +void player_dir_vec(struct player *p, int *dx, int *dy)
    1.47 +{
    1.48 +	*dx = p->dir == DIR_EAST ? 1 : (p->dir == DIR_WEST ? -1 : 0);
    1.49 +	*dy = p->dir == DIR_NORTH ? -1 : (p->dir == DIR_SOUTH ? 1 : 0);
    1.50 +}