+static void player_walk_pre_air(void){
+ struct player_walk *w = &player_walk;
+ if( button_down( k_srbind_use ) ){
+ w->state.activity = k_walk_activity_oair;
+ w->state.transition_t = 0.0f;
+ }
+
+ if( button_down( k_srbind_jump ) ){
+ w->state.jump_queued = 1;
+ w->state.jump_input_time = vg.time;
+ }
+}
+
+static void player_walk_pre_drop_in(void){
+ struct player_walk *w = &player_walk;
+ bool finished = player__preupdate_anim( w->anim_drop_in,
+ &w->state.transition_t, 1.0f );
+ if( finished )
+ player_walk_drop_in_to_skate();
+}
+
+static void player_walk_pre_caveman(void){
+ struct player_walk *w = &player_walk;
+ bool finished = player__preupdate_anim( w->anim_jump_to_air,
+ &w->state.transition_t, 1.0f );
+ if( finished ){
+ player_walk_generic_to_skate( k_skate_activity_air,
+ player_walk.animator.board_yaw );
+ }
+}
+
+static void player_walk_pre_running_start(void){
+ struct player_walk *w = &player_walk;
+ bool finished = player__preupdate_anim( w->anim_intro,
+ &w->state.transition_t, 1.0f );
+ if( finished ){
+ /* TODO: get the derivative of the last keyframes to calculate new
+ * velocity for player */
+ player_walk_generic_to_skate( k_skate_activity_ground,
+ player_walk.animator.board_yaw+1.0f );
+ }
+}
+
+static void player_walk_pre_popoff(void){
+ struct player_walk *w = &player_walk;
+ bool finished = player__preupdate_anim( w->anim_popoff,
+ &w->state.transition_t, 1.0f );
+
+ if( finished ){
+ w->state.activity = k_walk_activity_ground;
+ w->animator.board_yaw += 1.0f;
+ }
+}
+
+static void player__walk_pre_update(void){
+ struct player_walk *w = &player_walk;
+
+ if( localplayer.immobile ) return;
+ else player_look( localplayer.angles, skaterift.time_rate );
+
+ enum walk_activity a = w->state.activity;
+
+ if ( a == k_walk_activity_sit ) player_walk_pre_sit();
+ else if( a == k_walk_activity_sit_up ) player_walk_pre_sit_up();
+ else if( a == k_walk_activity_ground ) player_walk_pre_ground();
+ else if( a == k_walk_activity_air ) player_walk_pre_air();
+ else if( a == k_walk_activity_odrop_in ) player_walk_pre_drop_in();
+ else if( a == k_walk_activity_oair ) player_walk_pre_caveman();
+ else if( a == k_walk_activity_oregular ) player_walk_pre_running_start();
+ else if( a == k_walk_activity_ipopoff ) player_walk_pre_popoff();
+}
+
+static int player_walk_normal_standable( v3f n ){