10 static void savedata_file_write( savedata_file
*file
){
11 savedata_file
*sav
= file
;
12 FILE *fp
= fopen( sav
->path
, "wb" );
14 fwrite( sav
->buf
, sav
->len
, 1, fp
);
16 vg_success( "savedata written to '%s'\n", sav
->path
);
19 vg_error( "Error writing savedata (%s)\n", sav
->path
);
23 static void savedata_group_write( savedata_group
*group
){
24 for( u32 i
=0; i
<group
->file_count
; i
++ ){
25 savedata_file_write( &group
->files
[i
] );
29 static void savedata_file_read( savedata_file
*file
){
30 FILE *fp
= fopen( file
->path
, "rb" );
32 file
->len
= fread( file
->buf
, 1, sizeof(file
->buf
), fp
);
37 vg_warn( "Error reading savedata (%s)\n", file
->path
);
41 static void skaterift_write_addon_alias( vg_msg
*msg
, const char *key
,
43 if( alias
->workshop_id
)
44 vg_msg_wkvu64( msg
, key
, alias
->workshop_id
);
46 vg_msg_wkvstr( msg
, key
, alias
->foldername
);
49 static void skaterift_write_viewslot( vg_msg
*msg
, const char *key
,
50 enum addon_type type
, u16 cache_id
){
51 if( !cache_id
) return;
53 struct addon_cache
*cache
= &addon_system
.cache
[type
];
54 addon_cache_entry
*entry
= vg_pool_item( &cache
->pool
, cache_id
);
55 addon_reg
*reg
= entry
->reg_ptr
;
58 skaterift_write_addon_alias( msg
, key
, ®
->alias
);
61 static void skaterift_read_addon_alias( vg_msg
*msg
, const char *key
,
64 alias
->foldername
[0] = '\0';
65 alias
->workshop_id
= 0;
68 vg_msg_cmd kv
= vg_msg_seekkv( msg
, key
, 0 );
69 if( kv
.code
== k_vg_msg_kvstring
){
70 vg_strncpy( kv
.value
, alias
->foldername
, sizeof(alias
->foldername
),
71 k_strncpy_allow_cutoff
);
74 alias
->workshop_id
= vg_msg_read_as_u64( &kv
);
77 static void skaterift_populate_world_savedata( savedata_file
*file
,
78 enum world_purpose which
){
81 addon_reg
*reg
= NULL
;
82 if( which
== k_world_purpose_hub
) reg
= world_static
.addon_hub
;
83 else reg
= world_static
.addon_client
;
86 vg_error( "Tried to save unspecified world (reg was null)\n" );
90 skaterift_world_get_save_path( which
, file
->path
);
94 sav
.max
= sizeof(file
->buf
);
96 if( which
== k_world_purpose_hub
){
97 if( world_static
.instances
[0].status
== k_world_status_loaded
)
98 world_entity_serialize( &world_static
.instances
[0], &sav
);
101 for( u32 i
=1; i
<vg_list_size(world_static
.instances
); i
++ ){
102 world_instance
*instance
= &world_static
.instances
[i
];
103 if( instance
->status
== k_world_status_loaded
){
104 world_entity_serialize( instance
, &sav
);
112 static void skaterift_populate_main_savedata( savedata_file
*file
){
113 strcpy( file
->path
, str_skaterift_main_save
);
117 sav
.max
= sizeof(file
->buf
);
119 vg_msg_frame( &sav
, "player" );
121 skaterift_write_viewslot( &sav
, "board", k_addon_type_board
,
122 localplayer
.board_view_slot
);
123 skaterift_write_viewslot( &sav
, "playermodel", k_addon_type_player
,
124 localplayer
.playermodel_view_slot
);
126 vg_msg_end_frame( &sav
);
128 vg_msg_frame( &sav
, "world" );
130 addon_reg
*reg
= world_static
.addon_client
;
131 if( reg
&& (world_static
.active_instance
> 0) ){
132 skaterift_write_addon_alias( &sav
, "alias", ®
->alias
);
134 vg_msg_wkvu32( &sav
, "index", world_static
.active_instance
);
135 vg_msg_wkvnum( &sav
, "position", k_vg_msg_float
|k_vg_msg_32b
, 3,
138 vg_msg_end_frame( &sav
);
143 static int skaterift_autosave( int async
){
145 if( !vg_loader_availible() ) return 0;
148 if( world_static
.addon_client
)
151 vg_linear_clear( vg_async
.buffer
);
152 u32 size
= sizeof(savedata_group
) + sizeof(savedata_file
) * save_files
;
154 savedata_group
*group
;
156 size
= vg_align8( size
);
157 group
= vg_linear_alloc( vg_async
.buffer
, size
);
160 group
= alloca( size
);
162 group
->file_count
= save_files
;
163 skaterift_populate_main_savedata( &group
->files
[0] );
164 skaterift_populate_world_savedata( &group
->files
[1], k_world_purpose_hub
);
166 if( world_static
.addon_client
)
167 skaterift_populate_world_savedata( &group
->files
[2],
168 k_world_purpose_client
);
171 vg_loader_start( (void *)savedata_group_write
, group
);
173 savedata_group_write( group
);
178 static void skaterift_autosave_synchronous(void){
179 skaterift_autosave(0);