13 static void skaterift_write_savedata_thread(void *_
){
14 FILE *fp
= fopen( "save.bkv", "wb" );
16 fwrite( savedata
.buf
, savedata
.len
, 1, fp
);
22 static void skaterift_write_viewslot( vg_msg
*msg
, const char *key
,
23 enum addon_type type
, u16 cache_id
){
24 if( !cache_id
) return;
26 struct addon_cache
*cache
= &addon_system
.cache
[type
];
27 addon_cache_entry
*entry
= vg_pool_item( &cache
->pool
, cache_id
);
28 addon_reg
*reg
= entry
->reg_ptr
;
31 if( reg
->alias
.workshop_id
)
32 vg_msg_wkvu64( msg
, key
, reg
->alias
.workshop_id
);
34 vg_msg_wkvstr( msg
, key
, reg
->alias
.foldername
);
38 static void skaterift_read_viewslot( vg_msg
*msg
, const char *key
,
39 enum addon_type type
, addon_alias
*alias
){
41 alias
->foldername
[0] = '\0';
42 alias
->workshop_id
= 0;
45 vg_msg_cmd kv
= vg_msg_seekkv( msg
, key
, 0 );
46 if( kv
.code
== k_vg_msg_kvstring
){
47 vg_strncpy( kv
.value
, alias
->foldername
, sizeof(alias
->foldername
),
48 k_strncpy_allow_cutoff
);
51 alias
->workshop_id
= vg_msg_read_as_u64( &kv
);
54 static void skaterift_write_savedata(void){
55 if( skaterift
.async_op
!= k_async_op_none
) return;
57 skaterift_begin_op( k_async_op_write_savedata
);
60 sav
.buf
= savedata
.buf
;
61 sav
.max
= sizeof(savedata
.buf
);
63 vg_msg_frame( &sav
, "player" );
65 skaterift_write_viewslot( &sav
, "board", k_addon_type_board
,
66 localplayer
.board_view_slot
);
67 skaterift_write_viewslot( &sav
, "playermodel", k_addon_type_player
,
68 localplayer
.playermodel_view_slot
);
70 vg_msg_end_frame( &sav
);
71 savedata
.len
= sav
.len
;
72 vg_loader_start( skaterift_write_savedata_thread
, NULL
);
75 static void skaterift_read_savedata(void){
76 FILE *fp
= fopen( "save.bkv", "rb" );
78 savedata
.len
= fread( savedata
.buf
, 1, sizeof(savedata
.buf
), fp
);