From 50a6601f50e5b48435a605e4ff2ac41f5bc093aa Mon Sep 17 00:00:00 2001 From: Mr_Goldberg Date: Sun, 19 Sep 2021 01:11:33 -0400 Subject: [PATCH] GetAchievementName function now returns achievements in alphabetical order. --- dll/steam_user_stats.h | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/dll/steam_user_stats.h b/dll/steam_user_stats.h index 5126af3..a93b65d 100644 --- a/dll/steam_user_stats.h +++ b/dll/steam_user_stats.h @@ -54,6 +54,7 @@ private: nlohmann::json defined_achievements; nlohmann::json user_achievements; + std::vector sorted_achievement_names; unsigned int find_leaderboard(std::string name) { @@ -109,6 +110,7 @@ Steam_User_Stats(Settings *settings, Local_Storage *local_storage, class SteamCa for (auto & it : defined_achievements) { try { std::string name = static_cast(it["name"]); + sorted_achievement_names.push_back(name); if (user_achievements.find(name) == user_achievements.end()) { user_achievements[name]["earned"] = false; user_achievements[name]["earned_time"] = static_cast(0); @@ -119,6 +121,13 @@ Steam_User_Stats(Settings *settings, Local_Storage *local_storage, class SteamCa it["hidden"] = std::to_string(it["hidden"].get()); } catch (...) {} } + + //TODO: not sure if the sort is actually case insensitive, ach names seem to be treated by steam as case insensitive so I assume they are. + //need to find a game with achievements of different case names to confirm + std::sort(sorted_achievement_names.begin(), sorted_achievement_names.end(), [](const std::string lhs, const std::string rhs){ + const auto result = std::mismatch(lhs.cbegin(), lhs.cend(), rhs.cbegin(), rhs.cend(), [](const unsigned char lhs, const unsigned char rhs){return std::tolower(lhs) == std::tolower(rhs);}); + return result.second != rhs.cend() && (result.first == lhs.cend() || std::tolower(*result.first) < std::tolower(*result.second));} + ); } // Ask the server to send down this user's data and achievements for this game @@ -470,12 +479,11 @@ uint32 GetNumAchievements() const char * GetAchievementName( uint32 iAchievement ) { PRINT_DEBUG("GetAchievementName\n"); - try { - static std::string achievement_name; - achievement_name = defined_achievements[iAchievement]["name"].get(); - return achievement_name.c_str(); - } catch (...) {} - return ""; + if (iAchievement >= sorted_achievement_names.size()) { + return ""; + } + + return sorted_achievement_names[iAchievement].c_str(); }