X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.c;h=4dd56e391fff9439690cc72f7ab9538cfbe9e645;hb=41f359a39cd35650bc6ed4dc01989c683409ca68;hp=d5f4aa0c28df9d57a1200ff762b6723f3f5c5bcb;hpb=d71f87252be197cec95e0b0458140112f75dc8b2;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.c b/player_walk.c index d5f4aa0..4dd56e3 100644 --- a/player_walk.c +++ b/player_walk.c @@ -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; in ) ) { - 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 )