+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 );
+ }
+ }
+}
+
+VG_STATIC void vg_load(void){
+ vg_console_reg_cmd( "changeworld", skaterift_change_world_command, NULL );
+
+ vg_loader_step( render_init, NULL );
+ vg_loader_step( menu_init, NULL );
+ vg_loader_step( pointcloud_init, NULL );
+ vg_loader_step( world_init, NULL );
+ vg_loader_step( vehicle_init, NULL );
+ vg_loader_step( font3d_init, NULL );
+ vg_loader_step( gui_init, NULL );
+
+ vg_loader_step( player_init, NULL );
+ vg_loader_step( player_ragdoll_init, NULL );
+
+ /* content stuff */
+ vg_loader_step( addon_system_init, NULL );
+ vg_loader_step( workshop_init, NULL );
+ vg_loader_step( skateshop_init, NULL );
+
+ /* ----------------- */
+ vg_loader_step( load_playermodels, NULL );
+
+ /* player setup */
+ u32 bytes = (1024*1024*1)/2;
+ skaterift.replay.data = vg_linear_alloc( vg_mem.rtmemory, bytes );
+ skaterift.replay.size = bytes;
+ replay_clear( &skaterift.replay );
+
+ player__create( &localplayer );
+ player_avatar_load( &localplayer_avatar, "models/ch_none.mdl" );
+ player__use_avatar( &localplayer, &localplayer_avatar );
+ player_model_load( &localplayer.fallback_model, "models/ch_none.mdl" );
+ player__bind( &localplayer );
+
+ /* --------------------- */