X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;ds=sidebyside;f=world_sfd.c;h=ca6f774b327fe4cd41ae3002b2a1cf8ea049a8d0;hb=1d8d9366022c064ef56d80d463c90a79721c6243;hp=9fe2d68e76743060909b200e8ef97fc54152c0c3;hpb=342fcbf6fda017bdd38d56ce0fa7c9e59e589f3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_sfd.c b/world_sfd.c index 9fe2d68..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; } -VG_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,8 +61,121 @@ VG_STATIC void sfd_encode( u32 row, const char *str ) } } -VG_STATIC void sfd_update(void) -{ +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; + float min_dist = INFINITY; + + for( u32 i=0; ient_route ); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); + float dist = v3_dist2( route->board_transform[3], pos ); + + if( dist < min_dist ){ + min_dist = dist; + closest = i; + } + } + + struct leaderboard_cache *board = &world->leaderboard_cache[ closest ]; + + /* 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 ); + + 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