+ audio_lock();
+ if( w->surface == k_surface_prop_concrete ){
+ audio_oneshot_3d(
+ &audio_footsteps[vg_randu32(&vg.rand) %
+ vg_list_size(audio_footsteps)],
+ localplayer.rb.co, 40.0f, 1.0f
+ );
+ }
+ else if( w->surface == k_surface_prop_grass ){
+ audio_oneshot_3d(
+ &audio_footsteps_grass[ vg_randu32(&vg.rand) %
+ vg_list_size(audio_footsteps_grass)],
+ localplayer.rb.co, 40.0f, 1.0f
+ );
+ }
+ else if( w->surface == k_surface_prop_wood ){
+ audio_oneshot_3d(
+ &audio_footsteps_wood[ vg_randu32(&vg.rand) %
+ vg_list_size(audio_footsteps_wood)],
+ localplayer.rb.co, 40.0f, 1.0f
+ );
+ }
+ audio_unlock();
+ }
+
+ w->state.step_phase = walk_phase;
+}
+
+static void player__walk_update(void){
+ struct player_walk *w = &player_walk;
+
+ if( (w->state.activity == k_walk_activity_air) ||
+ (w->state.activity == k_walk_activity_ground) ||
+ (w->state.activity == k_walk_activity_oair) ||
+ (w->state.activity == k_walk_activity_oregular) ||
+ (w->state.activity == k_walk_activity_ipopoff) ){
+ player_walk_update_generic();
+ }
+}
+
+static void player_walk_animate_drop_in(void){
+ struct player_walk *w = &player_walk;
+ struct player_walk_animator *animator = &w->animator;
+ struct skeleton_anim *anim = w->anim_drop_in;
+
+ f32 length = (f32)(anim->length-1) / anim->rate,
+ time = w->state.transition_t;
+
+ f32 walk_yaw = vg_alerpf( w->state.drop_in_start_angle,
+ w->state.drop_in_angle, animator->transition_t );
+ v3_lerp( w->state.drop_in_start, w->state.drop_in_target,
+ animator->transition_t, localplayer.rb.co );
+
+ q_axis_angle( localplayer.rb.q, (v3f){0,1,0}, walk_yaw + VG_PIf );
+
+ /* the drop in bit */
+ v3f final_co;
+ v4f final_q;
+ player_walk_drop_in_overhang_transform( animator->transition_t,
+ final_co, final_q );
+
+ q_mul( final_q, localplayer.rb.q, localplayer.rb.q );
+ v3_lerp( localplayer.rb.co, final_co, animator->transition_t,
+ localplayer.rb.co );
+
+ rb_update_matrices( &localplayer.rb );
+
+ v3_muladds( localplayer.rb.co, localplayer.rb.to_world[1],
+ -0.1f*animator->transition_t, localplayer.rb.co );
+
+ v3_copy( localplayer.rb.co, animator->root_co );
+ v4_copy( localplayer.rb.q, animator->root_q );
+
+ /* for the camera purposes only */
+ v3f init_velocity;
+ player_walk_drop_in_vector( init_velocity );
+ v3_muls( init_velocity, animator->transition_t, localplayer.rb.v );
+ v3_copy( localplayer.rb.v,
+ localplayer.cam_control.cam_velocity_smooth );
+}