nuclear@4: #include nuclear@4: #include "player.h" nuclear@4: #include "level.h" nuclear@4: nuclear@4: static char *dirnames[] = { nuclear@4: "north", "east", "south", "west" nuclear@4: }; nuclear@4: nuclear@4: void player_init(struct player *p, struct level *lvl) nuclear@4: { nuclear@4: p->x = lvl->start_pos[0]; nuclear@4: p->y = lvl->start_pos[1]; nuclear@4: p->lvl = lvl; nuclear@4: p->dir = DIR_NORTH; nuclear@4: } nuclear@4: nuclear@4: int player_move(struct player *p, int dfwd, int dside) nuclear@4: { nuclear@4: int nx, ny; nuclear@4: int dx, dy; nuclear@4: nuclear@4: player_dir_vec(p, &dx, &dy); nuclear@4: nx = p->x + dx * dfwd - dy * dside; nuclear@4: ny = p->y + dy * dfwd + dx * dside; nuclear@4: nuclear@4: if(level_cell(p->lvl, nx, ny) == '#') { nuclear@4: return -1; nuclear@4: } nuclear@4: p->x = nx; nuclear@4: p->y = ny; nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@4: void player_turn(struct player *p, int angle) nuclear@4: { nuclear@4: int dir = (p->dir + angle) % 4; nuclear@4: if(dir < 0) dir += 4; nuclear@4: nuclear@4: printf("turn(%d): %s -> %s\n", angle, dirnames[p->dir], dirnames[dir]); nuclear@4: p->dir = dir; nuclear@4: } nuclear@4: nuclear@4: void player_dir_vec(struct player *p, int *dx, int *dy) nuclear@4: { nuclear@4: *dx = p->dir == DIR_EAST ? 1 : (p->dir == DIR_WEST ? -1 : 0); nuclear@4: *dy = p->dir == DIR_NORTH ? -1 : (p->dir == DIR_SOUTH ? 1 : 0); nuclear@4: }