+static void async_call_ready( void *payload, u32 size ){
+ skaterift.op = k_async_op_none;
+}
+
+static void skaterift_restore_state(void){
+ vg_msg sav = {0};
+ sav.buf = savedata.buf;
+ sav.len = savedata.len;
+ sav.max = sizeof(savedata.buf);
+
+ vg_msg player = sav;
+ if( vg_msg_seekframe( &player, "player", 0 ) ){
+ addon_alias q;
+
+ /* board */
+ skaterift_read_addon_alias( &player, "board", k_addon_type_board, &q );
+ u32 reg_id = addon_match( &q );
+ if( reg_id != 0xffffffff ){
+ localplayer.board_view_slot =
+ addon_cache_create_viewer( k_addon_type_board, reg_id );
+ }
+
+ /* playermodel */
+ skaterift_read_addon_alias( &player, "playermodel",
+ k_addon_type_player, &q );
+ reg_id = addon_match( &q );
+
+ if( reg_id == 0xffffffff ) reg_id = 0;
+ localplayer.playermodel_view_slot =
+ addon_cache_create_viewer( k_addon_type_player, reg_id );
+ }
+
+ vg_msg world = sav;
+ if( vg_msg_seekframe( &world, "world", 0 ) ){
+ addon_alias q;
+
+ /* world */
+ skaterift_read_addon_alias( &world, "alias", k_addon_type_world, &q );
+ u32 reg_id = addon_match( &q );
+ if( reg_id != 0xffffffff ){
+ addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id );
+
+ world_loader.generate_point_cloud = 0;
+ world_loader.reg = reg;
+ world_loader.state = k_world_loader_load;
+ skaterift_world_changer_thread(NULL);
+
+ world_static.active_world = vg_msg_seekkvu32( &world, "index", 0 );
+ world_static.active_trigger_volume_count = 0;
+ localplayer.viewable_world = world_current_instance();
+
+ vg_msg_cmd position = vg_msg_seekkv( &world, "position", 0 );
+ v3f pos;
+ vg_msg_convert_num( &position, k_vg_msg_float|k_vg_msg_32b, 3, pos );
+ player__setpos( &localplayer, pos );
+ }
+ }