@@ -116,7 +116,7 @@ bool GameContext::BeginLoadGame(unsigned int nGameId, Mode nMode, bool& bWasPaus
116116 // reset the GameContext
117117 m_nMode = nMode;
118118 m_sGameTitle.clear ();
119- m_vSubsets. clear ();
119+ m_vAssets. ClearAchievementSets ();
120120 m_vAssets.ResetLocalId ();
121121
122122 m_vAssets.BeginUpdate ();
@@ -293,7 +293,7 @@ void GameContext::EndLoadGame(int nResult, bool bWasPaused, bool bShowSoftcoreWa
293293 // activate rich presence (or remove if not defined)
294294 if (pRichPresence && nResult == RC_OK )
295295 {
296- pRichPresence->SetSubsetID (m_vSubsets. front ().AchievementSetID ());
296+ pRichPresence->SetSubsetID (Assets (). AchievementSets ().GetItemAt ( 0 )-> GetID ());
297297
298298 // if the server value differs from the local value, the model will appear as Unpublished
299299 if (pRichPresence->GetChanges () != ra::data::models::AssetChanges::None)
@@ -501,11 +501,6 @@ void GameContext::InitializeFromAchievementRuntime(const std::map<uint32_t, std:
501501
502502void GameContext::InitializeSubsets (const rc_api_fetch_game_sets_response_t * game_data_response)
503503{
504- Expects (game_data_response != nullptr );
505-
506- std::lock_guard<std::mutex> lock (m_mLoadMutex);
507- m_vSubsets.clear ();
508-
509504 // GameID dictates which game is loaded for purposes of local achievement storage and memory notes
510505 m_nGameId = GetRealGameId (game_data_response->id );
511506 // ActiveGameID dictates which game is running for purposes of rich presence and pings
@@ -516,69 +511,34 @@ void GameContext::InitializeSubsets(const rc_api_fetch_game_sets_response_t* gam
516511 ra::services::ServiceLocator::GetMutable<ra::data::context::SessionTracker>().BeginSession (nActiveGameId);
517512 }
518513
519- for (uint32_t i = 0 ; i < game_data_response->num_sets ; ++i)
520- {
521- const auto * pSet = &game_data_response->sets [i];
522- if (pSet->type == RC_ACHIEVEMENT_SET_TYPE_CORE )
523- {
524- // core subset should always be first
525- m_vSubsets.insert (m_vSubsets.begin (),
526- Subset (pSet->id , GetRealGameId (pSet->game_id ),
527- ra::util::String::Widen (pSet->title ), SubsetType::Core));
528- }
529- else
530- {
531- SubsetType nType = SubsetType::Bonus;
532- switch (pSet->type )
533- {
534- case RC_ACHIEVEMENT_SET_TYPE_EXCLUSIVE :
535- nType = SubsetType::Exclusive;
536- break ;
537- case RC_ACHIEVEMENT_SET_TYPE_SPECIALTY :
538- nType = SubsetType::Specialty;
539- break ;
540- default :
541- nType = SubsetType::Bonus;
542- break ;
543- }
544- m_vSubsets.emplace_back (pSet->id , GetRealGameId (pSet->game_id ),
545- ra::util::String::Widen (pSet->title ), nType);
546- }
547- }
514+ Assets ().InitializeSubsets (game_data_response, m_nActiveGameId != m_nGameId);
548515
549516 // if subsets were found, migrate any SUBSET-User.txt files into the the GAME-User.txt file
550- if (m_vSubsets.size () > 1 )
551- {
517+ if (Assets ().AchievementSets ().Count () > 1 )
552518 MigrateSubsetUserFiles ();
553- }
554- else if (m_nActiveGameId != m_nGameId)
555- {
556- m_vSubsets.front ().SetTitle (ra::util::String::Printf (L" %s (%s)" ,
557- m_vSubsets.front ().Title (), game_data_response->title ));
558- }
559519}
560520
561521void GameContext::MigrateSubsetUserFiles ()
562522{
563523 auto & pLocalStorage = ra::services::ServiceLocator::GetMutable<ra::services::ILocalStorage>();
564524 std::unique_ptr<ra::services::TextWriter> pGameData;
565525
566- for (size_t i = 1 ; i < m_vSubsets. size (); ++i )
526+ for (const auto & pSubset : Assets (). AchievementSets () )
567527 {
568- const auto & pSubset = m_vSubsets. at (i);
569- Expects (pSubset. GameID () != m_nGameId) ;
528+ if ( pSubset. GetBackingGameID () == m_nGameId)
529+ continue ;
570530
571531 auto pSubsetData = pLocalStorage.ReadText (ra::services::StorageItemType::UserAchievements,
572- std::to_wstring (pSubset.GameID ()));
532+ std::to_wstring (pSubset.GetBackingGameID ()));
573533 if (pSubsetData)
574534 {
575535 // replace ID with "0|SUBSETID" so new IDs will be generated
576- std::string sSubsetReplace = " 0|" + std::to_string (pSubset.AchievementSetID ());
536+ std::string sSubsetReplace = " 0|" + std::to_string (pSubset.GetID ());
577537
578538 if (!pGameData)
579539 {
580540 pGameData = pLocalStorage.AppendText (ra::services::StorageItemType::UserAchievements,
581- std::to_wstring (m_nGameId));
541+ std::to_wstring (m_nGameId));
582542 if (!pGameData)
583543 {
584544 RA_LOG_ERR (" Could not append to %u-User.txt" , m_nGameId);
@@ -622,17 +582,17 @@ void GameContext::MigrateSubsetUserFiles()
622582 // release the file so it can be deleted, then delete it.
623583 pSubsetData.reset ();
624584 pLocalStorage.Delete (ra::services::StorageItemType::UserAchievements,
625- std::to_wstring (pSubset.GameID ()));
585+ std::to_wstring (pSubset.GetBackingGameID ()));
626586 }
627587 }
628588}
629589
630590uint32_t GameContext::GetGameId (uint32_t nSubsetId) const noexcept
631591{
632- for (const auto & pSubset : m_vSubsets )
592+ for (const auto & pSubset : Assets (). AchievementSets () )
633593 {
634- if (pSubset.ID () == nSubsetId)
635- return pSubset.GameID ();
594+ if (pSubset.GetID () == nSubsetId)
595+ return pSubset.GetBackingGameID ();
636596 }
637597
638598 return GameId ();
0 commit comments