X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;ds=sidebyside;f=world_routes.c;h=52c2c2aa76ad4afad3d10211fcca13afb1e99c5b;hb=1d8d9366022c064ef56d80d463c90a79721c6243;hp=36d70d79f9246194cf0227b87680ea74dc40eb2e;hpb=603805f69c5484316a52ee099d03254c5a1096f3;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.c b/world_routes.c index 36d70d7..52c2c2a 100644 --- a/world_routes.c +++ b/world_routes.c @@ -11,16 +11,19 @@ #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" - +#if 0 static void world_routes_local_set_record( world_instance *world, ent_route *route, f64 lap_time ) @@ -50,7 +53,7 @@ void world_routes_local_set_record( world_instance *world, ent_route *route, vg_warn( "There is no associated track for this record...\n" ); } } - +#endif static void world_routes_clear( world_instance *world ) { @@ -114,8 +117,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; @@ -866,9 +886,7 @@ static void world_gen_routes_generate( u32 instance_id ){ 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 +955,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,8 +994,7 @@ 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++ ){