#include "maths.h" #include "plat.h" #include "player.h" #include "services.h" void init_player(Player* p) { int ip[] = { 5 << fbits, 0, (5 << fbits) }; vec_cpy(p->p, ip, 3); p->r[0] = 0; p->r[1] = 0; } void update_player(Player* p, struct Services* s) { App* a = s->a; int fb, lr; int dir[4]; int t = (p->r[1] / 10); int t2 = (t + 64) & sin_table_mask; t &= sin_table_mask; fb = !!(a->key_states[key_W] & key_state_pressed); fb -= 2 * !!(a->key_states[key_S] & key_state_pressed); lr = !!(a->key_states[key_A] & key_state_pressed); lr -= 2 * !!(a->key_states[key_D] & key_state_pressed); p->r[1] -= a->dmx; dir[0] = -sin_table[t]; dir[1] = cos_table[t]; dir[2] = -sin_table[t2]; dir[3] = cos_table[t2]; p->p[0] += (dir[0] * fb + dir[2] * lr) / 10; p->p[2] += (dir[1] * fb + dir[3] * lr) / 10; p->f[0] = dir[0]; p->f[1] = dir[1]; p->l[0] = dir[2]; p->l[1] = dir[3]; } void push_player_cam(const Player* p) { int v[3]; v[0] = -p->p[0]; v[1] = -p->p[1]; v[2] = -p->p[2]; mtx_push_rot_y(p->r[1] / 10); mtx_push_rot_x(p->r[0] / 10); mtx_push_trans(v); } void pop_player_cam(void) { mtx_popn(3); }