+struct player_subsystem_interface{
+ void(*system_register)(void);
+ void(*bind)(void);
+ void(*pre_update)(void);
+ void(*update)(void);
+ void(*post_update)(void);
+ void(*im_gui)(void);
+ void(*animate)(void);
+ void(*pose)( void *animator, player_pose *pose );
+ void(*effects)( void *animator, m4x3f *final_mtx, struct player_board *board,
+ struct player_effects_data *effect_data );
+ void(*post_animate)(void);
+ void(*network_animator_exchange)( bitpack_ctx *ctx, void *data );
+ void(*sfx_oneshot)( u8 id, v3f pos, f32 volume );
+
+ void *animator_data;
+ u32 animator_size;
+
+ const char *name;
+};
+
+#include "player_ragdoll.h"
+#include "player_render.h"
+#include "player_model.h"
+
+/* subsystem headers */
+#include "player_walk.h"
+#include "player_skate.h"
+#include "player_dead.h"
+#include "player_drive.h"
+#include "player_basic_info.h"
+
+#include "player_replay.h"
+
+#define PLAYER_REWIND_FRAMES 60*4
+#define RESET_MAX_TIME 45.0
+
+static i32 k_cinema_fixed = 0;
+static f32 k_cinema = 0.0f;
+static i32 k_invert_y = 0;
+
+struct {
+ /* transform definition */
+ rigidbody rb;
+ v3f angles;
+
+ /*
+ * Camera management
+ * ---------------------------
+ */
+ camera cam;
+ struct player_cam_controller cam_control;
+ f32 cam_trackshake;