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 +}