X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.c;h=75ebae8af66a92afdc58d81eb1f6971d3ba89cb1;hb=4fa9aa9a1e09940e91cc30e171e3de0606515ef3;hp=4998cc115efa779b0d89ae4ce657326525ebec52;hpb=df9f72d2912a5424d37dfdb02f76aba8f1ed4df1;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.c b/world_routes.c index 4998cc1..75ebae8 100644 --- a/world_routes.c +++ b/world_routes.c @@ -11,47 +11,18 @@ #include "world_gate.h" #include "world_load.h" #include "highscores.h" +#include "network.h" #include "font.h" #include "pointcloud.h" #include "gui.h" #include "steam.h" +#include "network_msg.h" +#include "network_common.h" #include "shaders/scene_route.h" #include "shaders/routeui.h" - -static -void world_routes_local_set_record( world_instance *world, ent_route *route, - f64 lap_time ) -{ - vg_success( " NEW LAP TIME: %f\n", lap_time ); - - if( route->anon.official_track_id != 0xffffffff ){ - double time_centiseconds = lap_time * 100.0; - if( time_centiseconds > (float)0xfffe ) /* skill issue */ - return; - - struct track_info *ti = &track_infos[ route->anon.official_track_id ]; - highscore_record *record = &ti->record; - record->trackid = route->anon.official_track_id; - record->datetime = time(NULL); - record->playerid = 0; - record->points = 0; - record->time = time_centiseconds; - ti->push = 1; - - if( ti->achievement_id ){ - steam_set_achievement( ti->achievement_id ); - steam_store_achievements(); - } - } - else{ - vg_warn( "There is no associated track for this record...\n" ); - } -} - - static void world_routes_clear( world_instance *world ) { for( u32 i=0; ient_route ); i++ ){ @@ -114,8 +85,25 @@ static void world_routes_time_lap( world_instance *world, ent_route *route ) vg_info( "%u %f\n", world_static.current_run_version, world_static.time ); if( valid_count==route->checkpoints_count ){ - double lap_time = world_static.time - start_time; - world_routes_local_set_record( world, route, lap_time ); + f64 lap_time = world_static.time - start_time; + //world_routes_local_set_record( world, route, lap_time ); + + if( route->anon.official_track_id != 0xffffffff ){ + struct track_info *ti = &track_infos[ route->anon.official_track_id ]; + if( ti->achievement_id ){ + steam_set_achievement( ti->achievement_id ); + steam_store_achievements(); + } + } + + addon_alias *alias = + &world_static.instance_addons[ world_static.active_instance ]->alias; + + char mod_uid[ ADDON_UID_MAX ]; + addon_alias_uid( alias, mod_uid ); + network_publish_laptime( mod_uid, + mdl_pstr( &world->meta, route->pstr_name ), + lap_time ); } route->valid_checkpoints = valid_count+1; @@ -850,7 +838,6 @@ static void world_gen_routes_generate( u32 instance_id ){ if( instance_id <= 1 /*world_loader.generate_point_cloud*/ ){ f64 area = 0.0; -#if VG_RELEASE area = world_routes_scatter_surface_points( world, pcbuf, 16.0f ); world_routes_surface_grid( world, pcbuf ); @@ -861,14 +848,11 @@ static void world_gen_routes_generate( u32 instance_id ){ 2.0f, 50.0f, 128, (v4f){0.2f,0.2f,0.2f,1.0f} ); } -#endif vg_info( "Distributed %u points over %fkm^2!\n", pcbuf->count, area/1e6f ); - world_write_preview( instance_id? world_static.addon_client: - world_static.addon_hub, - pcbuf ); + world_write_preview( world_static.instance_addons[ instance_id ], pcbuf ); vg_async_dispatch( call_pointcloud, async_pointcloud_sub ); } @@ -937,14 +921,37 @@ static void world_gen_routes_ent_init( world_instance *world ){ world_routes_clear( world ); } +static void world_routes_recv_scoreboard( world_instance *world, + vg_msg *body, u32 route_id, + enum request_status status ){ + if( route_id >= mdl_arrcount( &world->ent_route ) ){ + vg_error( "Scoreboard route_id out of range (%u)\n", route_id ); + return; + } + + struct leaderboard_cache *board = &world->leaderboard_cache[ route_id ]; + board->status = status; + + if( body == NULL ) + board->data_len = 0; + + if( body->max > NETWORK_LEADERBOARD_MAX_SIZE ){ + vg_error( "Scoreboard leaderboard too big (%u>%u)\n", body->max, + NETWORK_LEADERBOARD_MAX_SIZE ); + return; + } + + memcpy( board->data, body->buf, body->max ); + board->data_len = body->max; +} + /* * ----------------------------------------------------------------------------- * Events * ----------------------------------------------------------------------------- */ -static void world_routes_init(void) -{ +static void world_routes_init(void){ world_static.current_run_version = 200; world_static.time = 300.0; world_static.last_use = 0.0; @@ -953,15 +960,16 @@ static void world_routes_init(void) shader_routeui_register(); } -static void world_routes_update( world_instance *world ) -{ +static void world_routes_update( world_instance *world ){ world_static.time += vg.time_delta; for( u32 i=0; ient_route); i++ ){ ent_route *route = mdl_arritm( &world->ent_route, i ); - int target = route->active_checkpoint == 0xffff? 0: 1; - route->factive = vg_lerpf( route->factive, target, 0.6f*vg.time_delta ); + int target = (route->active_checkpoint == 0xffff? 0: 1) || + skaterift.activity == k_skaterift_respawning; + route->factive = vg_lerpf( route->factive, target, + 0.6f*vg.time_frame_delta ); } for( u32 i=0; iroutes[j] == run_id ){ + m4x3f mmdl; + ent_gate_get_mdl_mtx( gate, mmdl ); + shader_model_gate_uMdl( mmdl ); + mdl_draw_submesh( &world_gates.sm_marker[j] ); + break; + } + } +} + static void render_world_routes( world_instance *world, camera *cam, - int layer_depth ) -{ + int layer_depth ){ m4x3f identity_matrix; m4x3_identity( identity_matrix ); @@ -1292,37 +1310,48 @@ static void render_world_routes( world_instance *world, camera *cam, /* skip writing into the motion vectors for this */ glDrawBuffers( 1, (GLenum[]){ GL_COLOR_ATTACHMENT0 } ); + glDisable( GL_CULL_FACE ); - for( u32 i=0; ient_route); i++ ){ - ent_route *route = mdl_arritm( &world->ent_route, i ); + if( skaterift.activity == k_skaterift_respawning ){ + for( u32 i=0; ient_route); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); - if( route->active_checkpoint != 0xffff ){ v4f colour; - float brightness = 0.3f + world->ub_lighting.g_day_phase; - v3_muls( route->colour, brightness, colour ); - colour[3] = 1.0f-route->factive; + v3_muls( route->colour, 1.6666f, colour ); + colour[3] = 0.0f; shader_model_gate_uColour( colour ); - u32 next = route->active_checkpoint+1+layer_depth; - next = next % route->checkpoints_count; - next += route->checkpoints_start; + for( u32 j=0; jent_gate); j ++ ){ + ent_gate *gate = mdl_arritm( &world->ent_gate, j ); + if( !(gate->flags & k_ent_gate_nonlocal) ) + render_gate_markers( i, gate ); + } + } + } + else{ + for( u32 i=0; ient_route); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); - ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, next ); - ent_gate *gate = mdl_arritm( &world->ent_gate, cp->gate_index ); + if( route->active_checkpoint != 0xffff ){ + v4f colour; + float brightness = 0.3f + world->ub_lighting.g_day_phase; + v3_muls( route->colour, brightness, colour ); + colour[3] = 1.0f-route->factive; - m4x3f mmdl; - ent_gate_get_mdl_mtx( gate, mmdl ); - shader_model_gate_uMdl( mmdl ); + shader_model_gate_uColour( colour ); - for( u32 j=0; j<4; j++ ){ - if( gate->routes[j] == i ){ - mdl_draw_submesh( &world_gates.sm_marker[j] ); - break; - } + u32 next = route->active_checkpoint+1+layer_depth; + next = next % route->checkpoints_count; + next += route->checkpoints_start; + + ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, next ); + ent_gate *gate = mdl_arritm( &world->ent_gate, cp->gate_index ); + render_gate_markers( i, gate ); } } } + glEnable( GL_CULL_FACE ); glDrawBuffers( 2, (GLenum[]){ GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 } ); }