#include "array_file.h"
#include <errno.h>
-const char *ps_get( array_file_ptr *strings, u32 pstr )
+u32 af_str_hash( array_file_context *af, u32 pstr )
{
- return ((char *)af_arritm( strings, pstr )) + 4;
+ return *((u32 *)(af->strings + pstr));
}
-bool ps_consteq( array_file_ptr *strings, u32 pstr, const char *str, u32 djb2 )
+const char *af_str( array_file_context *af, u32 pstr )
{
- u32 hash = *((u32 *)af_arritm( strings, pstr ));
- if( hash == djb2 )
- {
- if( !strcmp( str, ps_get( strings, pstr ))) return 1;
- else return 0;
- }
- else return 0;
+ return af->strings + pstr + 4;
+}
+
+bool af_str_eq( array_file_context *af, u32 pstr,
+ const char *str, u32 str_hash )
+{
+ if( af_str_hash( af, pstr ) == str_hash )
+ if( !strcmp( str, af_str( af, pstr )))
+ return 1;
+
+ return 0;
}
static void af_load_array_file_buffer( array_file_context *ctx,
af_load_array_file( ctx, &ctx->index, &ctx->header.index, lin_alloc,
sizeof(array_file_meta) );
+
+ array_file_ptr strings;
+ af_load_array( ctx, &strings, "strings", lin_alloc, 1 );
+ ctx->strings = strings.data;
}
void af_close( array_file_context *ctx )
FILE *fp;
array_file_header header;
array_file_ptr index;
+ const void *strings;
};
void af_open( array_file_context *ctx, const char *path,
u32 af_arrcount( array_file_ptr *arr );
/* packed string buffer access (with djb2 hash prefix) */
-const char *ps_get( array_file_ptr *strings, u32 pstr );
-bool ps_consteq( array_file_ptr *strings, u32 pstr, const char *str, u32 djb2 );
+const char *af_str( array_file_context *af, u32 pstr );
+u32 af_str_hash( array_file_context *af, u32 pstr );
+bool af_str_eq( array_file_context *af, u32 pstr,
+ const char *str, u32 str_hash );
-#define PS_EQ( STRINGS, PSTR, CONSTR ) \
- ps_consteq( STRINGS, PSTR, CONSTR, vg_strdjb2( CONSTR ) )
+#define AF_STR_EQ( CTX, PSTR, CONSTR ) \
+ af_str_eq( CTX, PSTR, CONSTR, vg_strdjb2( CONSTR ) )
{
mdl_mesh *mesh = af_arritm( &ctx.meshs, i );
fprintf( hdr, " %s = %u,\n",
- ps_get( &ctx.strings,mesh->pstr_name ), mesh->submesh_start );
+ af_str( &ctx.af, mesh->pstr_name ), mesh->submesh_start );
}
fclose( hdr );
if( !challenge->status )
{
vg_info( "challenge( '%s' )\n",
- ps_get( &world->meta.strings, challenge->pstr_alias) );
+ af_str( &world->meta.af, challenge->pstr_alias) );
ent_call call;
call.data = NULL;
call.function = challenge->target_event;
if( call->function == 0 ) /* zone() */
{
- const char *uid = ps_get( &world->meta.strings, miniworld->pstr_world );
+ const char *uid = af_str( &world->meta.af, miniworld->pstr_world );
skaterift_load_world_command( 1, (const char *[]){ uid } );
mdl_transform_m4x3( &miniworld->transform, global_miniworld.mmdl );
}
gui_location_print_ccmd( 1, (const char *[]){
- ps_get( &world->meta.strings, region->pstr_title)} );
+ af_str( &world->meta.af, region->pstr_title)} );
- vg_strncpy( ps_get( &world->meta.strings, region->pstr_title ),
+ vg_strncpy( af_str( &world->meta.af, region->pstr_title ),
global_ent_region.location, NETWORK_REGION_MAX,
k_strncpy_always_add_null );
global_ent_region.flags = region->flags;
{
ent_marker *marker = af_arritm( &world->ent_marker, i );
- if( PS_EQ( &world->meta.strings, marker->pstr_alias, "tornado" ) )
+ if( AF_STR_EQ( &world->meta.af, marker->pstr_alias, "tornado" ) )
{
v3f p1;
v3_add( marker->transform.co, (v3f){0,20,0}, p1 );
{
ent_marker *marker = af_arritm( &world->ent_marker, i );
- if( PS_EQ( &world->meta.strings, marker->pstr_alias, "tornado" ) )
+ if( AF_STR_EQ( &world->meta.af, marker->pstr_alias, "tornado" ) )
{
v3f d, dir;
v3_sub( co, marker->transform.co, d );
{
ent_marker *marker = af_arritm( &world->ent_marker, i );
- if( PS_EQ( &world->meta.strings, marker->pstr_alias, "tornado" ) )
+ if( AF_STR_EQ( &world->meta.af, marker->pstr_alias, "tornado" ) )
{
v3f co;
vg_rand_sphere( &vg.rand, co );
{
ent_marker *marker = af_arritm( arr, i );
- if( !strcmp( ps_get( &mdl->strings, marker->pstr_alias ), alias ) )
+ if( !strcmp( af_str( &mdl->af, marker->pstr_alias ), alias ) )
{
return marker;
}
{
ent_font_variant *variant = af_arritm( &font->font_variants, i );
- if( !strcmp( ps_get( &font->mdl.strings, variant->name ), name ) ){
+ if( !strcmp( af_str( &font->mdl.af, variant->name ), name ) )
return i;
- }
}
return 0;
if( world->status == k_world_status_loaded )
{
const char *world_name =
- ps_get( &world->meta.strings, world->info.pstr_name );
+ af_str( &world->meta.af, world->info.pstr_name );
vg_strnull( &str, buf, sizeof(buf) );
vg_strcat( &str, world_name );
if( !region->zone_volume )
continue;
- const char *title = ps_get( &world->meta.strings,
- region->pstr_title );
+ const char *title = af_str( &world->meta.af, region->pstr_title );
ctx->font = &vgf_default_large;
ui_rect title_box;
vg_strnull( &str, buf, sizeof(buf) );
vg_strcat( &str, "(Race) " );
- vg_strcat( &str, ps_get(&world->meta.strings, route->pstr_name));
+ vg_strcat( &str, af_str( &world->meta.af, route->pstr_name ));
if( route->flags & k_ent_route_flag_achieve_silver )
vg_strcat( &str, " \xb3");
}
vg_strnull( &str, buf, sizeof(buf) );
- vg_strcat( &str, ps_get(&world->meta.strings,
- challenge->pstr_alias));
+ vg_strcat( &str, af_str( &world->meta.af,challenge->pstr_alias));
u32 flags = 0x00;
if( challenge->status )
void metascene_load( ms_context *ms, const char *path, void *alloc )
{
af_open( &ms->af, path, MS_VERSION_MIN, MS_VERSION_NR, alloc );
- af_load_array( &ms->af, &ms->strings, "strings", alloc, 1 );
AF_LOAD_ARRAY_STRUCT( &ms->af, &ms->infos, ms_scene_info, alloc );
AF_LOAD_ARRAY_STRUCT( &ms->af, &ms->instances, ms_instance, alloc );
AF_LOAD_ARRAY_STRUCT( &ms->af, &ms->overrides, ms_override, alloc );
}
ui_rect box = { strip->offset, layer*32, strip->length, 30 };
- u32 ps = strip->pstr_name,
- colour = *((u32 *)af_arritm( &_cutscene.meta.strings, ps ));
+ u32 colour = af_str_hash( &_cutscene.meta.af, strip->pstr_name );
ui_fill( ctx, box, colour | 0xff000000 );
- ui_text( ctx, box, ps_get( &_cutscene.meta.strings, ps ), 1,
+ ui_text( ctx, box, af_str( &_cutscene.meta.af, strip->pstr_name ), 1,
k_ui_align_middle_center, 0 );
}
out_asoc->orig_data = mdl;
out_asoc->entity_type = override->entity_type;
out_asoc->override = override;
- const char *name = ps_get( &_cutscene.meta.strings, override->pstr_name );
+ const char *name = af_str( &_cutscene.meta.af, override->pstr_name );
+ u32 name_hash = af_str_hash( &_cutscene.meta.af, override->pstr_name );
if( out_asoc->entity_type != 28 )
goto NOT_IMPLEMENTED;
- u32 name_hash = vg_strdjb2( name );
for( u32 j=0; j<af_arrcount( &mdl->armatures ); j ++ )
{
mdl_armature *armature = af_arritm( &mdl->armatures, j );
- if( ps_consteq( &mdl->strings, armature->pstr_name,
- name, name_hash ) )
+ if( af_str_eq( &mdl->af, armature->pstr_name, name, name_hash ) )
{
out_asoc->entity_index = j;
return;
for( u32 i=0; i < _cutscene.instance_count; i ++ )
{
ms_instance *instance = af_arritm( &_cutscene.meta.instances, i );
- const char *name = ps_get( &_cutscene.meta.strings, instance->pstr_name );
+ const char *name = af_str( &_cutscene.meta.af, instance->pstr_name );
+ u32 name_hash = af_str_hash( &_cutscene.meta.af, instance->pstr_name );
struct model_ref *ref = NULL;
u32 ref_id = 0;
{
struct model_ref *ref_j = &_cutscene.refs[ j ];
- if( ps_consteq( &_cutscene.meta.strings, instance->pstr_name,
+ if( af_str_eq( &_cutscene.meta.af, instance->pstr_name,
ref_j->name, ref_j->name_hash ) )
{
ref = ref_j;
ref_id = _cutscene.unique_refs;
ref = &_cutscene.refs[ ref_id ];
ref->name = name;
- ref->name_hash = vg_strdjb2( name );
+ ref->name_hash = name_hash;
vg_info( "Indexed reference '%s'\n", name );
_cutscene.unique_refs ++;
}
array_file_context af;
ms_scene_info info;
- struct array_file_ptr strings,
-
- infos,
+ struct array_file_ptr infos,
instances,
overrides,
strips,
{
vg_fatal_condition();
vg_info( "Packed file is only a header; it is not packed" );
- vg_info( "path: %s\n", ps_get( &mdl->strings, info->pstr_path ) );
+ vg_info( "path: %s\n", af_str( &mdl->af, info->pstr_path ) );
vg_fatal_exit();
}
void mdl_load_metadata_block( mdl_context *mdl, void *lin_alloc )
{
- af_load_array ( &mdl->af, &mdl->strings, "strings", lin_alloc, 1 );
AF_LOAD_ARRAY_STRUCT( &mdl->af, &mdl->meshs, mdl_mesh, lin_alloc );
AF_LOAD_ARRAY_STRUCT( &mdl->af, &mdl->submeshs, mdl_submesh, lin_alloc );
AF_LOAD_ARRAY_STRUCT( &mdl->af, &mdl->textures, mdl_texture, lin_alloc );
for( u32 i=0; i<af_arrcount( &mdl->meshs ); i++ )
{
mdl_mesh *mesh = af_arritm( &mdl->meshs, i );
- if( ps_consteq( &mdl->strings, mesh->pstr_name, name, hash ) )
+ if( af_str_eq( &mdl->af, mesh->pstr_name, name, hash ) )
return mesh;
}
return NULL;
struct array_file_ptr
/* metadata */
- strings,
meshs,
submeshs,
materials,
{
ms_strip *strip = af_arritm( &ms->strips, i );
- if( ps_consteq( &ms->strings, strip->pstr_name, name, hash ) )
+ if( af_str_eq( &ms->af, strip->pstr_name, name, hash ) )
{
out_anim->strip = strip;
out_anim->framerate = localplayer.animations.info.framerate;
mdl_submesh *sm0 = af_arritm( &ctx.submeshs, mesh->submesh_start );
- const char *alias = ps_get( &ctx.strings, marker->pstr_alias );
+ const char *alias = af_str( &ctx.af, marker->pstr_alias );
u32 lr = marker->transform.co[0] > 0.0f? 1: 0,
fb = marker->transform.co[2] > 0.0f? 0: 1;
{
mdl_bone *bone = af_arritm( &ctx.bones, armature->bone_start+j );
- if( ps_consteq( &ctx.strings, bone->pstr_name, sb->name, hash ) )
+ if( af_str_eq( &ctx.af, bone->pstr_name, sb->name, hash ) )
{
fixup_table[j+1] = i;
break;
v3_copy( bone->end, sb->end );
sb->parent = bone->parent;
- sb->name = ps_get( &mdl->strings, bone->pstr_name );
+ sb->name = af_str( &mdl->af, bone->pstr_name );
sb->flags = bone->flags;
sb->collider = bone->collider;
sb->orig_bone = bone;
}
else
{
- clip->_.clip.path = ps_get( &world->meta.strings,
+ clip->_.clip.path = af_str( &world->meta.af,
clip->_.file.pstr_path );
clip->_.clip.flags = audio->flags;
clip->_.clip.data = NULL;
{
ent_marker *marker = af_arritm( &world->ent_marker, i );
- if( PS_EQ( &world->meta.strings, marker->pstr_alias, "tar_min" ) )
+ if( AF_STR_EQ( &world->meta.af, marker->pstr_alias, "tar_min" ) )
world->tar_min = marker->transform.co[1];
- if( PS_EQ( &world->meta.strings, marker->pstr_alias, "tar_max" ) )
+ if( AF_STR_EQ( &world->meta.af, marker->pstr_alias, "tar_max" ) )
world->tar_max = marker->transform.co[1];
}
}
{
r = af_arritm( &world->ent_spawn, i );
- if( ps_consteq( &world->meta.strings, r->pstr_name, name, hash ) )
+ if( af_str_eq( &world->meta.af, r->pstr_name, name, hash ) )
{
rp = r;
break;
{
u32 index = mdl_entity_id_id( call->id );
ent_ccmd *ccmd = af_arritm( &world->ent_ccmd, index );
- vg_execute_console_input( ps_get(&world->meta.strings,
- ccmd->pstr_command), 0 );
+ const char *cmd_text = af_str( &world->meta.af, ccmd->pstr_command );
+ vg_execute_console_input( cmd_text, 0 );
return k_entity_call_result_OK;
}
else
ent_prop *prop = af_arritm( &hub->ent_prop, i );
if( prop->flags & 0x2 )
{
- if( PS_EQ( &hub->meta.strings, prop->pstr_alias, "MARC" ) )
+ if( AF_STR_EQ( &hub->meta.af, prop->pstr_alias, "MARC" ) )
if( skaterift.achievements & 0x1 )
prop->flags &= ~0x1;
- if( PS_EQ( &hub->meta.strings, prop->pstr_alias, "ALBERT" ) )
+ if( AF_STR_EQ( &hub->meta.af, prop->pstr_alias, "ALBERT" ) )
if( skaterift.achievements & 0x2 )
prop->flags &= ~0x1;
- if( PS_EQ( &hub->meta.strings, prop->pstr_alias, "JANET" ) )
+ if( AF_STR_EQ( &hub->meta.af, prop->pstr_alias, "JANET" ) )
if( skaterift.achievements & 0x4 )
prop->flags &= ~0x1;
- if( PS_EQ( &hub->meta.strings, prop->pstr_alias, "BERNADETTA" ) )
+ if( AF_STR_EQ( &hub->meta.af, prop->pstr_alias, "BERNADETTA" ) )
if( skaterift.achievements & 0x8 )
prop->flags &= ~0x1;
}
for( u32 i=0; i<af_arrcount(&world->ent_challenge); i++ ){
ent_challenge *challenge = af_arritm( &world->ent_challenge, i );
- const char *alias = ps_get( &world->meta.strings, challenge->pstr_alias );
+ const char *alias = af_str( &world->meta.af, challenge->pstr_alias );
u32 result;
vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result, NULL );
vg_msg route_info = routes_block;
if( vg_msg_seekframe( &route_info,
- ps_get(&world->meta.strings,route->pstr_name) ) )
+ af_str(&world->meta.af,route->pstr_name) ) )
{
u32 flags;
for( u32 j=0; j<VG_ARRAY_LEN(track_infos); j ++ ){
struct track_info *inf = &track_infos[j];
if( !strcmp(inf->name,
- ps_get(&world->meta.strings,route->pstr_name)))
+ af_str(&world->meta.af,route->pstr_name)))
{
steamapi_bool set = 0;
for( u32 i=0; i<af_arrcount(&world->ent_challenge); i++ ){
ent_challenge *challenge = af_arritm(&world->ent_challenge,i);
- const char *alias = ps_get( &world->meta.strings, challenge->pstr_alias );
+ const char *alias = af_str( &world->meta.af, challenge->pstr_alias );
vg_msg_wkvnum( sav, alias, k_vg_msg_u32, 1, &challenge->status );
}
for( u32 i=0; i<af_arrcount(&world->ent_route); i++ ){
ent_route *route = af_arritm( &world->ent_route, i );
- vg_msg_frame( sav, ps_get( &world->meta.strings, route->pstr_name ) );
+ vg_msg_frame( sav, af_str( &world->meta.af, route->pstr_name ) );
{
vg_msg_wkvnum( sav, "flags", k_vg_msg_u32, 1, &route->flags );
vg_msg_wkvnum( sav, "best_laptime",
if( !(gate->flags & k_ent_gate_nonlocal) ) continue;
if( gate->flags & k_ent_gate_linked ) continue;
- const char *key = ps_get( &world->meta.strings, gate->key );
+ const char *key = af_str( &world->meta.af, gate->key );
vg_info( "key: %s\n", key );
for( u32 i=0; i<VG_ARRAY_LEN(world_static.instances); i++ ){
if( !(gate2->flags & k_ent_gate_nonlocal) ) continue;
if( gate2->flags & k_ent_gate_linked ) continue;
- const char *key2 = ps_get( &other->meta.strings, gate2->key );
+ const char *key2 = af_str( &other->meta.af, gate2->key );
vg_info( " key2: %s\n", key2 );
if( strcmp( key, key2 ) ) continue;
if( world->meta.version >= 104 )
{
- if( PS_EQ( &world->meta.strings, world->info.pstr_skybox, "space" ))
+ if( AF_STR_EQ( &world->meta.af, world->info.pstr_skybox, "space" ))
{
world->skybox = k_skybox_space;
}
world_static.last_use = 0.0;
}
-static void world_routes_time_lap( world_instance *world, ent_route *route ){
- vg_info( "------- time lap %s -------\n",
- ps_get(&world->meta.strings,route->pstr_name) );
+static void world_routes_time_lap( world_instance *world, ent_route *route )
+{
+ const char *route_name = af_str( &world->meta.af, route->pstr_name);
+ vg_info( "------- time lap %s -------\n", route_name );
double start_time = 0.0;
u32 last_version=0;
char mod_uid[ ADDON_UID_MAX ];
addon_alias_uid( alias, mod_uid );
network_publish_laptime( mod_uid,
- ps_get( &world->meta.strings, route->pstr_name ),
+ af_str( &world->meta.af, route->pstr_name ),
lap_time );
}
route->flags |= k_ent_route_flag_out_of_zone;
route->anon.official_track_id = 0xffffffff;
+ const char *route_name = af_str( &world->meta.af, route->pstr_name );
for( u32 j=0; j<VG_ARRAY_LEN(track_infos); j ++ )
{
- if( !strcmp(track_infos[j].name,
- ps_get( &world->meta.strings ,route->pstr_name )))
+ if( !strcmp( track_infos[j].name, route_name ))
{
route->anon.official_track_id = j;
}
board = &world->leaderboard_cache[ world_sfd.active_route_board ];
ent_route *route = af_arritm( &world->ent_route,
world_sfd.active_route_board );
- name = ps_get( &world->meta.strings, route->pstr_name );
+ name = af_str( &world->meta.af, route->pstr_name );
}
world_sfd_compile_scores( board, name );
network_request_scoreboard(
mod_uid,
- ps_get( &world->meta.strings, route->pstr_name ),
+ af_str( &world->meta.af, route->pstr_name ),
NETWORK_LEADERBOARD_ALLTIME_AND_CURRENT_WEEK, closest );
}
}