gate passthrough jump
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index c6e5db6ab6c188cd3cc901301b751fa530829ecb..2ebcee2448668cbdcd0152c5c5b98a537e414069 100644 (file)
@@ -22,6 +22,20 @@ VG_STATIC void player__skate_bind( player_instance *player )
    s->anim_grabs           = skeleton_get_anim( sk, "grabs" );
 }
 
+VG_STATIC void player__skate_kill_audio( player_instance *player )
+{
+   struct player_skate *s = &player->_skate;
+
+   audio_lock();
+   if( s->aud_main )
+      s->aud_main = audio_channel_fadeout( s->aud_main, 0.1f );
+   if( s->aud_air )
+      s->aud_air = audio_channel_fadeout( s->aud_air, 0.1f );
+   if( s->aud_slide )
+      s->aud_slide = audio_channel_fadeout( s->aud_slide, 0.1f );
+   audio_unlock();
+}
+
 /* 
  * Collision detection routines
  *
@@ -380,15 +394,18 @@ void player__approximate_best_trajectory( player_instance *player )
 
       v3_copy( launch_v, p->v );
 
+      m3x3f basis;
+      m3x3_copy( player->basis, basis );
+
       for( int i=1; i<=50; i++ )
       {
          float t = (float)i * k_trace_delta;
 
          v3_muls( launch_v, t, co1 );
-         v3_muladds( co1, player->basis[1], -0.5f * gravity * t*t, co1 );
+         v3_muladds( co1, basis[1], -0.5f * gravity * t*t, co1 );
          v3_add( launch_co, co1, co1 );
 
-         float launch_vy = v3_dot( launch_v,player->basis[1] );
+         float launch_vy = v3_dot( launch_v,basis[1] );
          if( !grind_located && (launch_vy - gravity*t < 0.0f) )
          {
             v3f closest;
@@ -396,15 +413,15 @@ void player__approximate_best_trajectory( player_instance *player )
             {
                v3f ve;
                v3_copy( launch_v, ve );
-               v3_muladds( ve, player->basis[1], -gravity * t, ve );
+               v3_muladds( ve, basis[1], -gravity * t, ve );
 
                if( skate_grind_scansq( player, closest, ve, 0.5f, &grind ) )
                {
                   /* check alignment */
-                  v2f v0 = { v3_dot( ve, player->basis[0] ), 
-                             v3_dot( ve, player->basis[2] ) },
-                      v1 = { v3_dot( grind.dir, player->basis[0] ), 
-                             v3_dot( grind.dir, player->basis[2] ) };
+                  v2f v0 = { v3_dot( ve, basis[0] ), 
+                             v3_dot( ve, basis[2] ) },
+                      v1 = { v3_dot( grind.dir, basis[0] ), 
+                             v3_dot( grind.dir, basis[2] ) };
 
                   v2_normalize( v0 );
                   v2_normalize( v1 );
@@ -419,6 +436,17 @@ void player__approximate_best_trajectory( player_instance *player )
             }
          }
 
+         if( world->rendering_gate ){
+            ent_gate *gate = world->rendering_gate;
+            if( gate_intersect( gate, co1, co0 ) ){
+               m4x3_mulv( gate->transport, co0, co0 );
+               m4x3_mulv( gate->transport, co1, co1 );
+               m3x3_mulv( gate->transport, launch_v, launch_v);
+               m4x3_mulv( gate->transport, launch_co, launch_co );
+               m3x3_mul( gate->transport, basis, basis );
+            }
+         }
+
          float t1;
          v3f n;
 
@@ -636,6 +664,7 @@ VG_STATIC void skate_apply_trick_model( player_instance *player )
       if( (v3_length2(s->state.trick_vel) >= 0.0001f ) &&
           s->state.trick_time > 0.2f)
       {
+         player__skate_kill_audio( player );
          player__dead_transition( player );
       }
 
@@ -967,6 +996,7 @@ VG_STATIC void player__skate_pre_update( player_instance *player )
       angles[2] = 0.0f;
 
       player->holdout_time = 0.25f;
+      player__skate_kill_audio( player );
       player__walk_transition( player, angles );
       return;
    }
@@ -2065,6 +2095,7 @@ begin_collision:;
       v3_lerp( start_co, player->rb.co, t, player->rb.co );
       rb_update_transform( &player->rb );
 
+      player__skate_kill_audio( player );
       player__dead_transition( player );
       return;
    }