#ifndef ADDON_H
#define ADDON_H
-#include "workshop.h"
-#include "workshop_types.h"
-#define ADDON_MOUNTED_MAX 128
-#define ADDON_FOLDERNAME_MAX 64
+#include "skaterift.h"
+#include "vg/vg_steam_ugc.h"
+#include "addon_types.h"
+#include "vg/vg_mem_pool.h"
+
+#include "world.h"
+#include "player.h"
typedef struct addon_reg addon_reg;
+typedef struct addon_cache_entry addon_cache_entry;
+typedef struct addon_alias addon_alias;
+
+struct addon_alias {
+ enum addon_type type;
+ PublishedFileId_t workshop_id;
+ char foldername[ ADDON_FOLDERNAME_MAX ];
+};
+
+#define ADDON_REG_HIDDEN 0x1
+#define ADDON_REG_MTZERO 0x2
+#define ADDON_REG_CITY 0x4
+#define ADDON_REG_PREMIUM 0x8
+
struct {
struct addon_reg{
- PublishedFileId_t workshop_id;
-
- enum workshop_file_type type;
+ addon_alias alias;
+ u32 foldername_hash;
u8 metadata[512]; /* vg_msg buffer */
u32 metadata_len;
+ u32 flags;
- char foldername[ ADDON_FOLDERNAME_MAX ];
- u32 foldername_hash;
- void *userdata;
+ u16 cache_id;
enum addon_state{
k_addon_state_none,
u32 registry_count;
/* deffered: updates in main thread */
- u32 registry_type_counts[k_workshop_file_type_max];
+ u32 registry_type_counts[k_addon_type_max];
+
+ struct addon_cache{
+ struct addon_cache_entry{
+ u32 reg_index;
+ addon_reg *reg_ptr; /* TODO: only use reg_index? */
+
+ vg_pool_node poolnode;
+
+ enum addon_cache_state{
+ k_addon_cache_state_none,
+ k_addon_cache_state_loaded,
+ k_addon_cache_state_load_request
+ }
+ state;
+ }
+ *allocs;
+ vg_pool pool;
+
+ void *items; /* the real data */
+ size_t stride;
+ }
+ cache[k_addon_type_max];
+ SDL_SpinLock sl_cache_using_resources;
}
static addon_system;
static void addon_system_init( void );
-static u32 addon_count( enum workshop_file_type type );
-static addon_reg *get_addon_from_index(enum workshop_file_type type, u32 index);
-static u32 get_index_from_addon( enum workshop_file_type type, addon_reg *a );
+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, int async);
/* scanning routines */
-VG_STATIC void addon_mount_local_folder( enum workshop_file_type type,
- const char *base_folder,
- const char *content_ext );
-VG_STATIC void addon_mount_workshop_items(void);
-VG_STATIC void async_addon_reg_update( void *data, u32 size );
+static u32 addon_match( addon_alias *alias );
+static int addon_alias_eq( addon_alias *a, addon_alias *b );
+static void addon_alias_uid( addon_alias *alias, char buf[ADDON_UID_MAX] );
+static int addon_uid_to_alias( const char *uid, addon_alias *alias );
+static void invalidate_addon_alias( addon_alias *alias );
+static void addon_mount_content_folder( enum addon_type type,
+ const char *base_folder,
+ const char *content_ext );
+static void addon_mount_workshop_items(void);
+static void async_addon_reg_update( void *data, u32 size );
+static addon_reg *addon_mount_local_addon( const char *folder,
+ enum addon_type type,
+ const char *content_ext );
+static u16 addon_cache_fetch( enum addon_type type, u32 reg_index );
+static u16 addon_cache_alloc( enum addon_type type, u32 reg_index );
+static void *addon_cache_item( enum addon_type type, u16 id );
+static void *addon_cache_item_if_loaded( enum addon_type type, u16 id );
+static void async_addon_setstate( void *data, u32 size );
+static void addon_cache_load_loop(void);
+static u16 addon_cache_create_viewer( enum addon_type type, u16 reg_id);
+
+static void addon_cache_watch( enum addon_type type, u16 cache_id );
+static void addon_cache_unwatch( enum addon_type type, u16 cache_id );
+static u16 addon_cache_create_viewer_from_uid( enum addon_type type,
+ char uid[ADDON_UID_MAX] );
#endif /* ADDON_H */