{
addon_id world_to_load = _world.default_hub_addon;
- vg_kvs *kvs = _savefile_kvs( skaterift.main_save_handle );
+ vg_kvs *kvs = _savefile_kvs( skaterift.main_save_handle, SAVE_READ );
u32 player_block = vg_kv_find( kvs, 0, "player" );
if( player_block )
{
void serialize_atoms( enum e_atom_list list, vg_kvs *savedata, u32 root )
{
- // FIXME
-#if 0
for( u32 i=0; i<_atom.lists[list].count; i ++ )
{
atom *a = &_atom.lists[list].atoms[i];
- vg_kv_append_vu32( savedata, root, a->alias, &a->status, 1 );
+ vg_kv_append_vi32( savedata, root, a->alias, &a->status, 1 );
}
-#endif
}
static atom *_atom_internal( enum e_atom_list list, const char *alias )
return unused_save;
}
-VG_API void savedata_release_handle( u16 save_handle )
+VG_API void _savedata_release_handle( u16 save_handle )
{
VG_ASSERT( save_handle );
struct savefile *save = &_savedata.files[save_handle-1];
return _savedata.files[ save_handle-1 ].state;
}
-VG_API vg_kvs *_savefile_kvs( u16 save_handle )
+VG_API vg_kvs *_savefile_kvs( u16 save_handle, bool reset )
{
VG_ASSERT( save_handle );
struct savefile *save = &_savedata.files[save_handle-1];
VG_ASSERT( save->state == k_savefile_ready );
+ if( reset )
+ {
+ vg_stack_clear( &save->stack );
+ vg_kvs_init( &save->kvs, &save->stack );
+ }
return &save->kvs;
}
k_savefile_ready
};
+#define SAVE_RESET 1
+#define SAVE_READ 0
+
VG_API void _savedata_init(void);
VG_API void _skaterift_autosave_post_update( void );
VG_API u16 _savedata_handle( addon_id addon );
+VG_API void _savedata_release_handle( u16 save_handle );
VG_API enum savefile_state _savefile_state( u16 save_handle );
-VG_API vg_kvs *_savefile_kvs( u16 save_handle );
+VG_API vg_kvs *_savefile_kvs( u16 save_handle, bool reset );
#endif
if( _world.loader_state == k_world_loader_saving_current )
{
- VG_ASSERT(0);
- //FIXME FIXME FIMXE
- //skaterift_write_all_savedata(1);
+ vg_kvs *kvs = _savefile_kvs( _world.save_handle, SAVE_RESET );
+ u32 player_block = vg_kv_append( kvs, 0, "player", VG_KV_APPEND_FRAME );
+ {
+ vg_kv_append_vf32( kvs, player_block, "co", localplayer.rb.co, 3 );
+ }
+ u32 atom_block = vg_kv_append( kvs, 0, "atoms", VG_KV_APPEND_FRAME );
+ {
+ serialize_atoms( k_atom_list_world, kvs, atom_block );
+ }
+ world_entity_serialize( &_world.main, kvs );
+ _savedata_write( _world.save_handle );
+ _savedata_release_handle( _world.save_handle );
+ _world.save_handle = 0;
+
_world.loader_state = k_world_loader_unloading_current;
_vg_loader_set_user_information( "Unloading current world" );
}
{
_world.loader_state = k_world_loader_done;
- vg_kvs *kvs = _savefile_kvs( _world.save_handle );
+ vg_kvs *kvs = _savefile_kvs( _world.save_handle, SAVE_READ );
world_entity_start( &_world.main, kvs );
/* start player in the world */
player__clear_world_dependent_variables();
relink_all_remote_player_worlds();
_ent_npc_reset();
+
+ _vg_loader_increment( +1 );
_vg_loader_set_user_information( "Saving current world" );
}
else
}
for( u32 i=0; i<world->nonlocal_gate_count; i ++ )
- vg_tex_delete( &world->nonlocal_gates_cubemaps[i] );
+ if( world->nonlocal_gates_cubemaps[i].flags & VG_TEX_COMPLETE )
+ vg_tex_delete( &world->nonlocal_gates_cubemaps[i] );
}
/*