X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.c;h=2fe52a66367e61c76441c31b01295f64ada2610b;hb=e311bbe2fa903a7e2a922f202f389b799193195d;hp=5f6d283a50dc0183621be8ef968c1fba4d56b13b;hpb=00653e446d6b1310fa89d3aace70800f9fef4122;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.c b/world_routes.c index 5f6d283..2fe52a6 100644 --- a/world_routes.c +++ b/world_routes.c @@ -21,6 +21,7 @@ #include "shaders/scene_route.h" #include "shaders/routeui.h" +#include "ent_region.h" static void world_routes_clear( world_instance *world ) { @@ -39,15 +40,17 @@ static void world_routes_clear( world_instance *world ) world_static.last_use = 0.0; } -static void world_routes_time_lap( world_instance *world, ent_route *route ) -{ +static void world_routes_time_lap( world_instance *world, ent_route *route ){ vg_info( "------- time lap %s -------\n", mdl_pstr(&world->meta,route->pstr_name) ); double start_time = 0.0; u32 last_version=0; + f64 last_time = 0.0; + ent_checkpoint *last_cp = NULL; - u32 valid_count=0; + u32 valid_sections=0; + int clean = !localplayer.rewinded_since_last_gate; for( u32 i=0; icheckpoints_count; i++ ){ u32 cpid = (i+route->active_checkpoint) % route->checkpoints_count; @@ -64,29 +67,52 @@ static void world_routes_time_lap( world_instance *world, ent_route *route ) if( i == 0 ) start_time = rg->timing_time; else{ - if( last_version+1 == rg->timing_version ) valid_count ++; - else valid_count = 0; + if( last_version+1 == rg->timing_version ) valid_sections ++; + else valid_sections = 0; } + vg_info( "%u %f [%s]\n", rg->timing_version, rg->timing_time, + i? ((rg->flags & k_ent_gate_clean_pass)? "CLEAN": " "): + " N/A "); + + if( !(rg->flags & k_ent_gate_clean_pass) ) + clean = 0; + last_version = rg->timing_version; - vg_info( "%u %f\n", rg->timing_version, rg->timing_time ); + last_time = rg->timing_time; + last_cp = cp; } if( world_static.current_run_version == last_version+1 ){ - valid_count ++; + valid_sections ++; if( route->checkpoints_count == 1 ){ route->timing_base = world_static.time; } + + f32 section = world_static.time - last_time; + if( (section < last_cp->best_time) || (last_cp->best_time == 0.0f) ){ + last_cp->best_time = section; + } } - else valid_count = 0; + else valid_sections = 0; - vg_info( "%u %f\n", world_static.current_run_version, world_static.time ); + vg_info( "%u %f [%s]\n", + world_static.current_run_version, world_static.time, + !localplayer.rewinded_since_last_gate? "CLEAN": " " ); - if( valid_count==route->checkpoints_count ){ + if( valid_sections==route->checkpoints_count ){ f64 lap_time = world_static.time - start_time; - //world_routes_local_set_record( world, route, lap_time ); + if( (route->best_laptime == 0.0) || (lap_time < route->best_laptime) ){ + route->best_laptime = lap_time; + } + + route->flags |= k_ent_route_flag_achieve_silver; + if( clean ) route->flags |= k_ent_route_flag_achieve_gold; + ent_region_re_eval( world ); + + /* for steam achievements. */ if( route->anon.official_track_id != 0xffffffff ){ struct track_info *ti = &track_infos[ route->anon.official_track_id ]; if( ti->achievement_id ){ @@ -105,10 +131,13 @@ static void world_routes_time_lap( world_instance *world, ent_route *route ) lap_time ); } - route->valid_checkpoints = valid_count+1; + route->valid_checkpoints = valid_sections+1; - vg_info( "valid: %u\n", valid_count ); + vg_info( "valid sections: %u\n", valid_sections ); vg_info( "----------------------------\n" ); + + route->ui_residual = 1.0f; + route->ui_residual_block_w = route->ui_first_block_width; } /* @@ -148,6 +177,13 @@ static void world_routes_activate_entry_gate( world_instance *world, dest->timing_version = world_static.current_run_version; dest->timing_time = world_static.time; + if( localplayer.rewinded_since_last_gate ){ + localplayer.rewinded_since_last_gate = 0; + dest->flags &= ~k_ent_gate_clean_pass; + } + else + dest->flags |= k_ent_gate_clean_pass; + world_static.current_run_version ++; } @@ -279,8 +315,8 @@ void world_routes_place_curve( world_instance *world, ent_route *route, v3_muladds( ha.pos, up, 0.06f+gap, va.co ); v3_muladds( hb.pos, up, 0.06f+gap, vb.co ); - scene_vert_pack_norm( &va, up ); - scene_vert_pack_norm( &vb, up ); + scene_vert_pack_norm( &va, up, 0.0f ); + scene_vert_pack_norm( &vb, up, 0.0f ); float t1 = (travel_length / total_length) * patch_count; va.uv[0] = t1; @@ -519,6 +555,14 @@ static void world_gen_routes_ent_init( world_instance *world ){ ent_route *route = mdl_arritm(&world->ent_route,i); mdl_transform_m4x3( &route->anon.transform, route->board_transform ); + route->flags = 0x00; + route->best_laptime = 0.0; + route->ui_stopper = 0.0f; + route->ui_residual = 0.0f; + + if( mdl_arrcount(&world->ent_region) ) + route->flags |= k_ent_route_flag_out_of_zone; + route->anon.official_track_id = 0xffffffff; for( u32 j=0; jflags & k_ent_gate_linked) & - !(gate->flags & k_ent_gate_nonlocal_DELETED) ){ + !(gate->flags & k_ent_gate_nonlocal) ){ gate = mdl_arritm(&world->ent_gate, gate->target ); for( u32 k=0; k<4; k++ ){ @@ -562,6 +606,11 @@ static void world_gen_routes_ent_init( world_instance *world ){ ent_gate *gate = mdl_arritm( &world->ent_gate, i ); } + for( u32 i=0; ient_checkpoint); i++ ){ + ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, i ); + cp->best_time = 0.0; + } + world_routes_clear( world ); } @@ -855,7 +904,10 @@ static void render_gate_markers( m4x3f world_mmdl, int run_id, ent_gate *gate ){ for( u32 j=0; j<4; j++ ){ if( gate->routes[j] == run_id ){ m4x3f mmdl; - ent_gate_get_mdl_mtx( gate, mmdl ); + m4x3_copy( gate->to_world, mmdl ); + m3x3_scale( mmdl, (v3f){ gate->dimensions[0], + gate->dimensions[1], 1.0f } ); + m4x3_mul( world_mmdl, mmdl, mmdl ); shader_model_gate_uMdl( mmdl ); mdl_draw_submesh( &world_gates.sm_marker[j] ); @@ -994,7 +1046,7 @@ static void render_world_routes( world_instance *world, for( u32 j=0; jent_gate); j ++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, j ); - if( !(gate->flags & k_ent_gate_nonlocal_DELETED) ) + if( !(gate->flags & k_ent_gate_nonlocal) ) render_gate_markers( mmdl, i, gate ); } }