+ for( i32 i=0; i<world_sfd.w; i++ ){
+ i32 u = i + offset_x,
+ idx = (world_sfd.w*row_h + u) * 2;
+
+ if( (u >= world_sfd.w) || (u < 0) )
+ continue;
+
+ if( !str[i] )
+ return;
+
+ world_sfd.buffer[idx] = sfd_encode_glyph( str[i] );
+ }
+}
+
+void world_sfd_compile_scores( struct leaderboard_cache *board,
+ const char *title )
+{
+ for( u32 i=0; i<13; i++ )
+ sfd_clear(i);
+
+ sfd_encode( (v2i){0,0}, title, k_world_sfd_left );
+
+ if( !board ){
+ sfd_encode( (v2i){-1,4}, "Error out of range", k_world_sfd_center );
+ return;
+ }
+
+ if( !network_connected() ){
+ sfd_encode( (v2i){-1,0}, "Offline", k_world_sfd_right );
+ return;
+ }
+
+ if( board->status == k_request_status_not_found ){
+ sfd_encode( (v2i){-1,4}, "No records", k_world_sfd_center );
+ 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( (v2i){-1,4}, buf, k_world_sfd_center );
+ 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( (v2i){-1,0}, "Weekly", k_world_sfd_right );
+ }
+ else {
+ 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 )
+ vg_strcat( &str, username );
+ else
+ 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 );
+
+ 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 );