7 static void savedata_write_thread( void *file
){
8 struct savedata
*sav
= file
;
9 FILE *fp
= fopen( sav
->path
, "wb" );
11 fwrite( sav
->buf
, sav
->len
, 1, fp
);
15 vg_error( "Error writing savedata (%s)\n", sav
->path
);
19 static void savedata_read( struct savedata
*sav
){
20 FILE *fp
= fopen( sav
->path
, "rb" );
22 sav
->len
= fread( sav
->buf
, 1, sizeof(sav
->buf
), fp
);
27 vg_error( "Error reading savedata (%s)\n", sav
->path
);
31 static void skaterift_write_addon_alias( vg_msg
*msg
, const char *key
,
33 if( alias
->workshop_id
)
34 vg_msg_wkvu64( msg
, key
, alias
->workshop_id
);
36 vg_msg_wkvstr( msg
, key
, alias
->foldername
);
39 static void skaterift_write_viewslot( vg_msg
*msg
, const char *key
,
40 enum addon_type type
, u16 cache_id
){
41 if( !cache_id
) return;
43 struct addon_cache
*cache
= &addon_system
.cache
[type
];
44 addon_cache_entry
*entry
= vg_pool_item( &cache
->pool
, cache_id
);
45 addon_reg
*reg
= entry
->reg_ptr
;
48 skaterift_write_addon_alias( msg
, key
, ®
->alias
);
51 static void skaterift_read_addon_alias( vg_msg
*msg
, const char *key
,
55 alias
->foldername
[0] = '\0';
56 alias
->workshop_id
= 0;
59 vg_msg_cmd kv
= vg_msg_seekkv( msg
, key
, 0 );
60 if( kv
.code
== k_vg_msg_kvstring
){
61 vg_strncpy( kv
.value
, alias
->foldername
, sizeof(alias
->foldername
),
62 k_strncpy_allow_cutoff
);
65 alias
->workshop_id
= vg_msg_read_as_u64( &kv
);
68 static void skaterift_write_main_savedata(void){
69 if( !vg_loader_availible() ) return;
71 vg_linear_clear( vg_async
.buffer
);
72 struct savedata
*sav
= vg_linear_alloc( vg_async
.buffer
,
73 vg_align8(sizeof(struct savedata
)) );
75 strcpy( sav
->path
, "save.bkv" );
79 kvsav
.max
= sizeof(sav
->buf
);
81 vg_msg_frame( &kvsav
, "player" );
83 skaterift_write_viewslot( &kvsav
, "board", k_addon_type_board
,
84 localplayer
.board_view_slot
);
85 skaterift_write_viewslot( &kvsav
, "playermodel", k_addon_type_player
,
86 localplayer
.playermodel_view_slot
);
88 vg_msg_end_frame( &kvsav
);
90 vg_msg_frame( &kvsav
, "world" );
92 addon_reg
*reg
= world_static
.addon_client
;
93 if( reg
&& (world_static
.active_instance
> 0) ){
94 skaterift_write_addon_alias( &kvsav
, "alias", ®
->alias
);
95 vg_msg_wkvu32( &kvsav
, "index", world_static
.active_instance
);
96 vg_msg_wkvnum( &kvsav
, "position", k_vg_msg_float
|k_vg_msg_32b
, 3,
100 vg_msg_end_frame( &kvsav
);
102 sav
->len
= kvsav
.len
;
103 vg_loader_start( savedata_write_thread
, sav
);
106 static void skaterift_read_main_savedata( struct savedata
*sav
){
107 strcpy( sav
->path
, "save.bkv" );
108 savedata_read( sav
);