X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_sfd.c;h=6473d63b3404b24f3699a789d9d9ffcd171afbf7;hb=494c85703c76c4123c49937a32584840b6be1470;hp=478f431ee7aa01956d27746184d39d1ef506454c;hpb=6ba5c35d106d749a1ebafbd3cbe18c3a02f781d3;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_sfd.c b/world_sfd.c index 478f431..6473d63 100644 --- a/world_sfd.c +++ b/world_sfd.c @@ -9,6 +9,8 @@ #include "network_common.h" #include "world_routes.h" +struct world_sfd world_sfd; + static f32 sfd_encode_glyph( char c ){ int value = 0; if( c >= 'a' && c <= 'z' ) @@ -42,41 +44,61 @@ static f32 sfd_encode_glyph( char c ){ return (float)value; } -static void sfd_encode( u32 row, const char *str ){ - int end=0; +static void sfd_clear( u32 row ){ u32 row_h = world_sfd.h -1 -row; - for( int i=0; i= world_sfd.w) || (u < 0) ) + continue; + + if( !str[i] ) + return; + + world_sfd.buffer[idx] = sfd_encode_glyph( str[i] ); } } -static void world_sfd_compile_scores( struct leaderboard_cache *board ){ +void world_sfd_compile_scores( struct leaderboard_cache *board, + const char *title ) +{ for( u32 i=0; i<13; i++ ) - sfd_encode( i, "" ); + sfd_clear(i); + + sfd_encode( (v2i){0,0}, title, k_world_sfd_left ); if( !board ){ - sfd_encode( 4, "Error out of range" ); + sfd_encode( (v2i){-1,4}, "Error out of range", k_world_sfd_center ); return; } - if( !network_client.remote ){ - sfd_encode( 4, "Offline" ); + if( !network_connected() ){ + sfd_encode( (v2i){-1,0}, "Offline", k_world_sfd_right ); return; } if( board->status == k_request_status_not_found ){ - sfd_encode( 4, "No records" ); + sfd_encode( (v2i){-1,4}, "No records", k_world_sfd_center ); return; } @@ -86,7 +108,7 @@ static void world_sfd_compile_scores( struct leaderboard_cache *board ){ vg_strnull( &s, buf, 32 ); vg_strcat( &s, "Error: " ); vg_strcati32( &s, board->status ); - sfd_encode( 4, buf ); + sfd_encode( (v2i){-1,4}, buf, k_world_sfd_center ); return; } @@ -97,42 +119,79 @@ static void world_sfd_compile_scores( struct leaderboard_cache *board ){ if( world_sfd.view_weekly ){ alias = "rows_weekly"; - sfd_encode( 0, "Weekly" ); + sfd_encode( (v2i){-1,0}, "Weekly", k_world_sfd_right ); } else { - sfd_encode( 0, "All-Time" ); + sfd_encode( (v2i){-1,0}, "All-Time", k_world_sfd_right ); } u32 l = 1; if( vg_msg_seekframe( &body, alias ) ){ while( vg_msg_seekframe( &body, NULL ) ){ + /* name */ const char *username = vg_msg_getkvstr( &body, "username" ); + char buf[100]; + vg_str str; + vg_strnull( &str, buf, 100 ); + vg_strcati32( &str, l ); + vg_strcat( &str, " " ); + if( username ) - sfd_encode( l ++, username ); + vg_strcat( &str, username ); else - sfd_encode( l ++, "UNKNOWN USER" ); + vg_strcat( &str, "??????" ); + + sfd_encode( (v2i){0,l}, str.buffer, k_world_sfd_left ); + + /* time */ + vg_strnull( &str, buf, 100 ); + + u32 centiseconds; + vg_msg_getkvintg( &body, "time", k_vg_msg_i32, ¢iseconds, NULL ); + + i32 seconds = centiseconds / 100, + minutes = seconds / 60; + + centiseconds %= 100; + seconds %= 60; + minutes %= 60; + if( minutes > 9 ) vg_strcat( &str, "?" ); + else vg_strcati32( &str, minutes ); + vg_strcat( &str, ":" ); + vg_strcati32r( &str, seconds, 2, '0' ); + vg_strcat( &str, "." ); + vg_strcati32r( &str, centiseconds, 2, '0' ); + sfd_encode( (v2i){-1,l}, str.buffer, k_world_sfd_right ); + l ++; vg_msg_skip_frame( &body ); } } else { - sfd_encode( 4, "No records" ); + sfd_encode( (v2i){-1,4}, "No records", k_world_sfd_center ); } } -static void world_sfd_compile_active_scores(void){ +void world_sfd_compile_active_scores(void) +{ world_instance *world = world_current_instance(); struct leaderboard_cache *board = NULL; + const char *name = "Out of range"; - if( world_sfd.active_route_board < mdl_arrcount( &world->ent_route ) ) + if( world_sfd.active_route_board < mdl_arrcount( &world->ent_route ) ){ board = &world->leaderboard_cache[ world_sfd.active_route_board ]; + ent_route *route = mdl_arritm( &world->ent_route, + world_sfd.active_route_board ); + name = mdl_pstr( &world->meta, route->pstr_name ); + } - world_sfd_compile_scores( board ); + world_sfd_compile_scores( board, name ); } -static void world_sfd_update( world_instance *world, v3f pos ){ +void world_sfd_update( world_instance *world, v3f pos ) +{ if( mdl_arrcount( &world->ent_route ) ){ u32 closest = 0; float min_dist = INFINITY; @@ -150,7 +209,7 @@ static void world_sfd_update( world_instance *world, v3f pos ){ struct leaderboard_cache *board = &world->leaderboard_cache[ closest ]; /* request new board if cache expires */ - if( network_client.remote ){ + if( network_connected() ){ f64 delta = vg.time_real - board->cache_time; if( (delta > 45.0) || (board->cache_time == 0.0) ){ board->cache_time = vg.time_real; @@ -185,16 +244,17 @@ static void world_sfd_update( world_instance *world, v3f pos ){ if( fabsf(d1) > rate ){ *cur += rate; - if( *cur > 60.0f ) - *cur -= 60.0f; + if( *cur > 49.0f ) + *cur -= 49.0f; } else *cur = *target; } } -static void bind_terrain_noise(void); -static void sfd_render( world_instance *world, camera *cam, m4x3f transform ){ +void bind_terrain_noise(void); +void sfd_render( world_instance *world, vg_camera *cam, m4x3f transform ) +{ mesh_bind( &world_sfd.mesh_display ); shader_scene_scoretext_use(); shader_scene_scoretext_uTexMain(1); @@ -240,26 +300,15 @@ static void sfd_render( world_instance *world, camera *cam, m4x3f transform ){ mdl_draw_submesh( &world_sfd.sm_base ); } -static int world_sfd_test( int argc, const char *argv[] ){ - if( argc == 2 ){ - int row = vg_min( vg_max(atoi(argv[0]),0), world_sfd.h); - sfd_encode( row, argv[1] ); - } - - return 0; -} - -static void world_sfd_init(void){ +void world_sfd_init(void) +{ vg_info( "world_sfd_init\n" ); - shader_scene_scoretext_register(); - vg_console_reg_cmd( "sfd", world_sfd_test, NULL ); - vg_linear_clear( vg_mem.scratch ); mdl_context mscoreboard; mdl_open( &mscoreboard, "models/rs_scoretext.mdl", vg_mem.scratch ); mdl_load_metadata_block( &mscoreboard, vg_mem.scratch ); - mdl_async_load_glmesh( &mscoreboard, &world_sfd.mesh_base ); + mdl_async_load_glmesh( &mscoreboard, &world_sfd.mesh_base, NULL ); mdl_load_mesh_block( &mscoreboard, vg_mem.scratch );