X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.h;h=a8dd9facd0dc526d2fecf94e1adac836fe37de11;hb=137d40d96fe923600d8378b8e138e3c276f27ff4;hp=f1efabc52492cc227b9c61df01c9ab152617de6b;hpb=5a6199fecf8afcff4b4ef2d341a0dfd0e220420d;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.h b/player_walk.h index f1efabc..a8dd9fa 100644 --- a/player_walk.h +++ b/player_walk.h @@ -1,53 +1,130 @@ #ifndef PLAYER_WALK_H #define PLAYER_WALK_H +#include "player.h" #include "player_api.h" +#include "rigidbody.h" -struct player_walk -{ - rb_capsule collider; +#define PLAYER_JUMP_EPSILON 0.1 /* 100ms jump allowance */ - struct - { - v3f angles; - float heading_angle; +struct player_walk{ + rb_capsule collider; + struct player_walk_state{ v3f prev_pos; + v3f drop_in_target, + drop_in_foot_anchor, + drop_in_start, + drop_in_normal; - enum walk_activity - { + float drop_in_start_angle, + drop_in_angle; + + enum walk_activity{ k_walk_activity_air, k_walk_activity_ground, - k_walk_activity_sleep + k_walk_activity_sleep, + k_walk_activity_lockedmove, + k_walk_activity_sit, + k_walk_activity_sit_up } activity; - struct skeleton_anim *outro_anim; + enum walk_outro{ + k_walk_outro_none, + k_walk_outro_jump_to_air, + k_walk_outro_drop_in, + k_walk_outro_regular, + k_walk_outro_max + } + outro_type; double outro_start_time; + + int jump_queued; + f64 jump_input_time; + + f32 walk_timer; + f32 sit_t; + int step_phase; } - state, - state_gate_storage; + state; + + f32 move_speed; enum mdl_surface_prop surface; struct skeleton_anim *anim_walk, *anim_run, *anim_idle, *anim_jump, - *anim_jump_to_air; + *anim_jump_to_air, *anim_drop_in, *anim_intro, + *anim_sit; - float blend_fly, - blend_run, - blend_walk, + struct player_walk_animator { + v3f root_co; + v4f root_q; + f32 fly, + run, + walk; - move_speed, - walk_timer; -}; + f32 walk_timer, yaw, pitch; -VG_STATIC void player__walk_pre_update ( player_instance *player ); -VG_STATIC void player__walk_update ( player_instance *player ); -VG_STATIC void player__walk_post_update ( player_instance *player ); -VG_STATIC void player__walk_animate ( player_instance *player, - player_animation *anim ); -VG_STATIC void player__walk_post_animate( player_instance *player ); -VG_STATIC void player__walk_im_gui ( player_instance *player ); -VG_STATIC void player__walk_bind ( player_instance *player ); -VG_STATIC void player__walk_transition ( player_instance *player, v3f angles ); + v3f foot_anchor; + enum walk_outro outro_type; + f32 outro_t, + commit_t, + sit_t; + } + animator; +} +static player_walk; + +static f32 + k_walkspeed = 10.0f, + k_airspeed = 1.2f, + k_stopspeed = 4.0f, + k_walk_accel = 10.0f, + k_walk_air_accel = 7.0f, + k_walk_friction = 10.0f, + k_walk_step_height = 0.2f, + + k_sit_yaw_limit = VG_PIf/1.7f, + k_sit_pitch_limit = VG_PIf/4.0f; + +static void player__walk_register(void){ + VG_VAR_F32( k_walkspeed, flags=VG_VAR_CHEAT ); + VG_VAR_F32( k_stopspeed, flags=VG_VAR_CHEAT ); + VG_VAR_F32( k_airspeed, flags=VG_VAR_CHEAT ); + VG_VAR_F32( k_walk_friction, flags=VG_VAR_CHEAT ); + VG_VAR_F32( k_walk_air_accel, flags=VG_VAR_CHEAT ); + VG_VAR_F32( k_walk_accel, flags=VG_VAR_CHEAT ); +} + +static void player__walk_pre_update (void); +static void player__walk_update (void); +static void player__walk_post_update (void); +static void player__walk_animate (void); +static void player__walk_pose (void *animator, player_pose *pose); +static void player__walk_post_animate(void); +static void player__walk_im_gui (void); +static void player__walk_bind (void); +static void player__walk_transition (void); +static void player__walk_reset (ent_spawn *rp ); +static void player__walk_restore (void); +static void player__walk_animator_exchange( bitpack_ctx *ctx, void *data ); + +struct player_subsystem_interface static player_subsystem_walk = { + .system_register = player__walk_register, + .bind = player__walk_bind, + .reset = player__walk_reset, + .pre_update = player__walk_pre_update, + .update = player__walk_update, + .post_update = player__walk_post_update, + .im_gui = player__walk_im_gui, + .animate = player__walk_animate, + .post_animate = player__walk_post_animate, + .pose = player__walk_pose, + .network_animator_exchange = player__walk_animator_exchange, + + .animator_data = &player_walk.animator, + .animator_size = sizeof(player_walk.animator), + .name = "Walk" +}; #endif /* PLAYER_WALK_H */