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 );
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];
#include "highscores.h"
#include "steam.h"
#include "addon.h"
+#include "save.h"
/*
* Checks string equality but does a hash check first
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 )
}
}
+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 );
}
/*
localplayer.board_view_slot = selected_cache;
watch_cache_board( localplayer.board_view_slot );
global_skateshop_exit();
+ skaterift_write_savedata();
return;
}
}
--- /dev/null
+#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 */
#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 */
#include "menu.h"
#include "vehicle.h"
#include "pointcloud.h"
+#include "save.h"
/* unity build
* ----------------- */
#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];
VG_STATIC void vg_preload(void)
{
conf_init();
+ skaterift_read_savedata();
vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" );
vg_info(" 2021-2023 |\\ /| | / | | | | /| \n" );
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)
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)