if( world->water.enabled ){
if( localplayer.rb.co[1]+0.4f < world->water.height ){
- audio_oneshot_3d( &audio_splash, localplayer.rb.co, 40.0f, 1.0f );
- player__dead_transition();
+ player__networked_sfx( k_player_subsystem_walk, 32,
+ k_player_walk_soundeffect_splash,
+ localplayer.rb.co, 1.0f );
+ player__dead_transition( k_player_die_type_generic );
return;
}
}
v3f forward_dir = { -sinf(yaw), 0.0f, cosf(yaw) };
v3f right_dir = { forward_dir[2], 0.0f, -forward_dir[0] };
- w->move_speed = localplayer.immobile? 0.0f: v2_length( steer );
-
/*
* Collision detection
*/
}
accel_speed = k_walk_accel;
- nominal_speed = k_walkspeed;
+ nominal_speed = button_press(k_srbind_run)? k_runspeed: k_walkspeed;
/* jump */
if( w->state.jump_queued ){
nominal_speed, accel_speed );
v3_normalize( movedir );
}
+
+ w->move_speed = vg_minf( v2_length( (v2f){ localplayer.rb.v[0],
+ localplayer.rb.v[2] } ),
+ k_runspeed );
/*
* Resolve velocity constraints
audio_lock();
if( w->surface == k_surface_prop_concrete ){
audio_oneshot_3d(
- &audio_footsteps[vg_randu32()%vg_list_size(audio_footsteps)],
+ &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()%
+ &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()%
+ &audio_footsteps_wood[ vg_randu32(&vg.rand) %
vg_list_size(audio_footsteps_wood)],
localplayer.rb.co, 40.0f, 1.0f
);
animator->fly = vg_lerpf( animator->fly, fly, rate*vg.time_delta );
animator->run = vg_lerpf( animator->run, w->move_speed,
- 2.0f*vg.time_delta);
+ 8.0f*vg.time_delta);
}
- if( w->move_speed > 0.025f ){
- /* TODO move */
- float walk_norm = 30.0f/(float)w->anim_walk->length,
- run_norm = 30.0f/(float)w->anim_run->length,
- walk_adv = vg_lerpf( walk_norm, run_norm, w->move_speed );
+ if( animator->run > 0.025f ){
+ f32 walk_norm = 30.0f/(float)w->anim_walk->length,
+ run_norm = 30.0f/(float)w->anim_run->length,
+ l;
- w->state.walk_timer += walk_adv * vg.time_delta;
+ if( animator->run <= k_walkspeed )
+ l = (animator->run / k_walkspeed) * walk_norm;
+ else {
+ l = vg_lerpf( walk_norm, run_norm,
+ (animator->run-k_walkspeed) / (k_runspeed-k_walkspeed) );
+ }
+ w->state.walk_timer += l * vg.time_delta;
}
else
w->state.walk_timer = 0.0f;
animator->walk_timer = w->state.walk_timer;
-
if( localplayer.immobile || (w->state.outro_type == k_walk_outro_drop_in) ){
v3_copy( localplayer.rb.co, animator->root_co );
v4_copy( localplayer.rb.q, animator->root_q );
float walk_norm = (float)w->anim_walk->length/30.0f,
run_norm = (float)w->anim_run->length/30.0f,
- t = animator->walk_timer,
- l = vg_clampf( animator->run*15.0f, 0.0f, 1.0f ),
- idle_walk = vg_clampf( (animator->run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f );
+ t = animator->walk_timer;
/* walk/run */
mdl_keyframe apose[32], bpose[32];
- skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose );
- skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose );
-
- skeleton_lerp_pose( sk, apose, bpose, l, apose );
+ if( animator->run <= k_walkspeed ){
+ /* walk / idle */
+ f32 l = vg_minf( 1, (animator->run/k_walkspeed)*6.0f );
+ skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, apose );
+ skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, l, apose );
+ }
+ else {
+ /* walk / run */
+ f32 l = (animator->run-k_walkspeed) / (k_runspeed-k_walkspeed);
+ skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose );
+ skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, l, apose );
+ }
- /* idle */
- skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, bpose );
- skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose );
/* air */
skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose );
w->state.activity = k_walk_activity_air;
w->state.outro_type = k_walk_outro_none;
w->state.outro_start_time = 0.0;
+
+ v3f fwd = { 0.0f, 0.0f, 1.0f };
+ q_mulv( localplayer.rb.q, fwd, fwd );
+ q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f},
+ atan2f(fwd[0], fwd[2]) );
+
+ rb_update_transform( &localplayer.rb );
}
static void player__walk_animator_exchange( bitpack_ctx *ctx, void *data ){
&animator->pitch );
}
}
+
+static void player__walk_sfx_oneshot( u8 id, v3f pos, f32 volume ){
+ audio_lock();
+
+ if( id == k_player_walk_soundeffect_splash ){
+ audio_oneshot_3d( &audio_splash, pos, 40.0f, 1.0f );
+ }
+
+ audio_unlock();
+}
#endif /* PLAYER_DEVICE_WALK_H */