@@ -887,27 +887,6 @@ void AchievementRuntime::UpdateActiveLeaderboards()
887887 }
888888}
889889
890- static rc_client_leaderboard_info_t * GetLeaderboardInfo (rc_client_t * pClient, ra::LeaderboardID nId) noexcept
891- {
892- if (!pClient || !pClient->game )
893- return nullptr ;
894-
895- rc_client_subset_info_t * subset = pClient->game ->subsets ;
896- for (; subset; subset = subset->next )
897- {
898- rc_client_leaderboard_info_t * leaderboard = subset->leaderboards ;
899- const rc_client_leaderboard_info_t * stop = leaderboard + subset->public_ .num_leaderboards ;
900-
901- for (; leaderboard < stop; ++leaderboard)
902- {
903- if (leaderboard->public_ .id == nId)
904- return leaderboard;
905- }
906- }
907-
908- return nullptr ;
909- }
910-
911890bool AchievementRuntime::HasRichPresence () const
912891{
913892 auto * pClient = ra::services::ServiceLocator::Get<ra::context::IRcClient>().GetClient ();
@@ -1307,74 +1286,92 @@ void AchievementRuntime::UnloadGame()
13071286
13081287/* ---- DoFrame ----- */
13091288
1310- static void PrepareForPauseOnChangeEvents (rc_client_t * pClient,
1311- std::vector<rc_client_achievement_info_t *>& vAchievementsWithHits,
1312- std::map<rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mLeaderboardsWithHits ,
1313- std::map<rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mActiveLeaderboards )
1289+ static void PrepareForPauseOnReset (const ra::data::context::GameAssets& pAssets,
1290+ std::vector<const rc_client_achievement_info_t *>& vAchievementsWithHits)
13141291{
1315- auto & pGameContext = ra::services::ServiceLocator::GetMutable<ra::data::context::GameContext>();
1316- for (auto & vmAsset : pGameContext.Assets ())
1292+ std::vector<const ra::data::models::AchievementModel*> vAchievements;
1293+ pAssets.GetPauseOnResetAchievements (vAchievements);
1294+
1295+ for (const auto * vmAchievement : vAchievements)
13171296 {
1318- const auto * vmAchievement = dynamic_cast <ra::data::models::AchievementModel*>(&vmAsset);
1319- if (vmAchievement != nullptr )
1297+ if (vmAchievement && vmAchievement->IsActive ())
13201298 {
1321- if (vmAchievement->IsPauseOnReset ())
1322- {
1323- auto * pAchievement = GetAchievementInfo (pClient, vmAchievement->GetID ());
1324- if (pAchievement && pAchievement->trigger && pAchievement->trigger ->has_hits )
1325- vAchievementsWithHits.push_back (pAchievement);
1326- }
1327-
1328- continue ;
1299+ const auto * pAchievement = vmAchievement->GetRuntimeTrigger ();
1300+ if (pAchievement != nullptr && pAchievement->has_hits )
1301+ vAchievementsWithHits.push_back (vmAchievement->GetRuntimeAchievementInfo ());
13291302 }
1303+ }
1304+ }
13301305
1331- const auto * vmLeaderboard = dynamic_cast <ra::data::models::LeaderboardModel*>(&vmAsset);
1332- if (vmLeaderboard != nullptr )
1333- {
1334- using namespace ra ::bitwise_ops;
1306+ static void PrepareForPauseOnReset (const ra::data::context::GameAssets& pAssets,
1307+ std::map<const rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mLeaderboardsWithHits )
1308+ {
1309+ std::vector<const ra::data::models::LeaderboardModel*> vLeaderboards;
1310+ pAssets.GetPauseOnResetLeaderboards (vLeaderboards);
13351311
1336- auto nPauseOnReset = vmLeaderboard->GetPauseOnReset ();
1337- if (nPauseOnReset != ra::data::models::LeaderboardModel::LeaderboardParts::None)
1312+ for (const auto * vmLeaderboard : vLeaderboards)
1313+ {
1314+ if (vmLeaderboard && vmLeaderboard->IsActive ())
1315+ {
1316+ const auto * pLeaderboard = vmLeaderboard->GetRuntimeLeaderboard ();
1317+ if (pLeaderboard != nullptr )
13381318 {
1339- auto * pLeaderboard = GetLeaderboardInfo (pClient, vmLeaderboard->GetID () );
1340- if (pLeaderboard && pLeaderboard-> lboard )
1319+ auto nPauseOnReset = vmLeaderboard->GetPauseOnReset ( );
1320+ if (nPauseOnReset != ra::data::models::LeaderboardModel::LeaderboardParts::None )
13411321 {
1342- if (!pLeaderboard->lboard ->start .has_hits )
1322+ using namespace ra ::bitwise_ops;
1323+
1324+ if (!pLeaderboard->start .has_hits )
13431325 nPauseOnReset &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Start;
1344- if (!pLeaderboard->lboard -> cancel .has_hits )
1326+ if (!pLeaderboard->cancel .has_hits )
13451327 nPauseOnReset &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Cancel;
1346- if (!pLeaderboard->lboard -> submit .has_hits )
1328+ if (!pLeaderboard->submit .has_hits )
13471329 nPauseOnReset &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Submit;
1348- if (!pLeaderboard->lboard -> value .value .value )
1330+ if (!pLeaderboard->value .value .value )
13491331 nPauseOnReset &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Value;
13501332
13511333 if (nPauseOnReset != ra::data::models::LeaderboardModel::LeaderboardParts::None)
1352- mLeaderboardsWithHits [pLeaderboard ] = nPauseOnReset;
1334+ mLeaderboardsWithHits [vmLeaderboard-> GetRuntimeLeaderboardInfo () ] = nPauseOnReset;
13531335 }
13541336 }
1337+ }
1338+ }
1339+ }
13551340
1356- auto nPauseOnTrigger = vmLeaderboard->GetPauseOnTrigger ();
1357- if (nPauseOnTrigger != ra::data::models::LeaderboardModel::LeaderboardParts::None)
1341+ static void PrepareForPauseOnTrigger (const ra::data::context::GameAssets& pAssets,
1342+ std::map<const rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mActiveLeaderboards )
1343+ {
1344+ std::vector<const ra::data::models::LeaderboardModel*> vLeaderboards;
1345+ pAssets.GetPauseOnTriggerLeaderboards (vLeaderboards);
1346+
1347+ for (const auto * vmLeaderboard : vLeaderboards)
1348+ {
1349+ if (vmLeaderboard && vmLeaderboard->IsActive ())
1350+ {
1351+ const auto * pLeaderboard = vmLeaderboard->GetRuntimeLeaderboard ();
1352+ if (pLeaderboard != nullptr )
13581353 {
1359- auto * pLeaderboard = GetLeaderboardInfo (pClient, vmLeaderboard->GetID () );
1360- if (pLeaderboard && pLeaderboard-> lboard )
1354+ auto nPauseOnTrigger = vmLeaderboard->GetPauseOnTrigger ( );
1355+ if (nPauseOnTrigger != ra::data::models::LeaderboardModel::LeaderboardParts::None )
13611356 {
1362- if (pLeaderboard->lboard ->start .state == RC_TRIGGER_STATE_TRIGGERED )
1357+ using namespace ra ::bitwise_ops;
1358+
1359+ if (pLeaderboard->start .state == RC_TRIGGER_STATE_TRIGGERED )
13631360 nPauseOnTrigger &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Start;
1364- if (pLeaderboard->lboard -> cancel .state == RC_TRIGGER_STATE_TRIGGERED )
1361+ if (pLeaderboard->cancel .state == RC_TRIGGER_STATE_TRIGGERED )
13651362 nPauseOnTrigger &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Cancel;
1366- if (pLeaderboard->lboard -> submit .state == RC_TRIGGER_STATE_TRIGGERED )
1363+ if (pLeaderboard->submit .state == RC_TRIGGER_STATE_TRIGGERED )
13671364 nPauseOnTrigger &= ~ra::data::models::LeaderboardModel::LeaderboardParts::Submit;
13681365
13691366 if (nPauseOnTrigger != ra::data::models::LeaderboardModel::LeaderboardParts::None)
1370- mActiveLeaderboards [pLeaderboard ] = nPauseOnTrigger;
1367+ mActiveLeaderboards [vmLeaderboard-> GetRuntimeLeaderboardInfo () ] = nPauseOnTrigger;
13711368 }
13721369 }
13731370 }
13741371 }
13751372}
13761373
1377- static void RaisePauseOnChangeEvents (std::vector<rc_client_achievement_info_t *>& vAchievementsWithHits)
1374+ static void RaisePauseOnChangeEvents (std::vector<const rc_client_achievement_info_t *>& vAchievementsWithHits)
13781375{
13791376 for (const auto * pAchievement : vAchievementsWithHits)
13801377 {
@@ -1387,8 +1384,7 @@ static void RaisePauseOnChangeEvents(std::vector<rc_client_achievement_info_t*>&
13871384}
13881385
13891386static void RaisePauseOnChangeEvents (
1390- std::map<rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mLeaderboardsWithHits ,
1391- std::map<rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mActiveLeaderboards )
1387+ std::map<const rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mLeaderboardsWithHits )
13921388{
13931389 for (auto pair : mLeaderboardsWithHits )
13941390 {
@@ -1437,7 +1433,11 @@ static void RaisePauseOnChangeEvents(
14371433 }
14381434 }
14391435 }
1436+ }
14401437
1438+ static void RaisePauseOnTriggerEvents (
1439+ std::map<const rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts>& mActiveLeaderboards )
1440+ {
14411441 for (auto pair : mActiveLeaderboards )
14421442 {
14431443 if (pair.first && pair.first ->lboard )
@@ -1491,18 +1491,30 @@ void AchievementRuntime::DoFrame()
14911491 return ;
14921492 }
14931493
1494- std::vector<rc_client_achievement_info_t *> vAchievementsWithHits;
1495- std::map<rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts> mLeaderboardsWithHits ;
1496- std::map<rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts> mActiveLeaderboards ;
1494+ const auto & pAssets = ra::services::ServiceLocator::GetMutable<ra::data::context::GameContext>().Assets ();
1495+ if (!pAssets.HasPauseOnXAssets ())
1496+ {
1497+ rc_client_do_frame (pClient);
1498+ return ;
1499+ }
1500+
1501+ std::vector<const rc_client_achievement_info_t *> vAchievementsWithHits;
1502+ PrepareForPauseOnReset (pAssets, vAchievementsWithHits);
1503+
1504+ std::map<const rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts> mLeaderboardsWithHits ;
1505+ PrepareForPauseOnReset (pAssets, mLeaderboardsWithHits );
14971506
1498- PrepareForPauseOnChangeEvents (pClient, vAchievementsWithHits, mLeaderboardsWithHits , mActiveLeaderboards );
1507+ std::map<const rc_client_leaderboard_info_t *, ra::data::models::LeaderboardModel::LeaderboardParts> mActiveLeaderboards ;
1508+ PrepareForPauseOnTrigger (pAssets, mActiveLeaderboards );
14991509
15001510 rc_client_do_frame (pClient);
15011511
15021512 if (!vAchievementsWithHits.empty ())
15031513 RaisePauseOnChangeEvents (vAchievementsWithHits);
1504- if (!mLeaderboardsWithHits .empty () || !mActiveLeaderboards .empty ())
1505- RaisePauseOnChangeEvents (mLeaderboardsWithHits , mActiveLeaderboards );
1514+ if (!mLeaderboardsWithHits .empty ())
1515+ RaisePauseOnChangeEvents (mLeaderboardsWithHits );
1516+ if (!mActiveLeaderboards .empty ())
1517+ RaisePauseOnTriggerEvents (mActiveLeaderboards );
15061518}
15071519
15081520void AchievementRuntime::Idle () const
0 commit comments