foo
[vrlugburz] / src / player.c
1 #include "player.h"
2
3 void init_player(struct player *p)
4 {
5         memset(p, 0, sizeof *p);
6         cgm_qcons(&p->vrot, 0, 0, 0, 1);
7
8         p->height = 1.75;
9         p->hp = p->hp_max = 10;
10         p->mp = p->mp_max = 10;
11 }
12
13 void move_player(struct player *p, int right, int fwd)
14 {
15         static const int step[][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
16         int fdir, rdir;
17         float angle;
18         cgm_vec3 vdir = {0, 0, -1};
19
20         cgm_vmul_m3v3(&vdir, p->view_xform);
21
22         angle = atan2(vdir.z, vdir.x) + 3.0 * M_PI;
23         fdir = (p->dir + (int)(2.0 * angle / M_PI)) & 3;
24
25         rdir = (fdir + 1) & 3;
26         p->cx += step[fdir][0] * fwd + step[rdir][0] * right;
27         p->cy += step[fdir][1] * fwd + step[rdir][1] * right;
28 }
29
30 void turn_player(struct player *p, int turn)
31 {
32         if(!turn) return;
33         turn = turn > 0 ? 1 : 3;
34         p->dir = (p->dir + turn) & 3;
35         p->theta = 0;
36 }
37
38 void upd_player_xform(struct player *p)
39 {
40         cgm_vec3 pos;
41         float celld = p->lvl ? p->lvl->cell_size : DEF_CELL_SIZE;
42
43         cgm_vcons(&pos, p->cx * celld, p->height, -p->cy * celld);
44         cgm_vadd(&pos, &p->cpos);
45
46         cgm_midentity(p->view_xform);
47         cgm_mprerotate_x(p->view_xform, -p->phi);
48         cgm_mprerotate_y(p->view_xform, p->theta + p->dir * M_PI / 2.0f);
49         cgm_mrotate_quat(p->view_xform, &p->vrot);
50         cgm_mpretranslate(p->view_xform, -pos.x, -pos.y, -pos.z);
51 }
52
53 void upd_player_vis(struct player *p)
54 {
55         p->vis = 0;
56
57
58 }