X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.h;h=b4290af70a5e67ec774b8c1856bde58a5e102fae;hb=bceb3a28f8127fa27a17f480bd21fa20a340e848;hp=442d03e0ab7a783fd1b71bba44762e9675cb6e20;hpb=b93c61c54e7ac56f6808b9a563d3e4221ca8482e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.h b/player.h index 442d03e..b4290af 100644 --- 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 );