_fields_ = [("transform",mdl_transform),
("submesh_start",c_uint32),
("submesh_count",c_uint32),
- ("flags",c_uint32)]
+ ("flags",c_uint32),
+ ("pstr_alias",c_uint32)]
#}
def obj_ent_type( obj ):
#}
#--------------------------
- print( F'[SR] {i: 3}/{mesh_count} {obj.name:<40}', end='\r' )
+ print( F'[SR] {i: 3}/{mesh_count} {obj.name:<40}' )
sr_compile_mesh( obj )
#}
#}
#}
elif ent_type == 'ent_prop':#{
prop = ent_prop()
+ obj_data = obj.SR_data.ent_prop[0]
compile_obj_transform( obj, prop.transform )
prop.submesh_start, prop.submesh_count, _ = \
sr_compile_mesh_internal( obj )
- prop.flags = 0
+ prop.flags = obj_data.flags
+ prop.pstr_alias = sr_compile_string( obj_data.alias )
sr_ent_push( prop )
#}
#}
class SR_OBJECT_ENT_MARKER(bpy.types.PropertyGroup):
#{
alias: bpy.props.StringProperty()
+ flags: bpy.props.IntProperty()
#}
class SR_OBJECT_ENT_GLYPH(bpy.types.PropertyGroup):
ent_volume: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_VOLUME)
ent_audio: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_AUDIO)
ent_marker: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MARKER)
+ ent_prop: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_MARKER)
ent_glyph: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_GLYPH)
ent_font: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_FONT)
ent_traffic: bpy.props.CollectionProperty(type=SR_OBJECT_ENT_TRAFFIC)
struct ent_prop {
mdl_transform transform;
- u32 submesh_start, submesh_count, flags;
+ u32 submesh_start, submesh_count, flags, pstr_alias;
};
struct ent_region {
vg_msg sav;
vg_msg_init( &sav, file->buf, sizeof(file->buf) );
+ vg_msg_wkvu32( &sav, "ach", skaterift.achievements );
vg_msg_frame( &sav, "player" );
{
vg_msg kvsav;
vg_msg_init( &kvsav, sav.buf, sizeof(sav.buf) );
+ skaterift.achievements |= vg_msg_getkvu32( &kvsav, "ach", 0 );
u32 board_reg_id = 0,
player_reg_id = 0;
vg_msg_cursor orig = kvsav.cur;
-
if( vg_msg_seekframe( &kvsav, "player" ) ){
addon_alias q;
/* and now */
skaterift_restore_state();
+ update_ach_models();
+
vg_loader_step( NULL, skaterift_autosave_synchronous );
//board_processview_thread(NULL);
f64 last_autosave;
GLuint rt_textures[k_skaterift_rt_max];
+
+ u32 achievements;
}
static skaterift = { .op = k_async_op_clientloading, .time_rate = 1.0f };
}
}
-static void steam_set_achievement( const char *name )
-{
+static void update_ach_models(void);
+static void steam_set_achievement( const char *name ){
+ /* hack lol */
+ if( !strcmp(name,"MARC") ) skaterift.achievements |= 0x1;
+ if( !strcmp(name,"ALBERT") ) skaterift.achievements |= 0x2;
+ if( !strcmp(name,"JANET") ) skaterift.achievements |= 0x4;
+ if( !strcmp(name,"BERNADETTA") ) skaterift.achievements |= 0x8;
+ update_ach_models();
+
if( steam_ready && steam_stats_ready ){
if( SteamAPI_ISteamUserStats_SetAchievement( hSteamUserStats, name ) ){
vg_success( "Achievement set! '%s'\n", name );
+
}
else{
vg_warn( "Failed to set achievement: %s\n", name );
vg_info( "Recieved stats for: %lu (user: %lu)\n", rec->m_nGameID,
rec->m_steamIDUser );
steam_stats_ready = 1;
+
+ steamapi_bool set = 0;
+ if( SteamAPI_ISteamUserStats_GetAchievement(
+ hSteamUserStats, "MARC", &set ) ){
+ if( set ) skaterift.achievements |= 0x1;
+ }
+ if( SteamAPI_ISteamUserStats_GetAchievement(
+ hSteamUserStats, "ALBERT", &set ) ){
+ if( set ) skaterift.achievements |= 0x2;
+ }
+ if( SteamAPI_ISteamUserStats_GetAchievement(
+ hSteamUserStats, "JANET", &set ) ){
+ if( set ) skaterift.achievements |= 0x4;
+ }
+ if( SteamAPI_ISteamUserStats_GetAchievement(
+ hSteamUserStats, "BERNADETTA", &set ) ){
+ if( set ) skaterift.achievements |= 0x8;
+ }
+ update_ach_models();
}
else{
vg_error( "Error recieveing stats for user (%u)\n", rec->m_eResult );
}
}
+static void update_ach_models(void){
+ world_instance *hub = &world_static.instances[k_world_purpose_hub];
+ if( hub->status != k_world_status_loaded ) return;
+
+ for( u32 i=0; i<mdl_arrcount( &hub->ent_prop ); i ++ ){
+ ent_prop *prop = mdl_arritm( &hub->ent_prop, i );
+ if( prop->flags & 0x2 ){
+ if( MDL_CONST_PSTREQ( &hub->meta, prop->pstr_alias, "MARC" ) )
+ if( skaterift.achievements & 0x1 )
+ prop->flags &= ~0x1;
+ if( MDL_CONST_PSTREQ( &hub->meta, prop->pstr_alias, "ALBERT" ) )
+ if( skaterift.achievements & 0x2 )
+ prop->flags &= ~0x1;
+ if( MDL_CONST_PSTREQ( &hub->meta, prop->pstr_alias, "JANET" ) )
+ if( skaterift.achievements & 0x4 )
+ prop->flags &= ~0x1;
+ if( MDL_CONST_PSTREQ( &hub->meta, prop->pstr_alias, "BERNADETTA" ) )
+ if( skaterift.achievements & 0x8 )
+ prop->flags &= ~0x1;
+ }
+ }
+}
+
static void entity_bh_closest( void *user, u32 item_index, v3f point,
v3f closest ){
world_instance *world = user;
}
/* LEGACY: check if steam achievements can give us a medal */
- if( steam_ready && steam_stats_ready ){
+ if( steam_ready && steam_stats_ready ){
for( u32 j=0; j<vg_list_size(track_infos); j ++ ){
struct track_info *inf = &track_infos[j];
if( !strcmp(inf->name,