X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_sfd.c;fp=world_sfd.c;h=ca6f774b327fe4cd41ae3002b2a1cf8ea049a8d0;hb=1d8d9366022c064ef56d80d463c90a79721c6243;hp=9310aee6a52e21f54040b1f46a8f559e81010570;hpb=7e1fe6c7931ba4492aa10ac5eebc316b74fb5dac;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_sfd.c b/world_sfd.c index 9310aee..ca6f774 100644 --- a/world_sfd.c +++ b/world_sfd.c @@ -6,6 +6,8 @@ #include "shaders/scene_vertex_blend.h" #include "network.h" #include "entity.h" +#include "network_common.h" +#include "world_routes.h" static f32 sfd_encode_glyph( char c ){ int value = 0; @@ -59,6 +61,77 @@ static void sfd_encode( u32 row, const char *str ){ } } +static void world_sfd_compile_scores( struct leaderboard_cache *board ){ + for( u32 i=0; i<13; i++ ) + sfd_encode( i, "" ); + + if( !board ){ + sfd_encode( 4, "Error out of range" ); + return; + } + + if( !network_client.remote ){ + sfd_encode( 4, "Offline" ); + return; + } + + if( board->status == k_request_status_not_found ){ + sfd_encode( 4, "No records" ); + return; + } + + if( board->status != k_request_status_ok ){ + char buf[32]; + vg_str s; + vg_strnull( &s, buf, 32 ); + vg_strcat( &s, "Error: " ); + vg_strcati32( &s, board->status ); + sfd_encode( 4, buf ); + return; + } + + vg_msg body; + vg_msg_init( &body, board->data, board->data_len ); + + const char *alias = "rows"; + + if( world_sfd.view_weekly ){ + alias = "rows_weekly"; + sfd_encode( 0, "Weekly" ); + } + else { + sfd_encode( 0, "All-Time" ); + } + + u32 l = 1; + if( vg_msg_seekframe( &body, alias ) ){ + while( vg_msg_seekframe( &body, NULL ) ){ + const char *username = vg_msg_getkvstr( &body, "username" ); + + if( username ) + sfd_encode( l ++, username ); + else + sfd_encode( l ++, "UNKNOWN USER" ); + + vg_msg_skip_frame( &body ); + } + } + else { + sfd_encode( 4, "No records" ); + } +} + +static void world_sfd_compile_active_scores(void){ + world_instance *world = world_current_instance(); + + struct leaderboard_cache *board = NULL; + + if( world_sfd.active_route_board < mdl_arrcount( &world->ent_route ) ) + board = &world->leaderboard_cache[ world_sfd.active_route_board ]; + + world_sfd_compile_scores( board ); +} + static void world_sfd_update( world_instance *world, v3f pos ){ if( mdl_arrcount( &world->ent_route ) ){ u32 closest = 0; @@ -74,22 +147,33 @@ static void world_sfd_update( world_instance *world, v3f pos ){ } } - if( (world_sfd.active_route_board != closest) || network_scores_updated ){ - network_scores_updated = 0; - world_sfd.active_route_board = closest; - ent_route *route = mdl_arritm( &world->ent_route, closest ); + struct leaderboard_cache *board = &world->leaderboard_cache[ closest ]; - addon_reg *world_reg = - world_static.instance_addons[ world_static.active_instance ]; + /* request new board if cache expires */ + if( network_client.remote ){ + f64 delta = vg.time_real - board->cache_time; + if( (delta > 45.0) || (board->cache_time == 0.0) ){ + board->cache_time = vg.time_real; + ent_route *route = mdl_arritm( &world->ent_route, closest ); + addon_reg *world_reg = + world_static.instance_addons[ world - world_static.instances ]; - char mod_uid[ ADDON_UID_MAX ]; - addon_alias_uid( &world_reg->alias, mod_uid ); + char mod_uid[ ADDON_UID_MAX ]; + addon_alias_uid( &world_reg->alias, mod_uid ); - network_request_scoreboard( - mod_uid, - mdl_pstr( &world->meta, route->pstr_name ), - 0 ); + network_request_scoreboard( + mod_uid, + mdl_pstr( &world->meta, route->pstr_name ), + NETWORK_LEADERBOARD_ALLTIME_AND_CURRENT_WEEK, closest ); + } } + + /* compile board text if we changed. */ + if( world_sfd.active_route_board != closest ){ + world_sfd_compile_active_scores(); + } + + world_sfd.active_route_board = closest; } for( int i=0; i