run to skate animation
[carveJwlIkooP6JGAAIwe30JlM.git] / player_walk.c
index d5f4aa0c28df9d57a1200ff762b6723f3f5c5bcb..4dd56e391fff9439690cc72f7ab9538cfbe9e645 100644 (file)
@@ -15,7 +15,8 @@ VG_STATIC void player_walk_drop_in_vector( player_instance *player, v3f vec )
 }
 
 VG_STATIC void player_walk_generic_to_skate( player_instance *player,
-                                             enum skate_activity init )
+                                             enum skate_activity init,
+                                             float yaw )
 {
    player->subsystem = k_player_subsystem_skate;
 
@@ -28,7 +29,7 @@ VG_STATIC void player_walk_generic_to_skate( player_instance *player,
    xy_speed[1] = 0.0f;
 
    if( v3_length2( xy_speed ) < 0.1f * 0.1f )
-      q_mulv( player->rb.q, (v3f){0.0f,0.0f,-1.6f}, v );
+      q_mulv( player->rb.q, (v3f){0.0f,0.0f,1.6f}, v );
    else
       v3_copy( player->rb.v, v );
 
@@ -49,7 +50,7 @@ VG_STATIC void player_walk_generic_to_skate( player_instance *player,
    player__skate_reset_animator( player );
    player__skate_clear_mechanics( player );
    rb_update_transform( &player->rb );
-   v3_copy( (v3f){0.0f,0.0f,0.0f}, s->state.trick_euler );
+   v3_copy( (v3f){yaw,0.0f,0.0f}, s->state.trick_euler );
 
    if( init == k_skate_activity_air )
       player__approximate_best_trajectory( player );
@@ -256,10 +257,16 @@ VG_STATIC void player__walk_pre_update( player_instance *player )
          {
             player_walk_drop_in_to_skate( player );
          }
+         else if( w->state.outro_type == k_walk_outro_jump_to_air )
+         {
+            player_walk_generic_to_skate( player, k_skate_activity_air, 0.0f );
+         }
          else
          {
-            player_walk_generic_to_skate( player, k_skate_activity_air );
+            player_walk_generic_to_skate( player, 
+                                          k_skate_activity_ground, 1.0f );
          }
+
          return;
       }
    }
@@ -279,7 +286,20 @@ VG_STATIC void player__walk_pre_update( player_instance *player )
                        av->sk.bones[ av->id_ik_foot_r ].co, 
                        w->state.drop_in_foot_anchor );
          }
-         return;
+         else
+         {
+            w->state.outro_type = k_walk_outro_regular;
+            w->state.outro_anim = w->anim_intro;
+            w->state.outro_start_time = vg.time;
+            w->state.activity = k_walk_activity_lockedmove;
+
+            v3f xy_speed;
+            v3_copy( player->rb.v, xy_speed );
+            xy_speed[1] = 0.0f;
+
+            if( v3_length2( xy_speed ) < 0.1f * 0.1f )
+               q_mulv( player->rb.q, (v3f){0.0f,0.0f,1.6f}, player->rb.v );
+         }
       }
       else
       {
@@ -371,7 +391,9 @@ VG_STATIC void player__walk_update( player_instance *player )
    len = rb_manifold_apply_filtered( manifold, len );
 
    v3f surface_avg = { 0.0f, 0.0f, 0.0f };
-   w->state.activity = k_walk_activity_air;
+
+   if( w->state.activity != k_walk_activity_lockedmove )
+      w->state.activity = k_walk_activity_air;
 
    for( int i=0; i<len; i++ )
    {
@@ -380,7 +402,9 @@ VG_STATIC void player__walk_update( player_instance *player )
 
       if( player_walk_normal_standable( ct->n ) )
       {
-         w->state.activity = k_walk_activity_ground;
+         if( w->state.activity != k_walk_activity_lockedmove )
+            w->state.activity = k_walk_activity_ground;
+
          v3_add( surface_avg, ct->n, surface_avg );
       }
 
@@ -392,7 +416,7 @@ VG_STATIC void player__walk_update( player_instance *player )
     */
    float accel_speed = 0.0f, nominal_speed = 0.0f;
    v3f movedir;
-   v3_muls( right_dir,   walk[0], movedir );
+   v3_muls( right_dir,  walk[0], movedir );
    v3_muladds( movedir, forward_dir, walk[1], movedir );
 
    if( w->state.activity == k_walk_activity_ground )
@@ -775,7 +799,8 @@ VG_STATIC void player__walk_im_gui( player_instance *player )
                            (const char *[]){ "k_walk_activity_air",
                                              "k_walk_activity_ground",
                                              "k_walk_activity_sleep",
-                                             "k_walk_activity_immobile" }
+                                             "k_walk_activity_immobile",
+                                             "k_walk_activity_lockedmove" }
                                              [w->state.activity] );
 
    if( w->state.outro_anim )
@@ -799,6 +824,7 @@ VG_STATIC void player__walk_bind( player_instance *player )
    w->anim_jump         = skeleton_get_anim( sk, "jump+y" );
    w->anim_jump_to_air  = skeleton_get_anim( sk, "jump_to_air" );
    w->anim_drop_in      = skeleton_get_anim( sk, "drop_in" );
+   w->anim_intro        = skeleton_get_anim( sk, "into_skate" );
 }
 
 VG_STATIC void player__walk_transition( player_instance *player, v3f angles )