#include "player_api.h"
+#define SKATE_CCD
+
+typedef struct jump_info jump_info;
+
struct player_skate
{
struct
enum skate_activity
{
k_skate_activity_air,
+ k_skate_activity_air_to_grind,
k_skate_activity_ground,
- k_skate_activity_grind
+ k_skate_activity_undefined,
+ k_skate_activity_grind_any,
+ k_skate_activity_grind_boardslide,
+ k_skate_activity_grind_metallic,
+ k_skate_activity_grind_back50,
+ k_skate_activity_grind_front50,
+ k_skate_activity_grind_5050
}
activity,
activity_prev;
- float steery,
- steerx,
- steery_s,
- steerx_s,
- reverse,
+ float reverse,
slip;
+ int manual_direction;
+
+ /* tricks */
v3f flip_axis;
float flip_time,
flip_rate;
- m3x3f velocity_bias,
- velocity_bias_pstep;
- v3f apex;
+ v3f trick_vel, /* measured in units of TAU/s */
+ trick_euler; /* measured in units of TAU */
+ float trick_time;
+ float gravity_bias;
- int lift_frames;
+ v3f up_dir;
+ v3f head_position;
v3f throw_v;
v3f cog_v, cog;
v2f grab_mouse_delta;
int charging_jump, jump_dir;
- float jump_charge;
- double jump_time;
+ float jump_charge,
+ slap;
+ double jump_time;
double start_push,
cur_push;
v3f prev_pos;
- /* FIXME: Sensible names */
- v3f vl, /* 1st */
- posl, dirl; /* 3rd */
+ /* initial launch conditions */
+ double air_start;
+ v3f air_init_v,
+ air_init_co;
+
+ v4f smoothed_rotation;
}
state,
state_gate_storage;
- struct land_prediction
+ /* animation /audio */
+ struct skeleton_anim *anim_stand, *anim_highg, *anim_slide,
+ *anim_air, *anim_grind, *anim_grind_jump,
+ *anim_push, *anim_push_reverse,
+ *anim_ollie, *anim_ollie_reverse,
+ *anim_grabs, *anim_stop;
+ v3f
+ board_trick_residualv,
+ board_trick_residuald;
+
+ float blend_slide,
+ blend_z,
+ blend_x,
+ blend_fly,
+ blend_grind,
+ blend_grind_balance,
+ blend_stand,
+ blend_push,
+ blend_jump,
+ blend_airdir,
+ blend_weight,
+ subslap;
+
+ /* vectors representing the direction of the axels in localspace */
+ v3f truckv0[2];
+ v2f wobble;
+
+ audio_channel *aud_main, *aud_slide, *aud_air;
+ enum mdl_surface_prop surface, audio_surface;
+
+ int wheel_contacts[2];
+ float sample_change_cooldown;
+
+ enum {
+ k_skate_sample_concrete,
+ k_skate_sample_wood,
+ k_skate_sample_concrete_scrape_metal,
+ k_skate_sample_concrete_scrape_wood,
+ k_skate_sample_metal_scrape_generic
+ }
+ main_sample_type;
+
+ player_pose holdout;
+
+ /*
+ * Physics
+ * ----------------------------------------------------
+ */
+
+ float substep,
+ substep_delta;
+
+ struct jump_info
{
v3f log[50];
v3f n;
v3f apex;
- u32 log_length;
+ v3f v;
+
+ float gravity;
+
+ int log_length;
float score,
land_dist;
enum prediction_type
{
k_prediction_none,
+ k_prediction_unset,
k_prediction_land,
k_prediction_grind
}
u32 colour;
}
- predictions[22];
- u32 prediction_count;
+ possible_jumps[36];
+ u32 possible_jump_count;
+
float land_dist;
v3f land_normal;
- /* animation */
- struct skeleton_anim *anim_stand, *anim_highg, *anim_slide,
- *anim_air,
- *anim_push, *anim_push_reverse,
- *anim_ollie, *anim_ollie_reverse,
- *anim_grabs, *anim_stop;
- rb_sphere sphere_front, sphere_back;
- v3f board_offset;
- v4f board_rotation;
+ v3f surface_picture,
+ weight_distribution,
+ grind_vec,
+ grind_dir;
- float blend_slide,
- blend_z,
- blend_x,
- blend_fly,
- blend_stand,
- blend_push,
- blend_jump,
- blend_airdir;
+ u32 grind_cooldown,
+ surface_cooldown;
- v2f wobble;
+ float grind_strength;
- float debug_normal_pressure;
- u32 device_id_walk;
+ struct grind_limit
+ {
+ v3f ra, n;
+ float p;
+ }
+ limits[3];
+ u32 limit_count;
};
VG_STATIC void player__skate_bind ( player_instance *player );
player_animation *anim );
VG_STATIC void player__skate_post_animate ( player_instance *player );
VG_STATIC void player__skate_reset ( player_instance *player,
- struct respawn_point *rp );
-
-VG_STATIC void player__skate_transition ( player_instance *player,
- v3f init_velocity );
+ ent_spawn *rp );
+VG_STATIC void player__skate_restore( player_instance *player );
+VG_STATIC void player__skate_clear_mechanics( player_instance *player );
+VG_STATIC void player__skate_reset_animator( player_instance *player );
+VG_STATIC void player__approximate_best_trajectory( player_instance *player );
#endif /* PLAYER_SKATE_H */