X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_load.c;h=bbf5c91510c5a7d0b488b360f30b4479686b807f;hb=9eb3de757a997becb8406417a4bf613f4cb04900;hp=493b89d9cb759147c931ce75b4881a631bc5584f;hpb=342fcbf6fda017bdd38d56ce0fa7c9e59e589f3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_load.c b/world_load.c index 493b89d..bbf5c91 100644 --- a/world_load.c +++ b/world_load.c @@ -4,6 +4,7 @@ #include "world_load.h" #include "world_routes.h" #include "world_gate.h" +#include "ent_skateshop.h" /* * load the .mdl file located in path (relative to exe), it will load into the @@ -57,6 +58,7 @@ VG_STATIC void world_load_mdl( const char *path ) mdl_load_array( meta, &world->ent_marker, "ent_marker", heap ); mdl_load_array( meta, &world->ent_skateshop, "ent_skateshop", heap ); mdl_load_array( meta, &world->ent_swspreview,"ent_swspreview", heap ); + mdl_load_array( meta, &world->ent_ccmd, "ent_ccmd", heap ); mdl_array_ptr infos; mdl_load_array( meta, &infos, "ent_worldinfo", vg_mem.scratch ); @@ -89,62 +91,55 @@ VG_STATIC void world_load_mdl( const char *path ) world_gen_routes_generate(); world_gen_compute_light_indices(); vg_async_call( async_world_postprocess_render, NULL, 0 ); + vg_async_stall(); mdl_close( meta ); world->status = k_world_status_loaded; } -/* - * op: k_async_op_world_loading - * k_async_op_world_preloading - * ----------------------------------------------------------------------------- - */ - -static void async_skaterift_world_loaded( void *payload, u32 size ) -{ - skaterift_end_op(); +static void skaterift_world_change_done( void *payload, u32 size ){ + world_loader.state = k_world_loader_none; } /* * Does a complete world switch using the remaining free slots */ -static void skaterift_world_changer_thread( void *data ) -{ - if( world_loader.location == k_world_load_type_workshop ){ - vg_fatal_error( "Unimplemented\n" ); - } - +static void skaterift_world_changer_thread( void *_ ){ char path_buf[4096]; vg_str path; vg_strnull( &path, path_buf, 4096 ); - vg_strcat( &path, "maps/" ); + + if( world_loader.reg ){ + addon_get_content_folder( world_loader.reg, &path ); + } + else { + vg_strcat( &path, "maps/" ); + vg_strcat( &path, world_loader.override_name ); + } vg_str folder = path; - vg_strcat( &folder, world_loader.name ); if( !vg_strgood( &folder ) ) { vg_error( "Load target too long\n" ); - vg_async_call( workshop_async_any_complete, NULL, 0 ); return; } char worlds[3][4096]; u32 i=0; - DIR *dir = opendir( folder.buffer ); - if( !dir ){ + vg_dir dir; + if( !vg_dir_open(&dir, folder.buffer) ){ vg_error( "opendir('%s') failed\n", folder.buffer ); - vg_async_call( async_skaterift_world_loaded, NULL, 0 ); return; } - struct dirent *entry; - while( (entry = readdir(dir)) ){ - if( entry->d_type == DT_REG ){ - if( entry->d_name[0] == '.' ) continue; + while( vg_dir_next_entry(&dir) ){ + if( vg_dir_entry_type(&dir) == k_vg_entry_type_file ){ + const char *d_name = vg_dir_entry_name(&dir); + if( d_name[0] == '.' ) continue; vg_str file = folder; vg_strcat( &file, "/" ); - vg_strcat( &file, entry->d_name ); + vg_strcat( &file, d_name ); if( !vg_strgood( &file ) ) continue; char *ext = vg_strch( &file, '.' ); @@ -159,7 +154,7 @@ static void skaterift_world_changer_thread( void *data ) strcpy( worlds[i++], file.buffer ); } } - closedir(dir); + vg_dir_close(&dir); if( i == 0 ){ vg_warn( "There are no .mdl files in the map folder.\n" ); @@ -189,13 +184,12 @@ static void skaterift_world_changer_thread( void *data ) } } - vg_async_call( async_skaterift_world_loaded, NULL, 0 ); + vg_async_call( skaterift_world_change_done, NULL, 0 ); } /* holding pattern before we can start loading the new world, since we might be * waiting for audio to stop */ -static void skaterift_change_world_preupdate(void) -{ +static void skaterift_change_world_preupdate(void){ for( u32 i=1; ialias.foldername, + world_loader.reg->alias.workshop_id ); + } + else{ + vg_info( "switching to %s(local)\n", world_loader.override_name ); + } if( world_static.active_world != 0 ){ vg_error( "Cannot change worlds while in non-root world\n" ); } else{ - skaterift_begin_op( k_async_op_world_preloading ); + world_loader.state = k_world_loader_preload; - vg_linear_clear( vg_mem.scratch ); - vg_strncpy( world_name, world_loader.name, - vg_list_size(world_loader.name), k_strncpy_overflow_fatal ); - + vg_linear_clear( vg_mem.scratch ); /* ?? */ vg_info( "unloading old worlds\n" ); world_unlink_nonlocal( &world_static.worlds[0] ); @@ -246,8 +243,13 @@ static void skaterift_change_world( const char *world_name ) /* console command for the above function */ static int skaterift_change_world_command( int argc, const char *argv[] ) { - if( argc == 1 ) - skaterift_change_world( argv[0] ); + if( argc == 1 ){ + world_loader.reg = NULL; + vg_strncpy( argv[0], world_loader.override_name, + vg_list_size( world_loader.override_name ), + k_strncpy_always_add_null ); + skaterift_change_world_start(); + } return 0; }