small compression
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index 4bad1deb30cbda0b2db1d8577a744d468467afc4..4688702a68385f01c8d95b68bbc9dffcab278cdf 100644 (file)
@@ -974,11 +974,9 @@ static void skate_apply_jump_model(void){
       v3_muladds( localplayer.rb.v, jumpdir, force, localplayer.rb.v );
       state->jump_charge = 0.0f;
       state->jump_time = vg.time;
-
-      audio_lock();
-      audio_oneshot_3d( &audio_jumps[vg_randu32()%2], 
-                        localplayer.rb.co,40.0f,1.0f);
-      audio_unlock();
+      player__networked_sfx( k_player_subsystem_skate, 32, 
+                             k_player_skate_soundeffect_jump,
+                             localplayer.rb.co, 1.0f );
    }
 }
 
@@ -1104,7 +1102,13 @@ static void player__skate_pre_update(void){
       v3_copy( localplayer.cam.angles, localplayer.angles );
       localplayer.angles[2] = 0.0f;
 
-      player__begin_holdout();
+      v3f newpos, offset;
+      m4x3_mulv( localplayer.rb.to_world, (v3f){0.0f,1.0f,0.0f}, newpos );
+      v3_add( newpos, (v3f){0.0f,-1.0f,0.0f}, newpos );
+      v3_sub( localplayer.rb.co, newpos, offset );
+      v3_copy( newpos, localplayer.rb.co );
+
+      player__begin_holdout( offset );
       player__skate_kill_audio();
       player__walk_transition();
       return;
@@ -1495,8 +1499,12 @@ static void skate_adjust_up_direction(void){
                8.0f * player_skate.substep_delta, state->up_dir );
    }
    else{
-      v3_lerp( state->up_dir, localplayer.basis[1],
-               12.0f * player_skate.substep_delta, state->up_dir );
+      v3f avg;
+      v3_add( localplayer.rb.to_world[1], localplayer.basis[1], avg );
+      v3_normalize( avg );
+
+      v3_lerp( state->up_dir, avg,
+               6.0f * player_skate.substep_delta, state->up_dir );
    }
 }
 
@@ -2039,7 +2047,11 @@ static void player__skate_update(void){
 
    if( world->water.enabled ){
       if( localplayer.rb.co[1]+0.25f < world->water.height ){
-         audio_oneshot_3d( &audio_splash, localplayer.rb.co, 40.0f, 1.0f );
+#if 0
+         player__networked_sfx( k_player_subsystem_walk, 32, 
+                                k_player_walk_soundeffect_splash,
+                                localplayer.rb.co, 1.0f );
+#endif
          player__skate_kill_audio();
          player__dead_transition();
          return;
@@ -2160,15 +2172,15 @@ static void player__skate_update(void){
    }
 
    if( (prev_contacts[0]+prev_contacts[1] == 1) && (contact_count == 2) ){
-      audio_lock();
       for( int i=0; i<2; i++ ){
          if( !prev_contacts[i] ){
             v3f co;
             m4x3_mulv( localplayer.rb.to_world, wheels[i].pos, co );
-            audio_oneshot_3d( &audio_taps[vg_randu32()%4], co, 40.0f, 0.75f );
+            player__networked_sfx( k_player_subsystem_skate, 32, 
+                                   k_player_skate_soundeffect_tap,
+                                   localplayer.rb.co, 0.75f );
          }
       }
-      audio_unlock();
    }
 
    if( contact_count ){
@@ -2558,28 +2570,30 @@ begin_collision:;
    if( stick_frames > 5 ) stick_frames =  5;
 
    if( stick_frames == 4 ){
-      audio_lock();
-
       if( state->activity == k_skate_activity_ground ){
          if( (fabsf(state->slip) > 0.75f) ){
-            audio_oneshot_3d( &audio_lands[vg_randu32()%2+3], localplayer.rb.co, 
-                              40.0f, 1.0f );
+            player__networked_sfx( k_player_subsystem_skate, 128, 
+                                   k_player_skate_soundeffect_land_bad,
+                                   localplayer.rb.co, 0.6f );
          }
          else{
-            audio_oneshot_3d( &audio_lands[vg_randu32()%3], localplayer.rb.co, 
-                              40.0f, 1.0f );
+            player__networked_sfx( k_player_subsystem_skate, 128, 
+                                   k_player_skate_soundeffect_land_good,
+                                   localplayer.rb.co, 1.0f );
          }
       }
       else if( player_skate.surface == k_surface_prop_metal ){
-         audio_oneshot_3d( &audio_board[3], localplayer.rb.co, 40.0f, 1.0f );
+         player__networked_sfx( k_player_subsystem_skate, 128, 
+                                k_player_skate_soundeffect_grind_metal,
+                                localplayer.rb.co, 1.0f );
       }
       else{
-         audio_oneshot_3d( &audio_board[8], localplayer.rb.co, 40.0f, 1.0f );
+         player__networked_sfx( k_player_subsystem_skate, 128, 
+                                k_player_skate_soundeffect_grind_wood,
+                                localplayer.rb.co, 1.0f );
       }
-
-      audio_unlock();
    } else if( stick_frames == 0 ){
-      
+      /* TODO: EXIT SOUNDS */
    }
 }
 
@@ -2668,7 +2682,9 @@ static void player__skate_animate(void){
                                  (1.0f-fabsf(animator->slide)*0.9f);
    animator->offset[1]=vg_clampf(animator->offset[1],-0.5f,0.0f);
 
-   v3_muls( animator->offset, 0.3f, localplayer.cam_control.tpv_offset_extra );
+   v3f cam_offset;
+   v3_mul( animator->offset, (v3f){1.0f,0.3f,1.0f}, cam_offset );
+   v3_copy( cam_offset, localplayer.cam_control.tpv_offset_extra );
 
    /* localized vectors */
    m4x3_mulv( localplayer.rb.to_local, state->cog, animator->local_cog );
@@ -3190,7 +3206,7 @@ static void player__skate_reset( ent_spawn *rp ){
 static void player__skate_animator_exchange( bitpack_ctx *ctx, void *data ){
    struct player_skate_animator *animator = data;
    
-   bitpack_qv3f( ctx, 16, -1024.0f, 1024.0f, animator->root_co );
+   bitpack_qv3f( ctx, 24, -1024.0f, 1024.0f, animator->root_co );
    bitpack_qquat( ctx, animator->root_q );
 
    bitpack_qv3f( ctx, 8, -1.0f, 1.0f, animator->offset );
@@ -3236,4 +3252,29 @@ static void player__skate_animator_exchange( bitpack_ctx *ctx, void *data ){
    bitpack_qf32( ctx, 16,  0.0f, 120.0f, &animator->jump_time );
 }
 
+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 );
+   }
+   else if( id == k_player_skate_soundeffect_tap ){
+      audio_oneshot_3d( &audio_taps[vg_randu32()%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 );
+   }
+   else if( id == k_player_skate_soundeffect_land_bad ){
+      audio_oneshot_3d( &audio_lands[vg_randu32()%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 );
+   }
+   else if( id == k_player_skate_soundeffect_grind_wood ){
+      audio_oneshot_3d( &audio_board[8], pos, 40.0f, volume );
+   }
+
+   audio_unlock();
+}
+
 #endif /* PLAYER_SKATE_C */