X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_sfd.c;h=ca6f774b327fe4cd41ae3002b2a1cf8ea049a8d0;hb=1d8d9366022c064ef56d80d463c90a79721c6243;hp=d960b0d54ad5a4221c8d69c0e0f1a39e3be16542;hpb=22f62f001f21d1b91fefd9fc495c122d9ddf205a;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_sfd.c b/world_sfd.c index d960b0d..ca6f774 100644 --- a/world_sfd.c +++ b/world_sfd.c @@ -4,9 +4,12 @@ #include "world_sfd.h" #include "shaders/scene_scoretext.h" #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 ) -{ +static f32 sfd_encode_glyph( char c ){ int value = 0; if( c >= 'a' && c <= 'z' ) value = c-'a'+11; @@ -39,8 +42,7 @@ static f32 sfd_encode_glyph( char c ) return (float)value; } -static void sfd_encode( u32 row, const char *str ) -{ +static void sfd_encode( u32 row, const char *str ){ int end=0; u32 row_h = world_sfd.h -1 -row; @@ -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,26 +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; + struct leaderboard_cache *board = &world->leaderboard_cache[ closest ]; - ent_route *route = mdl_arritm( &world->ent_route, closest ); - u32 id = route->official_track_id; + /* 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 ]; - if( id != 0xffffffff ){ - struct netmsg_board *local_board = - &scoreboard_client_data.boards[id]; + char mod_uid[ ADDON_UID_MAX ]; + addon_alias_uid( &world_reg->alias, mod_uid ); - for( int i=0; i<13; i++ ){ - sfd_encode( i, &local_board->data[27*i] ); - } - }else{ - sfd_encode( 0, mdl_pstr( &world->meta, route->pstr_name ) ); - sfd_encode( 1, "No data" ); + 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