savedata start
authorhgn <hgodden00@gmail.com>
Sun, 11 Jun 2023 20:10:27 +0000 (21:10 +0100)
committerhgn <hgodden00@gmail.com>
Sun, 11 Jun 2023 20:10:27 +0000 (21:10 +0100)
addon.c
ent_skateshop.c
save.c [new file with mode: 0644]
save.h
skaterift.c

diff --git a/addon.c b/addon.c
index fde9f9d06750dfc0b86311b5c1b703c0dd08e05d..b599c304a04e2c91f3965460774db4ba22bd6864 100644 (file)
--- a/addon.c
+++ b/addon.c
@@ -42,6 +42,34 @@ static u32 get_index_from_addon( enum workshop_file_type type, addon_reg *a ){
    return 0xffffffff;
 }
 
+static u32 addon_match( enum workshop_file_type type,
+                        u64 workshop_id, const char *foldername ){
+   u32 foldername_djb2 = vg_strdjb2( foldername );
+
+   u32 count = 0;
+   for( u32 i=0; count<addon_system.registry_type_counts[type]; i++ ){
+      addon_reg *reg = &addon_system.registry[i];
+      if( reg->type == type ){
+         
+         if( workshop_id ){
+            if( workshop_id == reg->workshop_id )
+               return count;
+         }
+         else{
+            if( reg->foldername_hash == foldername_djb2 ){
+               if( !strcmp( reg->foldername, foldername ) ){
+                  return count;
+               }
+            }
+         }
+
+         count ++;
+      }
+   }
+
+   return 0xffffffff;
+}
+
 static void addon_system_init( void ){
    u32 reg_size   = sizeof(addon_reg)*ADDON_MOUNTED_MAX;
    addon_system.registry = vg_linear_alloc( vg_mem.rtmemory, reg_size );
@@ -189,7 +217,7 @@ VG_STATIC addon_reg *addon_mount_local_addon( const char *folder,
    vg_strnull( &folder_path, folder_path_buf, 4096 );
    vg_strcat( &folder_path, folder );
 
-   const char *folder_name = vg_strch( &folder_path, '/' );
+   const char *folder_name = vg_strch( &folder_path, '/' )+1;
    u32 folder_hash = vg_strdjb2(folder_name);
    for( u32 i=0; i<addon_system.registry_count; i++ ){
       addon_reg *reg = &addon_system.registry[i];
index 99f9a7079d0ce6b6ead4021729f24f72a2d394ca..91947fbe2893dc3ecf55741270ec0ff5a366e902 100644 (file)
@@ -14,6 +14,7 @@
 #include "highscores.h"
 #include "steam.h"
 #include "addon.h"
+#include "save.h"
 
 /*
  * Checks string equality but does a hash check first
@@ -303,14 +304,12 @@ VG_STATIC struct cache_board *skateshop_selected_cache_if_loaded(void)
 VG_STATIC void pointcloud_async_end(void *_, u32 __)
 {
    pointcloud_animate( k_pointcloud_anim_opening );
-   skaterift_end_op();
 }
 
 VG_STATIC void pointcloud_clear_async(void *_, u32 __)
 {
    pointcloud.count = 0;
    pointcloud_animate( k_pointcloud_anim_opening );
-   skaterift_end_op();
 }
 
 VG_STATIC void skateshop_preview_loader_thread( void *_data )
@@ -351,10 +350,15 @@ VG_STATIC void skateshop_preview_loader_thread( void *_data )
    }
 }
 
+VG_STATIC void skateshop_preview_loader_thread_and_end( void *_data ){
+   skateshop_preview_loader_thread( _data );
+   skaterift_end_op();
+}
+
 VG_STATIC void skateshop_load_world_preview( addon_reg *reg )
 {
    skaterift_begin_op( k_async_op_world_load_preview );
-   vg_loader_start( skateshop_preview_loader_thread, reg );
+   vg_loader_start( skateshop_preview_loader_thread_and_end, reg );
 }
 
 /*
@@ -453,6 +457,7 @@ VG_STATIC void global_skateshop_preupdate(void)
          localplayer.board_view_slot = selected_cache;
          watch_cache_board( localplayer.board_view_slot );
          global_skateshop_exit();
+         skaterift_write_savedata();
          return;
       }
    }
diff --git a/save.c b/save.c
new file mode 100644 (file)
index 0000000..76cfb3c
--- /dev/null
+++ b/save.c
@@ -0,0 +1,45 @@
+#ifndef SAVE_C
+#define SAVE_C
+
+struct {
+   u8  buf[ 1024 ];
+   u32 len;
+}
+static savedata;
+
+static void skaterift_write_savedata(void){
+   vg_msg sav = {0};
+   sav.buf = savedata.buf;
+   sav.max = sizeof(savedata.buf);
+
+   vg_msg_frame( &sav, "player" );
+
+   if( localplayer.board_view_slot ){
+      struct cache_board *cache_ptr = localplayer.board_view_slot;
+      if( cache_ptr->reg_ptr ){
+         if( cache_ptr->reg_ptr->workshop_id ) 
+            vg_msg_wkvu64( &sav, "board", cache_ptr->reg_ptr->workshop_id );
+         else
+            vg_msg_wkvstr( &sav, "board", cache_ptr->reg_ptr->foldername );
+      }
+   }
+
+   vg_msg_end_frame( &sav );
+   savedata.len = sav.len;
+
+   FILE *fp = fopen( "save.bkv", "wb" );
+   if( fp ){
+      fwrite( savedata.buf, sav.len, 1, fp );
+      fclose( fp );
+   }
+}
+
+static void skaterift_read_savedata(void){
+   FILE *fp = fopen( "save.bkv", "rb" );
+   if( fp ){
+      savedata.len = fread( savedata.buf, 1, sizeof(savedata.buf), fp );
+      fclose( fp );
+   }
+}
+
+#endif /* SAVE_C */
diff --git a/save.h b/save.h
index 945b7298bcd40e7c63b9dfa208a4ffea26ca5c0d..bffbcd59029766901bcb9a97ddf3526b11bf91d2 100644 (file)
--- a/save.h
+++ b/save.h
@@ -1,6 +1,9 @@
 #ifndef SAVE_H
 #define SAVE_H
 
+#include "ent_skateshop.h"
 
+static void skaterift_write_savedata(void);
+static void skaterift_read_savedata(void);
 
 #endif /* SAVE_H */
index 5c24b79e12681a1811284109778412f2e217bc69..e510a1f6a7a5167425f5e81e4c6f80df43fb636f 100644 (file)
@@ -35,6 +35,7 @@
 #include "menu.h"
 #include "vehicle.h"
 #include "pointcloud.h"
+#include "save.h"
 
 /*    unity build
  * ----------------- */
@@ -46,6 +47,7 @@
 #include "workshop.c"
 #include "addon.c"
 #include "highscores.c"
+#include "save.c"
 
 static struct player_avatar localplayer_avatar;
 static struct player_model  localplayer_models[3];
@@ -72,6 +74,7 @@ VG_STATIC void vg_launch_opt(void)
 VG_STATIC void vg_preload(void)
 {
    conf_init();
+   skaterift_read_savedata();
 
 vg_info(" Copyright  .        . .       -----, ,----- ,---.   .---.  \n" );
 vg_info(" 2021-2023  |\\      /| |           /  |      |    | |    /| \n" );
@@ -110,12 +113,10 @@ void temp_update_playermodel(void){
    player__use_model( &localplayer, &localplayer_models[k_playermdl_id] );
 }
 
-VG_STATIC void async_skaterift_complete( void *payload, u32 size )
+VG_STATIC void async_skaterift_player_start( void *payload, u32 size )
 {
    localplayer.viewable_world = world_current_instance();
    localplayer_cmd_respawn( 1, (const char *[]){ "start" } );
-
-   skaterift_end_op();
 }
 
 VG_STATIC void vg_load(void)
@@ -206,7 +207,47 @@ VG_STATIC void vg_load(void)
    temp_update_playermodel();
 
        //vg_mem_log( vg_mem.rtmemory, 0, "Root" );
-   vg_async_call( async_skaterift_complete, NULL, 0 );
+   
+   vg_async_call( async_skaterift_player_start, NULL, 0 );
+
+   skaterift_shift_op( k_async_op_board_scan );
+   addon_mount_content_folder( k_workshop_file_type_board, "boards", ".mdl" );
+   addon_mount_workshop_items();
+   vg_async_call( async_addon_reg_update, NULL, 0 );
+   vg_async_stall();
+
+   /* and now */
+
+   vg_msg sav = {0};
+   sav.buf = savedata.buf;
+   sav.len = savedata.len;
+   sav.max = sizeof(savedata.buf);
+
+   u64 query_workshop_id = 0;
+   const char *query_local_folder = "";
+
+   if( vg_msg_seekframe(&sav, "player",0) ){
+      vg_msg_print( &sav );
+      vg_msg_cmd board = vg_msg_seekkv( &sav, "board", 0 );
+      if( board.code == k_vg_msg_kvstring )
+         query_local_folder = board.value;
+      else 
+         query_workshop_id = vg_msg_read_as_u64( &board );
+   }
+   else{
+      vg_error( "%u\n", sav.error );
+   }
+
+   vg_info( "search: %lu '%s'\n", query_workshop_id, query_local_folder );
+
+   u32 reg_id = addon_match( k_workshop_file_type_board,
+                             query_workshop_id, query_local_folder );
+   if( reg_id != 0xffffffff ){
+      localplayer.board_view_slot = skateshop_cache_fetch_board( reg_id );
+      watch_cache_board( localplayer.board_view_slot );
+   }
+
+   board_processview_thread(NULL); /* END_OP!! */
 }
 
 VG_STATIC void draw_origin_axis(void)