+#include "player_common.h"
+#include "player_walk.h"
+#include "player_skate.h"
+#include "player_dead.h"
+#include "player_drive.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 player_instance{
+ /* transform definition */
+ rigidbody rb, rb_gate_storage;
+ v3f angles, angles_storage;
+
+ v4f qbasis;
+ m3x3f basis, invbasis, basis_gate;
+ world_instance *viewable_world;
+
+ /*
+ * Camera management
+ * ---------------------------
+ */
+ camera cam;
+
+ enum camera_mode{
+ k_cam_firstperson = 1,
+ k_cam_thirdperson = 0
+ }
+ camera_mode;
+ float camera_type_blend;
+
+ v3f fpv_offset, /* expressed relative to rigidbody */
+ tpv_offset,
+ fpv_viewpoint, /* expressed relative to neck bone inverse final */
+ fpv_offset_smooth,
+ fpv_viewpoint_smooth,
+ tpv_offset_smooth,
+ tpv_lpf,
+ cam_velocity_smooth;
+
+ v3f cam_override_pos;
+ v3f cam_override_angles;
+ float cam_override_fov;
+ float cam_override_strength;
+ f32 cam_trackshake;
+
+ float cam_velocity_influence,
+ cam_velocity_coefficient,
+ cam_velocity_constant,
+ cam_velocity_coefficient_smooth,
+ cam_velocity_constant_smooth,
+ cam_velocity_influence_smooth;
+
+ v3f cam_land_punch, cam_land_punch_v;
+
+ ent_gate *gate_waiting;
+
+ int immobile;
+
+ /*
+ * Animation
+ * --------------------------------------------------
+ */
+
+ struct player_avatar *playeravatar;
+ struct player_ragdoll ragdoll;
+ struct player_model fallback_model;
+
+ u16 board_view_slot, playermodel_view_slot;
+
+ player_pose holdout_pose;
+ float holdout_time;
+
+ /*
+ * Rewind
+ * ----------------------------------------------------
+ */
+ int rewinding, rewind_sound_wait;
+
+ struct rewind_frame{
+ v3f pos;
+ v3f ang;
+ }
+ *rewind_buffer;
+ u32 rewind_length;
+ float rewind_accum;
+ ent_gate *rewind_gate;
+
+ float rewind_total_length, rewind_predicted_time,
+ dist_accum;
+ double rewind_start, rewind_time;
+
+ /*
+ * Subsystems
+ * -------------------------------------------------
+ */
+
+ enum player_subsystem{
+ k_player_subsystem_walk = 0,
+ k_player_subsystem_skate = 1,
+ k_player_subsystem_dead = 2,
+ k_player_subsystem_drive = 3
+ }
+ subsystem,
+ subsystem_gate;
+
+ struct player_skate _skate;
+ struct player_walk _walk;
+ struct player_dead _dead;
+ struct player_drive _drive;
+}
+static localplayer;