fix achievement spam
authorhgn <hgodden00@gmail.com>
Sat, 6 Jan 2024 03:14:29 +0000 (03:14 +0000)
committerhgn <hgodden00@gmail.com>
Sat, 6 Jan 2024 03:14:29 +0000 (03:14 +0000)
steam.h

diff --git a/steam.h b/steam.h
index c1a80c33f91f94ff84c1b819005be9a4d7865d5e..af8cd4b7390b8483745df408bec538a7f71a1bc4 100644 (file)
--- a/steam.h
+++ b/steam.h
@@ -41,20 +41,39 @@ static void *hSteamNetworkingSockets,
 static ISteamUserStats *hSteamUserStats;
 static HSteamPipe hSteamClientPipe;
 
-static const char *steam_achievement_names[] = 
-{
-   "MASTER_ENGINEER", "CAN_DO_THAT", "BANG", "GOOD_ENOUGH", 
-   "TUTORIALS", "MIGHTY_CONSUMER", "GRADUATE"
+enum mc_achievement {
+   k_mc_achievement_master_engineer,
+   k_mc_achievement_can_do_that,
+   k_mc_achievement_bang,
+   k_mc_achievement_good_enough,
+   k_mc_achievement_tutorials,
+   k_mc_achievement_mighty_consumer,
+   k_mc_achievement_graduate,
+   k_mc_achievement_max
 };
 
-static void steam_store_achievements(void)
-{
+static const char *steam_achievement_names[] = {
+   [k_mc_achievement_master_engineer] = "MASTER_ENGINEER", 
+   [k_mc_achievement_can_do_that]     = "CAN_DO_THAT", 
+   [k_mc_achievement_bang]            = "BANG", 
+   [k_mc_achievement_good_enough]     = "GOOD_ENOUGH", 
+   [k_mc_achievement_tutorials]       = "TUTORIALS", 
+   [k_mc_achievement_mighty_consumer] = "MIGHTY_CONSUMER", 
+   [k_mc_achievement_graduate]        = "GRADUATE"
+};
+
+static bool steam_achievement_set[k_mc_achievement_max];
+
+static void steam_store_achievements(void){
    if( steam_ready && steam_stats_ready ){
       SteamAPI_ISteamUserStats_StoreStats( hSteamUserStats );
    }
 }
 
-static void steam_set_achievement( const char *name ){
+static void steam_set_achievement( enum mc_achievement id ){
+   if( steam_achievement_set[ id ] ) return;
+   const char *name = steam_achievement_names[ id ];
+
    if( steam_ready && steam_stats_ready ){
       if( SteamAPI_ISteamUserStats_SetAchievement( hSteamUserStats, name ) ){
          vg_success( "Achievement set! '%s'\n", name );
@@ -67,15 +86,21 @@ static void steam_set_achievement( const char *name ){
    else{
       vg_warn( "Failed to set achievement (steam not ready): %s\n", name );
    }
+
+   steam_achievement_set[ id ] = 1;
 }
 
 static void sw_set_achievement( const char *name ){
-   steam_set_achievement( name );
-   steam_store_achievements();
+   for( u32 i=0; i<k_mc_achievement_max; i ++ ){
+      if( !strcmp( name, steam_achievement_names[i] ) ){
+         steam_set_achievement( i );
+         steam_store_achievements();
+         return;
+      }
+   }
 }
 
-static void steam_clear_achievement( const char *name )
-{
+static void steam_clear_achievement( const char *name ){
    if( steam_ready && steam_stats_ready ){
       if( SteamAPI_ISteamUserStats_ClearAchievement( hSteamUserStats, name ) ){
          vg_info( "Achievement cleared: '%s'\n", name );
@@ -136,8 +161,7 @@ static int steam_achievement_ccmd( int argc, char const *argv[] )
 
    if( argc == 2 ){
       if( !strcmp( argv[0], "set" ) ){
-         steam_set_achievement( argv[1] );
-         steam_store_achievements();
+         sw_set_achievement( argv[1] );
          return 0;
       }
       else if( strcmp( argv[0], "clear" ) ){