oh yeah mr crabs
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
index 442d03e0ab7a783fd1b71bba44762e9675cb6e20..b4290af70a5e67ec774b8c1856bde58a5e102fae 100644 (file)
--- a/player.h
+++ b/player.h
@@ -77,6 +77,7 @@ static struct gplayer
          inv_visual_transform;
 
    int is_dead, death_tick_allowance, rewinding;
+   int rewind_sound_wait;
 
    v3f land_target;
    v3f land_target_log[22];
@@ -88,6 +89,7 @@ static struct gplayer
    
    /* Camera */
    float air_blend;
+   float air_time;
    
    v3f camera_pos, smooth_localcam;
    v2f angles;
@@ -101,7 +103,9 @@ static struct gplayer
    u32 rewind_incrementer,
        rewind_length;
 
-   float rewind_time;
+   float rewind_time, rewind_total_length, rewind_predicted_time;
+   double diag_rewind_start, diag_rewind_time;
+   float dist_accum;
 
    /* animation */
    double jump_time;
@@ -263,6 +267,13 @@ static void player_save_rewind_frame(void)
       v3_copy( player.camera_pos, fr->pos );
 
       player.rewind_incrementer = 0;
+
+      if( player.rewind_length > 1 )
+      {
+         player.rewind_total_length += 
+            v3_dist( player.rewind_buffer[player.rewind_length-1].pos,
+                     player.rewind_buffer[player.rewind_length-2].pos );
+      }
    }
 }
 
@@ -278,37 +289,67 @@ static void player_update_pre(void)
 
    if( vg_get_button_down( "reset" ) )
    {
-      player.rewinding = 1;
-      player.rewind_time = (float)player.rewind_length - 0.0001f;
-      player_save_rewind_frame();
-
-      player.is_dead = 0;
-      player.death_tick_allowance = 30;
-      player_restore_frame();
+      double delta = world.routes.time - world.routes.last_use;
 
-      if( !phys->on_board )
+      if( delta <= RESET_MAX_TIME )
       {
-         player.angles[0] = atan2f( -phys->rb.forward[2], 
-                                    -phys->rb.forward[0] );
-      }
+         player.rewinding = 1;
+         player.rewind_sound_wait = 1;
+         player.rewind_time = (float)player.rewind_length - 0.0001f;
+         player_save_rewind_frame();
+         audio_lock();
+         audio_play_oneshot( &audio_rewind[0], 1.0f );
+         audio_unlock();
+
+         /* based on analytical testing. DONT CHANGE!
+          * 
+          *    time taken: y = (x^(4/5)) * 74.5
+          *    inverse   : x = (2/149)^(4/5) * y^(4/5)
+          */
+
+         float constant = powf( 2.0f/149.0f, 4.0f/5.0f ),
+               curve    = powf( player.rewind_total_length, 4.0f/5.0f );
+         
+         player.rewind_predicted_time = constant * curve;
+         player.diag_rewind_start = vg.time;
+         player.diag_rewind_time  = player.rewind_time;
 
-      player.mdl.shoes[0] = 1;
-      player.mdl.shoes[1] = 1;
+         player.is_dead = 0;
+         player.death_tick_allowance = 30;
+         player_restore_frame();
 
-      world_routes_notify_reset();
+         if( !phys->on_board )
+         {
+            player.angles[0] = atan2f( -phys->rb.forward[2], 
+                                       -phys->rb.forward[0] );
+         }
 
-      /* apply 1 frame of movement */
-      player_do_motion();
+         player.mdl.shoes[0] = 1;
+         player.mdl.shoes[1] = 1;
+
+         world_routes_notify_reset();
+
+         /* apply 1 frame of movement */
+         player_do_motion();
+      }
    }
 
    if( vg_get_button_down( "switchmode" ) )
    {
       phys->on_board ^= 0x1;
 
+      audio_lock();
       if( phys->on_board )
       {
          v3_muladds( phys->rb.v, phys->rb.forward, 0.2f, phys->rb.v );
+         audio_play_oneshot( &audio_lands[6], 1.0f );
+      }
+      else
+      {
+         audio_play_oneshot( &audio_lands[5], 1.0f );
       }
+
+      audio_unlock();
    }
 }
 
@@ -372,8 +413,15 @@ static void player_update_post(void)
    {
       if( player.rewind_time <= 0.0f )
       {
+         double taken = vg.time - player.diag_rewind_start;
+         vg_success( "Rewind took (rt, pl, tl): %f, %f, %f\n", 
+                           taken, player.diag_rewind_time,
+                           player.rewind_total_length );
+
          player.rewinding = 0;
          player.rewind_length = 1;
+         player.rewind_total_length = 0.0f;
+         player.rewind_incrementer = 0;
          world.sky_target_rate = 1.0;
       }
       else
@@ -407,12 +455,63 @@ static void player_update_post(void)
 
                   advl = vg_minf( mod, subl ),
                   advt = (advl / mod) * budget;
-
+            
+            player.dist_accum += speed * advt;
             player.rewind_time -= advl;
             budget -= advt;
          }
 
+#if 0
+         if( player.dist_accum >= 5.0f )
+         {
+            audio_lock();
+            audio_player_playclip( &audio_rewind_player, &audio_rewind[4] );
+            audio_unlock();
+
+            player.dist_accum -= 5.0f;
+         }
+#endif
+
          player.rewind_time = vg_maxf( 0.0f, player.rewind_time );
+
+         float current_time = vg.time - player.diag_rewind_start,
+               remaining    = player.rewind_predicted_time - current_time;
+
+         if( player.rewind_sound_wait )
+         {
+            if( player.rewind_predicted_time >= 6.5f )
+            {
+               if( remaining <= 6.5f )
+               {
+                  audio_lock();
+                  audio_play_oneshot( &audio_rewind[3], 1.0f );
+                  audio_unlock();
+                  player.rewind_sound_wait = 0;
+               }
+            }
+            else if( player.rewind_predicted_time >= 2.5f )
+            {
+               if( remaining <= 2.5f )
+               {
+                  audio_lock();
+                  audio_play_oneshot( &audio_rewind[2], 1.0f );
+                  audio_unlock();
+                  player.rewind_sound_wait = 0;
+               }
+            }
+            else if( player.rewind_predicted_time >= 1.5f )
+            {
+               if( remaining <= 1.5f )
+               {
+                  audio_lock();
+                  audio_play_oneshot( &audio_rewind[1], 1.0f );
+                  audio_unlock();
+                  player.rewind_sound_wait = 0;
+               }
+            }
+
+
+         }
          
          int i0 = floorf( player.rewind_time ),
              i1 = VG_MIN( i0+1, player.rewind_length-1 );