+ vg_msg_end_frame( &sav );
+
+ file->len = sav.len;
+}
+
+static int skaterift_autosave( int async ){
+ if( async )
+ if( !vg_loader_availible() ) return 0;
+
+ u32 save_files = 2;
+ if( world_static.addon_client )
+ save_files ++;
+
+ vg_linear_clear( vg_async.buffer );
+ u32 size = sizeof(savedata_group) + sizeof(savedata_file) * save_files;
+
+ savedata_group *group;
+ if( async ){
+ size = vg_align8( size );
+ group = vg_linear_alloc( vg_async.buffer, size );
+ }
+ else
+ group = alloca( size );
+
+ group->file_count = save_files;
+ skaterift_populate_main_savedata( &group->files[0] );
+ skaterift_populate_world_savedata( &group->files[1], k_world_purpose_hub );
+
+ if( world_static.addon_client )
+ skaterift_populate_world_savedata( &group->files[2],
+ k_world_purpose_client );
+
+ if( async )
+ vg_loader_start( (void *)savedata_group_write, group );
+ else
+ savedata_group_write( group );