X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_skate.c;h=72055cf7ffb6a54dd9eb435ca0c581cd2c2236c3;hb=981f43376c7929866e9294fc35b8bc4cf806eb38;hp=44845acfe9bb7e831c97f28f8e833b0bfb5cc3d6;hpb=3125849dbaa54b975ff1bce09142ee13ddfbcae0;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_skate.c b/player_skate.c index 44845ac..72055cf 100644 --- a/player_skate.c +++ b/player_skate.c @@ -225,7 +225,7 @@ too_many_samples: v3_copy( sj->normal3, n1 ); v3_cross( n0, n1, dir ); - if( v3_length2( dir ) <= 0.001f ) + if( v3_length2( dir ) <= 0.000001f ) continue; v3_normalize( dir ); @@ -715,7 +715,7 @@ static void skate_apply_trick_model(void){ if( v3_length2( state->trick_vel ) < 0.0001f ) return; - int carry_on = player_skate_trick_input(); + int carry_on = state->trick_type == player_skate_trick_input(); /* we assume velocities share a common divisor, in which case the * interval is the minimum value (if not zero) */ @@ -729,24 +729,29 @@ static void skate_apply_trick_model(void){ } float interval = 1.0f / min_rate, - current = floorf( state->trick_time / interval ), - next_end = (current+1.0f) * interval; + current = floorf( state->trick_time ), + next_end = current+1.0f; /* integrate trick velocities */ v3_muladds( state->trick_euler, state->trick_vel, k_rb_delta, state->trick_euler ); - if( !carry_on && (state->trick_time + k_rb_delta >= next_end) ){ + if( !carry_on && (state->trick_time + k_rb_delta/interval >= next_end) ){ state->trick_time = 0.0f; state->trick_euler[0] = roundf( state->trick_euler[0] ); state->trick_euler[1] = roundf( state->trick_euler[1] ); state->trick_euler[2] = roundf( state->trick_euler[2] ); v3_copy( state->trick_vel, state->trick_residualv ); v3_zero( state->trick_vel ); - } - state->trick_time += k_rb_delta; + audio_lock(); + audio_oneshot_3d( &audio_flips[vg_randu32(&vg.rand)%4], + localplayer.rb.co, 40.0f, 1.0f ); + audio_unlock(); + } + else + state->trick_time += k_rb_delta / interval; } else{ if( (v3_length2(state->trick_vel) >= 0.0001f ) && @@ -952,6 +957,7 @@ static void skate_apply_jump_model(void){ q_mulv( qtilt, jumpdir, jumpdir ); } state->surface_cooldown = 10; + state->trick_input_collect = 0.0f; float force = k_jump_force*state->jump_charge; v3_muladds( localplayer.rb.v, jumpdir, force, localplayer.rb.v ); @@ -1095,12 +1101,23 @@ static void player__skate_pre_update(void){ return; } + enum trick_type trick = player_skate_trick_input(); + if( trick ) + state->trick_input_collect += vg.time_frame_delta; + else + state->trick_input_collect = 0.0f; + if( state->activity <= k_skate_activity_air_to_grind ){ - enum trick_type trick = k_trick_type_none; - if( (trick = player_skate_trick_input()) ){ - if( (vg.time - state->jump_time) < 0.1f ){ + if( trick && (state->trick_input_collect < 0.1f) ){ + if( state->trick_time == 0.0f ){ + audio_lock(); + audio_oneshot_3d( &audio_flips[vg_randu32(&vg.rand)%4], + localplayer.rb.co, 40.0f, 1.0f ); + audio_unlock(); + } + + if( state->trick_time < 0.1f ){ v3_zero( state->trick_vel ); - state->trick_time = 0.0f; if( trick == k_trick_type_kickflip ){ state->trick_vel[0] = 3.0f; @@ -1540,7 +1557,6 @@ static void skate_grind_decay( struct grind_info *inf, float strength ){ static void skate_grind_truck_apply( float sign, struct grind_info *inf, float strength ){ struct player_skate_state *state = &player_skate.state; - /* REFACTOR */ v3f ra = { 0.0f, -k_board_radius, sign * k_board_length }; v3f raw, wsp; @@ -2570,6 +2586,27 @@ begin_collision:; } else if( stick_frames == 0 ){ /* TODO: EXIT SOUNDS */ } + + if( (state->activity_prev < k_skate_activity_grind_any) && + (state->activity >= k_skate_activity_grind_any) ){ + state->velocity_limit = v3_length( localplayer.rb.v )*1.0f; + state->grind_y_start = localplayer.rb.co[1]; + } + + if( state->activity >= k_skate_activity_grind_any ){ + f32 dy = localplayer.rb.co[1] - state->grind_y_start; + if( dy < 0.0f ){ + state->velocity_limit += -dy*0.2f; + } + state->grind_y_start = localplayer.rb.co[1]; + + + f32 speed_end = v3_length( localplayer.rb.v ); + if( speed_end > state->velocity_limit ){ + v3_muls( localplayer.rb.v, state->velocity_limit/speed_end, + localplayer.rb.v ); + } + } } static void player__skate_im_gui(void){ @@ -2609,7 +2646,8 @@ static void player__skate_im_gui(void){ state->trick_vel[0], state->trick_vel[1], state->trick_vel[2] ); - player__debugtext( 1, "tricke: %.2f %.2f %.2f", + player__debugtext( 1, "tricke: %.2fs %.2f %.2f %.2f", + state->trick_time, state->trick_euler[0], state->trick_euler[1], state->trick_euler[2] ); @@ -2639,7 +2677,7 @@ static void player__skate_animate(void){ float curspeed = v3_length( localplayer.rb.v ), kickspeed = vg_clampf( curspeed*(1.0f/40.0f), 0.0f, 1.0f ), - kicks = (vg_randf64()-0.5f)*2.0f*kickspeed, + kicks = (vg_randf64(&vg.rand)-0.5f)*2.0f*kickspeed, sign = vg_signf( kicks ); animator->wobble[0] = vg_lerpf( animator->wobble[0], kicks*kicks*sign, @@ -2785,10 +2823,14 @@ static void player__skate_animate(void){ animator->subslap = vg_lerpf( animator->subslap, slapm, vg.time_delta*10.0f ); +#if 0 f32 l = ((state->activity < k_skate_activity_ground) && v3_length2(state->trick_vel) > 0.1f )? 1: 0; animator->trick_foot = vg_lerpf( animator->trick_foot, l, 8.4f*vg.time_delta ); +#endif + + animator->trick_foot = vg_exp_impulse( state->trick_time, 5.0f ); /* grab */ v2f grab_input; @@ -3032,15 +3074,18 @@ static void player__skate_pose( void *_animator, player_pose *pose ){ kf_board->co[1] += animator->slap * animator->subslap; kf_hip->co[1] += animator->slap * 0.25f; + /* kickflip and shuvit are in the wrong order for some reason */ if( animator->trick_type == k_trick_type_kickflip ){ - kf_foot_l->co[0] += animator->trick_foot * 0.2f; + kf_foot_l->co[0] += animator->trick_foot * 0.15f; + kf_foot_r->co[0] -= animator->trick_foot * 0.15f; kf_foot_l->co[1] -= animator->trick_foot * 0.18f; + kf_foot_r->co[1] -= animator->trick_foot * 0.18f; } else if( animator->trick_type == k_trick_type_shuvit ){ - kf_foot_l->co[0] += animator->trick_foot * 0.1f; - kf_foot_r->co[0] -= animator->trick_foot * 0.15f; + kf_foot_l->co[0] += animator->trick_foot * 0.2f; kf_foot_l->co[1] -= animator->trick_foot * 0.18f; - kf_foot_r->co[1] -= animator->trick_foot * 0.18f; + kf_foot_r->co[0] -= animator->trick_foot * 0.1f; + kf_foot_r->co[1] += animator->trick_foot * 0.09f; } else if( animator->trick_type == k_trick_type_treflip ){ kf_foot_l->co[0] += animator->trick_foot * 0.2f; @@ -3272,16 +3317,20 @@ static void player__skate_sfx_oneshot( u8 id, v3f pos, f32 volume ){ audio_lock(); if( id == k_player_skate_soundeffect_jump ){ - audio_oneshot_3d( &audio_jumps[vg_randu32()%2], pos, 40.0f, volume ); + audio_oneshot_3d( &audio_jumps[vg_randu32(&vg.rand)%2], + pos, 40.0f, volume ); } else if( id == k_player_skate_soundeffect_tap ){ - audio_oneshot_3d( &audio_taps[vg_randu32()%4], pos, 40.0f, volume ); + audio_oneshot_3d( &audio_taps[vg_randu32(&vg.rand)%4], + pos, 40.0f, volume ); } else if( id == k_player_skate_soundeffect_land_good ){ - audio_oneshot_3d( &audio_lands[vg_randu32()%3], pos, 40.0f, volume ); + audio_oneshot_3d( &audio_lands[vg_randu32(&vg.rand)%3], + pos, 40.0f, volume ); } else if( id == k_player_skate_soundeffect_land_bad ){ - audio_oneshot_3d( &audio_lands[vg_randu32()%2+3], pos, 40.0f, volume ); + audio_oneshot_3d( &audio_lands[vg_randu32(&vg.rand)%2+3], + pos, 40.0f, volume ); } else if( id == k_player_skate_soundeffect_grind_metal ){ audio_oneshot_3d( &audio_board[3], pos, 40.0f, volume );