+static void skaterift_populate_main_savedata( savedata_file *file )
+{
+ strcpy( file->path, str_skaterift_main_save );
+
+ vg_msg sav;
+ vg_msg_init( &sav, file->buf, sizeof(file->buf) );
+ vg_msg_wkvnum( &sav, "ach", k_vg_msg_u32, 1, &skaterift.achievements );
+
+ vg_msg_frame( &sav, "player" );
+ {
+ skaterift_write_viewslot( &sav, "board", k_addon_type_board,
+ localplayer.board_view_slot );
+ skaterift_write_viewslot( &sav, "playermodel", k_addon_type_player,
+ localplayer.playermodel_view_slot );
+ }
+ vg_msg_end_frame( &sav );
+
+ file->len = sav.cur.co;
+}
+
+void skaterift_read_main_savedata( savedata_file *file )
+{
+ strcpy( file->path, str_skaterift_main_save );
+ savedata_file_read( file );
+}
+
+int skaterift_autosave( int async )
+{
+ if( async )
+ if( !vg_loader_availible() ) return 0;
+
+ u32 save_files = 2;
+ if( world_static.instances[k_world_purpose_client].status
+ == k_world_status_loaded ){
+ 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.instances[ k_world_purpose_client ].status
+ == k_world_status_loaded ){
+ skaterift_populate_world_savedata( &group->files[2],
+ k_world_purpose_client );