workshop selecter
authorhgn <hgodden00@gmail.com>
Wed, 22 Nov 2023 07:13:57 +0000 (07:13 +0000)
committerhgn <hgodden00@gmail.com>
Wed, 22 Nov 2023 07:13:57 +0000 (07:13 +0000)
addon.c
addon.h
ent_skateshop.c
maps_src/dev_hub/main.mdl
maps_src/mp_mtzero/main.mdl
maps_src/mp_spawn/main.mdl
skaterift.c
world_load.c
world_render.c

diff --git a/addon.c b/addon.c
index 4d1e90342c0f35b6fb87081af3730c6af3fe2f4d..0b342ce99ad3f063dea66034423edde0877a2b10 100644 (file)
--- a/addon.c
+++ b/addon.c
@@ -7,16 +7,40 @@
 #include "steam.h"
 #include "workshop.h"
 
-static u32 addon_count( enum addon_type type ){
-   return addon_system.registry_type_counts[ type ];
+static u32 addon_count( enum addon_type type, u32 ignoreflags ){
+   if( ignoreflags ){
+      u32 typecount = 0, count = 0;
+      for( u32 i=0; typecount<addon_count( type, 0 ); i++ ){
+         addon_reg *reg = &addon_system.registry[i];
+         if( reg->alias.type == type ){
+            typecount ++;
+
+            if( reg->flags & ignoreflags )
+               continue;
+            
+            count ++;
+         }
+      }
+
+      return count;
+   }
+   else
+      return addon_system.registry_type_counts[ type ];
 }
 
+
 /* these kind of suck, oh well. */
-static addon_reg *get_addon_from_index(enum addon_type type, u32 index){
-   u32 count = 0;
-   for( u32 i=0; count<addon_count(type); i++ ){
+static addon_reg *get_addon_from_index( enum addon_type type, u32 index, 
+                                        u32 ignoreflags ){
+   u32 typecount = 0, count = 0;
+   for( u32 i=0; typecount<addon_count(type,0); i++ ){
       addon_reg *reg = &addon_system.registry[i];
       if( reg->alias.type == type ){
+         typecount ++;
+
+         if( reg->flags & ignoreflags )
+            continue;
+
          if( index == count )
             return reg;
 
@@ -230,6 +254,7 @@ static addon_reg *addon_alloc_reg( PublishedFileId_t workshop_id,
    }
 
    addon_reg *reg = &addon_system.registry[ addon_system.registry_count ];
+   reg->flags = 0;
    reg->metadata_len = 0;
    reg->cache_id = 0;
    reg->state = k_addon_state_indexed;
@@ -535,8 +560,8 @@ static int addon_get_content_folder( addon_reg *reg, vg_str *folder ){
 static u16 addon_cache_fetch( enum addon_type type, u32 reg_index ){
    addon_reg *reg = NULL;
 
-   if( reg_index < addon_count( type ) ){
-      reg = get_addon_from_index( type, reg_index );
+   if( reg_index < addon_count( type, 0 ) ){
+      reg = get_addon_from_index( type, reg_index, 0 );
       if( reg->cache_id ) 
          return reg->cache_id;
    }
@@ -554,8 +579,8 @@ static u16 addon_cache_alloc( enum addon_type type, u32 reg_index ){
    struct addon_cache_entry *new_entry = vg_pool_item( &cache->pool, new_id );
 
    addon_reg *reg = NULL;
-   if( reg_index < addon_count( type ) )
-      reg = get_addon_from_index( type, reg_index );
+   if( reg_index < addon_count( type, 0 ) )
+      reg = get_addon_from_index( type, reg_index, 0 );
 
    if( new_entry ){
       if( new_entry->reg_ptr )
@@ -683,7 +708,7 @@ static void addon_cache_load_loop(void){
             vg_info( "process cache load request (%u#%u, reg:%u)\n",
                         type, id, entry->reg_index );
 
-            if( entry->reg_index >= addon_count(type) ){
+            if( entry->reg_index >= addon_count(type,0) ){
                /* should maybe have a different value for this case */
                entry->state = k_addon_cache_state_none;
                SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
@@ -693,7 +718,7 @@ static void addon_cache_load_loop(void){
             SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
 
             /* continue with the request */
-            addon_reg *reg = get_addon_from_index( type, entry->reg_index );
+            addon_reg *reg = get_addon_from_index( type, entry->reg_index, 0 );
             entry->reg_ptr = reg;
 
             vg_str folder;
diff --git a/addon.h b/addon.h
index 8d2409a3f1a14fafd0b961366ca848e295f21837..cae83f6b2d6e19e3ebb5d8e5bccc9b8bae8343bb 100644 (file)
--- a/addon.h
+++ b/addon.h
@@ -19,12 +19,15 @@ struct addon_alias {
    char foldername[ ADDON_FOLDERNAME_MAX ];
 };
 
+#define ADDON_REG_HIDDEN 0x1
+
 struct {
    struct addon_reg{
       addon_alias alias;
       u32 foldername_hash;
       u8 metadata[512];  /* vg_msg buffer */
       u32 metadata_len;
+      u32 flags;
 
       u16 cache_id;
 
@@ -67,8 +70,9 @@ struct {
 static addon_system;
 
 static void addon_system_init( void );
-static u32 addon_count( enum addon_type type );
-static addon_reg *get_addon_from_index( enum addon_type type, u32 index );
+static u32 addon_count( enum addon_type type, u32 ignoreflags );
+static addon_reg *get_addon_from_index( enum addon_type type, u32 index, 
+                                        u32 ignoreflags );
 static u32 get_index_from_addon( enum addon_type type, addon_reg *a );
 static int addon_get_content_folder( addon_reg *reg, vg_str *folder );
 
index 427347d430379a153f2b1206f396a804d5744cb4..962edf4b28f092a6562bb087f23f2569fcc6c6cb 100644 (file)
@@ -113,9 +113,10 @@ static void skateshop_init(void){
 }
 
 static u16 skateshop_selected_cache_id(void){
-   if( addon_count(k_addon_type_board) ){
-      addon_reg *reg = get_addon_from_index(k_addon_type_board,
-                                            global_skateshop.selected_board_id);
+   if( addon_count(k_addon_type_board, ADDON_REG_HIDDEN) ){
+      addon_reg *reg = get_addon_from_index( 
+            k_addon_type_board, global_skateshop.selected_board_id,
+            ADDON_REG_HIDDEN );
       return reg->cache_id;
    }
    else return 0;
@@ -176,10 +177,9 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
          }
       }
 
+      u32 valid_count = addon_count( k_addon_type_board, 0 );
       if( button_down( k_srbind_mright ) ){
-         if( global_skateshop.selected_board_id+1 < 
-               addon_count(k_addon_type_board) )
-         {
+         if( global_skateshop.selected_board_id+1 < valid_count ){
             global_skateshop.selected_board_id ++;
          }
       }
@@ -188,7 +188,6 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
 
       if( opage != npage ){
          skateshop_update_viewpage();
-         //skateshop_op_processview();
       }
       else if( cache_id && button_down( k_srbind_maccept )){
          vg_info( "chose board from skateshop (%u)\n", 
@@ -209,22 +208,21 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
       if( !vg_loader_availible() ) return;
 
       int changed = 0;
+      u32 valid_count = addon_count( k_addon_type_player, ADDON_REG_HIDDEN );
 
       if( button_down( k_srbind_mleft ) ){
          if( global_skateshop.selected_player_id > 0 ){
             global_skateshop.selected_player_id --;
          }
          else{
-            global_skateshop.selected_player_id = 
-               addon_count(k_addon_type_player) -1;
+            global_skateshop.selected_player_id = valid_count-1;
          }
 
          changed = 1;
       }
 
       if( button_down( k_srbind_mright ) ){
-         if( global_skateshop.selected_player_id+1 < 
-               addon_count(k_addon_type_player) ){
+         if( global_skateshop.selected_player_id+1 < valid_count ){
             global_skateshop.selected_player_id ++;
          }
          else{
@@ -235,8 +233,14 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
       }
 
       if( changed ){
-         player__use_model( global_skateshop.selected_player_id );
-         //skateshop_op_processview();
+         addon_reg *addon = get_addon_from_index( 
+               k_addon_type_player, global_skateshop.selected_player_id,
+               ADDON_REG_HIDDEN );
+
+         u32 real_id = get_index_from_addon( 
+               k_addon_type_player, addon );
+
+         player__use_model( real_id );
       }
 
       if( button_down( k_srbind_maccept ) ){
@@ -249,10 +253,12 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
       int browseable = 0,
           loadable = 0;
 
-      if( addon_count(k_addon_type_world) && vg_loader_availible() )
+      u32 valid_count = addon_count( k_addon_type_world, ADDON_REG_HIDDEN );
+
+      if( valid_count && vg_loader_availible() )
          browseable = 1;
 
-      if( vg_loader_availible() && global_skateshop.selected_world_id > 0 )
+      if( vg_loader_availible() )
          loadable = 1;
 
       global_skateshop.helper_browse->greyed = !browseable;
@@ -269,54 +275,21 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){
          }
 
          if( button_down( k_srbind_mright ) ){
-            if( global_skateshop.selected_world_id+1 < 
-                     addon_count(k_addon_type_world) )
-            {
+            if( global_skateshop.selected_world_id+1 < valid_count ){
                global_skateshop.selected_world_id ++;
                change = 1;
             }
          }
       }
-      
-#if 0
-      if( change && pointcloud_idle() ){
-         pointcloud_animate( k_pointcloud_anim_hiding );
-      }
 
-      if( vg_loader_availible() ){
-         addon_reg *reg = get_addon_from_index( k_addon_type_world,
-            global_skateshop.selected_world_id );
-
-         /* automatically load in clouds */
-         if( loadable && button_down( k_srbind_maccept ) ){
-            vg_info( "Select rift (%u)\n", 
-                      global_skateshop.selected_world_id );
-            skaterift_change_world_start( reg );
-            return;
-         }
-         else{
-            if( pointcloud.anim == k_pointcloud_anim_idle_closed ){
-               if( global_skateshop.pointcloud_world_id !=
-                     global_skateshop.selected_world_id )
-               {
-                  global_skateshop.pointcloud_world_id = 
-                     global_skateshop.selected_world_id;
-                  skateshop_load_world_preview( reg );
-               }
-               else{
-                  pointcloud_animate( k_pointcloud_anim_opening );
-               }
-            }
-            else if( pointcloud.anim == k_pointcloud_anim_idle_open ){
-               if( global_skateshop.pointcloud_world_id !=
-                     global_skateshop.selected_world_id )
-               {
-                  pointcloud_animate( k_pointcloud_anim_hiding );
-               }
-            }
+      if( loadable ){
+         if( button_down( k_srbind_maccept ) ){
+            skaterift_change_world_start( 
+                  get_addon_from_index( k_addon_type_world, 
+                                         global_skateshop.selected_world_id,
+                                         ADDON_REG_HIDDEN ));
          }
       }
-#endif
    }
    else{
       vg_fatal_error( "Unknown store (%u)\n", shop->type );
@@ -417,14 +390,14 @@ fade_out:;
    mlocal[3][2] = -0.7f;
    m4x3_mul( mrack, mlocal, mmdl );
 
-   if( addon_count(k_addon_type_board) ){
+   u32 valid_count = addon_count(k_addon_type_board,0);
+   if( valid_count ){
       char buf[16];
-      int i=0;
-      i+=highscore_intl( buf+i, global_skateshop.selected_board_id+1, 3 );
-      buf[i++] = '/';
-      i+=highscore_intl( buf+i, addon_count(k_addon_type_board), 3 );
-      buf[i++] = '\0';
-
+      vg_str str;
+      vg_strnull( &str, buf, sizeof(buf) );
+      vg_strcati32( &str, global_skateshop.selected_board_id+1 );
+      vg_strcatch( &str, '/' );
+      vg_strcati32( &str, valid_count );
       font3d_simple_draw( 0, buf, &skaterift.cam, mmdl );
    }
    else{
@@ -501,12 +474,13 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){
                                   mdl_entity_id_id(shop->boards.id_info));
 
    if( global_skateshop.render.world_reg != global_skateshop.selected_world_id){
-      global_skateshop.render.world_title = "";
+      global_skateshop.render.world_title = "missing: workshop.title";
 
       addon_reg *reg = get_addon_from_index( k_addon_type_world,
-                                       global_skateshop.selected_world_id );
+            global_skateshop.selected_world_id, ADDON_REG_HIDDEN );
       vg_msg msg;
       vg_msg_init( &msg, reg->metadata, reg->metadata_len );
+
       global_skateshop.render.world_loc = vg_msg_getkvstr( &msg, "location" );
       global_skateshop.render.world_reg = global_skateshop.selected_world_id;
 
@@ -514,6 +488,9 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){
          global_skateshop.render.world_title = vg_msg_getkvstr( &msg, "title");
          vg_msg_skip_frame( &msg );
       }
+      else {
+         vg_warn( "No workshop body\n" );
+      }
    }
 
    /* Text */
@@ -522,25 +499,20 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){
    vg_strnull( &info, buftext, 128 );
    vg_strnull( &subtext, bufsubtext, 128 );
    
-   if( addon_count(k_addon_type_world) ){
-      addon_reg *reg = get_addon_from_index( k_addon_type_world,
-                           global_skateshop.selected_world_id );
-
-      info.i+=highscore_intl( info.buffer+info.i, 
-                              global_skateshop.selected_world_id+1, 3 );
-      info.buffer[info.i++] = '/';
-      info.i+=highscore_intl( info.buffer+info.i, 
-                              addon_count(k_addon_type_world), 3 );
-      info.buffer[info.i++] = ' ';
-      info.buffer[info.i] = '\0';
-
+   u32 valid_count = addon_count(k_addon_type_world,ADDON_REG_HIDDEN);
+   if( valid_count ){
+      vg_strcati32( &info, global_skateshop.selected_world_id+1 );
+      vg_strcatch( &info, '/' );
+      vg_strcati32( &info, valid_count );
+      vg_strcatch( &info, ' ' );
       vg_strcat( &info, global_skateshop.render.world_title );
+
       if( !vg_loader_availible() ){
          vg_strcat( &subtext, "Loading..." );
       }
       else{
          addon_reg *reg = get_addon_from_index( k_addon_type_world,
-                                          global_skateshop.selected_world_id );
+                     global_skateshop.selected_world_id, ADDON_REG_HIDDEN );
 
          if( reg->alias.workshop_id )
             vg_strcat( &subtext, "(Workshop) " );
@@ -549,10 +521,9 @@ static void skateshop_render_worldshop( ent_skateshop *shop ){
       }
    }
    else{
-      vg_strcat( &info, "No worlds installed" );
+      vg_strcat( &info, "No workshop worlds installed" );
    }
 
-
    m4x3f mtext,mlocal,mtextmdl;
    mdl_transform_m4x3( &mark_info->transform, mtext );
 
index e573635ec7e48257a2b24615076d0860a9f4d4db..6c422906a55ca4ab8c8bc350d2e0f017e359c993 100644 (file)
Binary files a/maps_src/dev_hub/main.mdl and b/maps_src/dev_hub/main.mdl differ
index 2f159869e9c401d4986b8414ee011daa2e7354d2..fd22f643d97b500bcf9b5e5827c9321b27e80753 100644 (file)
Binary files a/maps_src/mp_mtzero/main.mdl and b/maps_src/mp_mtzero/main.mdl differ
index b5614cf6ad1dc6e72b5a81ebbf3bf2acb3c4fa9b..e195aa6b97d9c8a2c3a022cfbcbc51dd6b04530b 100644 (file)
Binary files a/maps_src/mp_spawn/main.mdl and b/maps_src/mp_spawn/main.mdl differ
index 326e02c65c2d6c75ad85b317cc1cc281b585d909..c23d022fec2911716c2d79bc3cb4b8efb888f5e0 100644 (file)
@@ -153,6 +153,12 @@ static void skaterift_restore_state(void){
    kvsav.cur = orig;
 }
 
+static addon_reg *skaterift_mount_world_unloadable( const char *path ){
+   addon_reg *reg = addon_mount_local_addon( path, k_addon_type_world, ".mdl" );
+   reg->flags |= ADDON_REG_HIDDEN;
+   return reg;
+}
+
 static void vg_load(void){
    if( k_tools_mode ){
       vg_async_call( async_call_ready, NULL, 0 );
@@ -204,37 +210,9 @@ static void vg_load(void){
     */
 
    /* hub world */
-   addon_reg *hub = 
-      addon_mount_local_addon( "maps/dev_hub", k_addon_type_world, ".mdl" );
-   hub->metadata_len = 0;
-
-   /* understate diy. */
-   addon_reg *spawn = addon_mount_local_addon( "maps/mp_spawn", 
-                                                k_addon_type_world, 
-                                                ".mdl" );
-   {
-      vg_msg msg;
-      vg_msg_init( &msg, spawn->metadata, sizeof(spawn->metadata) );
-      vg_msg_frame( &msg, "workshop" );
-      vg_msg_wkvstr( &msg, "title", "Understate DIY" );
-      vg_msg_end_frame( &msg );
-      vg_msg_wkvstr( &msg, "location", "USA" );
-      spawn->metadata_len = msg.cur.co;
-   }
-
-   /* mtzero island */
-   addon_reg *mtzero = addon_mount_local_addon( "maps/mp_mtzero",
-                                                k_addon_type_world,
-                                                ".mdl" );
-   {
-      vg_msg msg;
-      vg_msg_init( &msg, spawn->metadata, sizeof(mtzero->metadata) );
-      vg_msg_frame( &msg, "workshop" );
-      vg_msg_wkvstr( &msg, "title", "Mt.Zero Island" );
-      vg_msg_end_frame( &msg );
-      vg_msg_wkvstr( &msg, "location", "Australia" );
-      mtzero->metadata_len = msg.cur.co;
-   }
+   addon_reg *hub = skaterift_mount_world_unloadable( "maps/dev_hub" );
+   skaterift_mount_world_unloadable( "maps/mp_spawn" );
+   skaterift_mount_world_unloadable( "maps/mp_mtzero" );
 
    /* load home/permanent world manually */
    world_static.load_state = k_world_loader_load;
index 78bd332a472a507e2a7c4e54532554677b349dcd..1b256a2b2f6aa0a718f44a27451f9db49e7b2955 100644 (file)
@@ -326,7 +326,7 @@ static int skaterift_load_world_command( int argc, const char *argv[] ){
 
       u32 reg_id = addon_match( &q );
       if( reg_id != 0xffffffff ){
-         addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id );
+         addon_reg *reg = get_addon_from_index( k_addon_type_world, reg_id, 0 );
          skaterift_change_world_start( reg );
       }
       else {
@@ -336,12 +336,16 @@ static int skaterift_load_world_command( int argc, const char *argv[] ){
    else {
       vg_info( "worlds availible to load:\n" );
          
-      for( int i=0; i<addon_count(k_addon_type_world); i ++ ){
-         addon_reg *w = get_addon_from_index( k_addon_type_world, i );
+      for( int i=0; i<addon_count(k_addon_type_world,0); i ++ ){
+         addon_reg *w = get_addon_from_index( k_addon_type_world, i, 0);
 
          char buf[ADDON_UID_MAX];
          addon_alias_uid( &w->alias, buf );
-         vg_info( "  %s\n", buf );
+
+         if( w->flags & ADDON_REG_HIDDEN )
+            vg_info( "  %s [hidden]\n", buf );
+         else
+            vg_info( "  %s\n", buf );
       }
    }
 
index 281a6e7a69cb8f75857d4ac16f49aa5a4ba8ff8a..0584415a74d6a2e7f1bacba90b5eb0a366226152 100644 (file)
@@ -762,6 +762,8 @@ static void render_world_gates( world_instance *world, camera *cam ){
 
    for( u32 i=0; i<mdl_arrcount(&world->ent_gate); i++ ){
       ent_gate *gi = mdl_arritm( &world->ent_gate, i );
+      if( !(gi->flags & k_ent_gate_linked) )
+         continue;
 
       float dist = v3_dist2( gi->co[0], cam->transform[3] );