organize world modules
[carveJwlIkooP6JGAAIwe30JlM.git] / world_sfd.c
index 9fe2d68e76743060909b200e8ef97fc54152c0c3..a5ba3f6d82981fa6103fc51b2546a6118ef6f8e6 100644 (file)
@@ -59,8 +59,43 @@ VG_STATIC void sfd_encode( u32 row, const char *str )
    }
 }
 
-VG_STATIC void sfd_update(void)
-{
+VG_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; i<mdl_arrcount( &world->ent_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;
+         }
+      }
+
+      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 );
+         u32 id = route->official_track_id;
+
+         if( id != 0xffffffff ){
+            struct netmsg_board *local_board = 
+               &scoreboard_client_data.boards[id];
+
+            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" );
+         }
+      }
+   }
+
    for( int i=0; i<world_sfd.w*world_sfd.h; i++ ){
       float *target = &world_sfd.buffer[i*2+0],
             *cur =    &world_sfd.buffer[i*2+1];