#include "player_skate.h"
#include "player_dead.h"
+#define PLAYER_REWIND_FRAMES 60*4
+
struct player_instance
{
/* transform definition */
- rigidbody rb;
- v3f angles;
+ rigidbody rb, rb_gate_storage;
+ v3f angles, angles_storage;
+
+ v4f qbasis;
+ m3x3f basis, invbasis, basis_gate;
+ world_instance *viewable_world;
/*
* Camera management
* ---------------------------
*/
- camera cam; /* output final camera */
+ camera cam;
enum camera_mode
{
- k_cam_firstperson = 0,
- k_cam_thirdperson = 1
+ 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 */
tpv_lpf,
cam_velocity_smooth;
+ v3f cam_override_pos;
+ v2f cam_override_angles;
+ float cam_override_strength;
+
float cam_velocity_influence,
cam_velocity_coefficient,
cam_velocity_constant,
cam_land_punch,
cam_land_punch_v;
- teleport_gate *gate_waiting;
+ ent_gate *gate_waiting;
/*
* Input
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
* -------------------------------------------------
k_player_subsystem_skate = 1,
k_player_subsystem_dead = 2
}
- subsystem;
+ subsystem,
+ subsystem_gate;
struct player_skate _skate;
struct player_walk _walk;
};
VG_STATIC
-void (*_player_reset[])( player_instance *player, struct respawn_point *rp ) =
+void (*_player_reset[])( player_instance *player, ent_spawn *rp ) =
{
- NULL,
+ player__walk_reset,
player__skate_reset,
NULL
};
player__dead_post_animate
};
+VG_STATIC
+void( *_player_restore[] )( player_instance *player ) =
+{
+ player__walk_restore,
+ player__skate_restore,
+ NULL
+};
+
/* implementation */
#include "player.c"
VG_STATIC void player_init(void) /* 1 */
{
-#if 0
- player.input_js1h = vg_create_named_input( "steer-h", k_input_type_axis );
- player.input_js1v = vg_create_named_input( "steer-v", k_input_type_axis );
- player.input_grab = vg_create_named_input( "grab", k_input_type_axis_norm );
- player.input_js2h = vg_create_named_input( "grab-h", k_input_type_axis );
- player.input_js2v = vg_create_named_input( "grab-v", k_input_type_axis );
- player.input_jump = vg_create_named_input( "jump", k_input_type_button );
- player.input_push = vg_create_named_input( "push", k_input_type_button );
- player.input_walk = vg_create_named_input( "walk", k_input_type_button );
-
- player.input_walkh = vg_create_named_input( "walk-h",
- k_input_type_axis );
- player.input_walkv = vg_create_named_input( "walk-v",
- k_input_type_axis );
-
-
- player.input_switch_mode = vg_create_named_input( "switch-mode",
- k_input_type_button );
- player.input_reset = vg_create_named_input( "reset", k_input_type_button );
-
- const char *default_cfg[] =
- {
- "bind steer-h gp-ls-h",
- "bind -steer-h a",
- "bind +steer-h d",
-
- "bind steer-v gp-ls-v",
- "bind -steer-v w",
- "bind +steer-v s",
-
- "bind grab gp-rt",
- "bind +grab shift",
- "bind grab-h gp-rs-h",
- "bind grab-v gp-rs-v",
-
- "bind jump space",
- "bind jump gp-a",
-
- "bind push gp-b",
- "bind push w",
-
- "bind walk shift",
- "bind walk gp-ls",
-
- "bind walk-h gp-ls-h",
- "bind walk-v -gp-ls-v",
- "bind +walk-h d",
- "bind -walk-h a",
- "bind +walk-v w",
- "bind -walk-v s",
-
- "bind reset gp-lb",
- "bind reset r",
-
- "bind switch-mode gp-y",
- "bind switch-mode e",
- };
-
- for( int i=0; i<vg_list_size(default_cfg); i++ )
- vg_execute_console_input(default_cfg[i]);
-#endif
-
rb_init( &player.rb );
VG_VAR_F32( k_walkspeed );
VG_VAR_F32( k_airspeed );
VG_VAR_F32( k_walk_friction );
VG_VAR_F32( k_walk_air_accel );
- VG_VAR_F32( k_runspeed );
VG_VAR_F32( k_walk_accel );
VG_VAR_I32( freecam );
VG_VAR_I32( cl_thirdperson );
VG_VAR_F32_PERSISTENT( fc_speed );
- /* TODO: NOT PERSISTENT */
VG_VAR_F32( k_ragdoll_limit_scale );
VG_VAR_I32( k_ragdoll_div );
VG_VAR_I32( k_ragdoll_debug_collider );