yet again more world load revision
[carveJwlIkooP6JGAAIwe30JlM.git] / save.c
1 #ifndef SAVE_C
2 #define SAVE_C
3
4 #include "save.h"
5 #include "vg/vg_msg.h"
6
7 static void savedata_write_thread( void *file ){
8 struct savedata *sav = file;
9 FILE *fp = fopen( sav->path, "wb" );
10 if( fp ){
11 fwrite( sav->buf, sav->len, 1, fp );
12 fclose( fp );
13 }
14 else {
15 vg_error( "Error writing savedata (%s)\n", sav->path );
16 }
17 }
18
19 static void savedata_read( struct savedata *sav ){
20 FILE *fp = fopen( sav->path, "rb" );
21 if( fp ){
22 sav->len = fread( sav->buf, 1, sizeof(sav->buf), fp );
23 fclose( fp );
24 }
25 else{
26 sav->len = 0;
27 vg_warn( "Error reading savedata (%s)\n", sav->path );
28 }
29 }
30
31 static void skaterift_write_addon_alias( vg_msg *msg, const char *key,
32 addon_alias *alias ){
33 if( alias->workshop_id )
34 vg_msg_wkvu64( msg, key, alias->workshop_id );
35 else
36 vg_msg_wkvstr( msg, key, alias->foldername );
37 }
38
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;
42
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;
46
47 if( reg )
48 skaterift_write_addon_alias( msg, key, &reg->alias );
49 }
50
51 static void skaterift_read_addon_alias( vg_msg *msg, const char *key,
52 enum addon_type type,
53 addon_alias *alias ){
54
55 alias->foldername[0] = '\0';
56 alias->workshop_id = 0;
57 alias->type = type;
58
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 );
63 }
64 else
65 alias->workshop_id = vg_msg_read_as_u64( &kv );
66 }
67
68 static void skaterift_write_main_savedata(void){
69 if( !vg_loader_availible() ) return;
70
71 vg_linear_clear( vg_async.buffer );
72 struct savedata *sav = vg_linear_alloc( vg_async.buffer,
73 vg_align8(sizeof(struct savedata)) );
74
75 strcpy( sav->path, "save.bkv" );
76
77 vg_msg kvsav = {0};
78 kvsav.buf = sav->buf;
79 kvsav.max = sizeof(sav->buf);
80
81 vg_msg_frame( &kvsav, "player" );
82 {
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 );
87 }
88 vg_msg_end_frame( &kvsav );
89
90 vg_msg_frame( &kvsav, "world" );
91 {
92 addon_reg *reg = world_static.addon_client;
93 if( reg && (world_static.active_instance > 0) ){
94 skaterift_write_addon_alias( &kvsav, "alias", &reg->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,
97 localplayer.rb.co );
98 }
99 }
100 vg_msg_end_frame( &kvsav );
101
102 sav->len = kvsav.len;
103 vg_loader_start( savedata_write_thread, sav );
104 }
105
106 static void skaterift_read_main_savedata( struct savedata *sav ){
107 strcpy( sav->path, "save.bkv" );
108 savedata_read( sav );
109 }
110
111 #endif /* SAVE_C */