diff --git a/dep/rcheevos/include/rc_client.h b/dep/rcheevos/include/rc_client.h index ae690d37d..5a223fcaa 100644 --- a/dep/rcheevos/include/rc_client.h +++ b/dep/rcheevos/include/rc_client.h @@ -491,7 +491,8 @@ enum { RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE = 6, RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE = 7, RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED = 8, - NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS = 9 + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE = 9, + NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS = 10, }; enum { diff --git a/dep/rcheevos/src/rc_client.c b/dep/rcheevos/src/rc_client.c index c262b6cb5..479345dcb 100644 --- a/dep/rcheevos/src/rc_client.c +++ b/dep/rcheevos/src/rc_client.c @@ -3942,6 +3942,10 @@ static void rc_client_update_achievement_display_information(rc_client_t* client else if (achievement->public_.measured_percent >= 80.0) new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE; } + + /* map to unlocked in softcore bucket if hardcore is enabled but achievement is unlocked in softcore */ + if (client->state.hardcore && achievement->public_.unlocked & RC_CLIENT_ACHIEVEMENT_UNLOCKED_SOFTCORE) + new_bucket = RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE; } achievement->public_.bucket = new_bucket; @@ -3957,6 +3961,7 @@ static const char* rc_client_get_achievement_bucket_label(uint8_t bucket_type) case RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED: return "Recently Unlocked"; case RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE: return "Active Challenges"; case RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE: return "Almost There"; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE: return "Unlocked in Softcore"; case RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED: return "Unlocks Not Synced to Server"; default: return "Unknown"; } @@ -3974,6 +3979,7 @@ static const char* rc_client_get_subset_achievement_bucket_label(uint8_t bucket_ case RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED: ptr = &subset->unlocked_label; break; case RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED: ptr = &subset->unsupported_label; break; case RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL: ptr = &subset->unofficial_label; break; + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE: ptr = &subset->unlocked_softcore_label; break; default: return rc_client_get_achievement_bucket_label(bucket_type); } @@ -4020,6 +4026,7 @@ static uint8_t rc_client_map_bucket(uint8_t bucket, int grouping) case RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE: case RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE: + case RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE: return RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED; default: @@ -4057,7 +4064,8 @@ rc_client_achievement_list_t* rc_client_create_achievement_list(rc_client_t* cli RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED, RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL, RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED, - RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED, }; static const uint8_t no_shared_subset_buckets_order[] = { RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE, @@ -4067,6 +4075,7 @@ rc_client_achievement_list_t* rc_client_create_achievement_list(rc_client_t* cli RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED, RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL, RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE, RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED }; const uint8_t* subset_bucket_order = (grouping == RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_PROGRESS) ? diff --git a/dep/rcheevos/src/rc_client_internal.h b/dep/rcheevos/src/rc_client_internal.h index fad288d62..cf4f3d533 100644 --- a/dep/rcheevos/src/rc_client_internal.h +++ b/dep/rcheevos/src/rc_client_internal.h @@ -214,6 +214,7 @@ typedef struct rc_client_subset_info_t { const char* inactive_label; const char* locked_label; const char* unlocked_label; + const char* unlocked_softcore_label; const char* unofficial_label; const char* unsupported_label; diff --git a/src/core/fullscreenui_achievements.cpp b/src/core/fullscreenui_achievements.cpp index f022b9dfd..9e8040662 100644 --- a/src/core/fullscreenui_achievements.cpp +++ b/src/core/fullscreenui_achievements.cpp @@ -1816,7 +1816,7 @@ void FullscreenUI::DrawAchievementsWindow() ImVec2(LAYOUT_MENU_WINDOW_X_PADDING, LAYOUT_MENU_WINDOW_Y_PADDING), 0)) { static bool buckets_collapsed[NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS] = {}; - static constexpr std::pair bucket_names[NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS] = { + static constexpr std::pair bucket_names[] = { {ICON_FA_CIRCLE_QUESTION, TRANSLATE_NOOP("Achievements", "Unknown")}, {ICON_FA_LOCK, TRANSLATE_NOOP("Achievements", "Locked")}, {ICON_FA_UNLOCK, TRANSLATE_NOOP("Achievements", "Unlocked")}, @@ -1826,15 +1826,18 @@ void FullscreenUI::DrawAchievementsWindow() {ICON_FA_HAND_FIST, TRANSLATE_NOOP("Achievements", "Active Challenges")}, {ICON_FA_FLAG_CHECKERED, TRANSLATE_NOOP("Achievements", "Almost There")}, {ICON_EMOJI_WARNING, TRANSLATE_NOOP("Achievements", "Not Confirmed")}, + {ICON_FA_UNLOCK, TRANSLATE_NOOP("Achievements", "Unlocked in Softcore")}, }; + static_assert(std::size(bucket_names) == NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS); ResetFocusHere(); BeginMenuButtons(); for (u32 bucket_type : {RC_CLIENT_ACHIEVEMENT_BUCKET_UNSYNCED, RC_CLIENT_ACHIEVEMENT_BUCKET_ACTIVE_CHALLENGE, RC_CLIENT_ACHIEVEMENT_BUCKET_RECENTLY_UNLOCKED, RC_CLIENT_ACHIEVEMENT_BUCKET_ALMOST_THERE, - RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED, RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED, - RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL, RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED}) + RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED, RC_CLIENT_ACHIEVEMENT_BUCKET_UNLOCKED_SOFTCORE, + RC_CLIENT_ACHIEVEMENT_BUCKET_LOCKED, RC_CLIENT_ACHIEVEMENT_BUCKET_UNOFFICIAL, + RC_CLIENT_ACHIEVEMENT_BUCKET_UNSUPPORTED}) { for (u32 bucket_idx = 0; bucket_idx < s_achievements_locals.achievement_list->num_buckets; bucket_idx++) {