extremely hacky achievement models lol
authorhgn <hgodden00@gmail.com>
Mon, 27 Nov 2023 15:15:51 +0000 (15:15 +0000)
committerhgn <hgodden00@gmail.com>
Mon, 27 Nov 2023 15:15:51 +0000 (15:15 +0000)
blender_export.py
entity.h
save.c
skaterift.c
skaterift.h
steam.h
world_entity.c

index 30b1fe99fbe5f8503caa8c867d8c6c95a61b648d..cc0eb21ecebf9bb2a02b5135648a7601f6815bd7 100644 (file)
@@ -563,7 +563,8 @@ class ent_prop(Structure):#{
    _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 ):
@@ -1717,7 +1718,7 @@ def sr_compile( collection ):
          #}
          #--------------------------
 
-         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 )
       #}
    #}
@@ -2034,10 +2035,12 @@ def sr_compile( collection ):
          #}
          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 )
          #}
       #}
@@ -3215,6 +3218,7 @@ class SR_OBJECT_ENT_AUDIO(bpy.types.PropertyGroup):
 class SR_OBJECT_ENT_MARKER(bpy.types.PropertyGroup):
 #{
    alias: bpy.props.StringProperty()
+   flags: bpy.props.IntProperty()
 #}
 
 class SR_OBJECT_ENT_GLYPH(bpy.types.PropertyGroup):
@@ -3558,6 +3562,7 @@ class SR_OBJECT_PROPERTIES(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)
index ce148162a2ba670a0def87cb9ab488fd5dbce383..1c11f38ce3ec3544d7c82ac935df6f71c09463ca 100644 (file)
--- a/entity.h
+++ b/entity.h
@@ -543,7 +543,7 @@ struct ent_miniworld {
 
 struct ent_prop {
    mdl_transform transform;
-   u32 submesh_start, submesh_count, flags;
+   u32 submesh_start, submesh_count, flags, pstr_alias;
 };
 
 struct ent_region {
diff --git a/save.c b/save.c
index 472305d28d7e2c1cc220bf36d2edbcebbf97faf3..88dfada37adfea272434b22bd19f8e6f5091346d 100644 (file)
--- a/save.c
+++ b/save.c
@@ -112,6 +112,7 @@ static void skaterift_populate_main_savedata( savedata_file *file ){
 
    vg_msg sav;
    vg_msg_init( &sav, file->buf, sizeof(file->buf) );
+   vg_msg_wkvu32( &sav, "ach", skaterift.achievements );
 
    vg_msg_frame( &sav, "player" );
    {
index 2152fb1e65269db3a1047ad104de9284ab612691..775637702f9e0d2cf428089c26aa44b5d13ad249 100644 (file)
@@ -125,12 +125,12 @@ static void skaterift_restore_state(void){
 
    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;
 
@@ -245,6 +245,8 @@ static void vg_load(void){
 
    /* and now */
    skaterift_restore_state();
+   update_ach_models();
+
    vg_loader_step( NULL, skaterift_autosave_synchronous );
 
    //board_processview_thread(NULL);
index 21814df255fad59d6b0644634d84df0188d40587..09adb5d2a6c3c6a3dcbbcd085ef3cd27238fd09a 100644 (file)
@@ -63,6 +63,8 @@ struct{
 
    f64 last_autosave;
    GLuint rt_textures[k_skaterift_rt_max];
+
+   u32 achievements;
 }
 static skaterift = { .op = k_async_op_clientloading, .time_rate = 1.0f };
 
diff --git a/steam.h b/steam.h
index cbe88eef63b67d92cbdab643d61c421b46755403..dcfc1c8bb970335eaad43809b92311a9c6e6e76e 100644 (file)
--- a/steam.h
+++ b/steam.h
@@ -60,11 +60,19 @@ static void steam_store_achievements(void)
    }
 }
 
-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 );
@@ -155,6 +163,25 @@ static void steam_on_recieve_current_stats( CallbackMsg_t *msg )
       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 );
index 947a3bdc387c11a13ffa6b980231c5e42fefa619..02bbeb2b342d26141ef52c4a674688106cc50732 100644 (file)
@@ -560,6 +560,29 @@ static void entity_bh_debug( void *user, u32 item_index ){
    }
 }
 
+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;
@@ -652,7 +675,7 @@ static void world_entity_start( world_instance *world, vg_msg *sav ){
             }
 
             /* 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,