Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 2 additions & 13 deletions src/services/AchievementRuntime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1584,24 +1584,13 @@ void AchievementRuntime::InvalidateAddress(ra::data::ByteAddress nAddress)

static void HandleAchievementTriggeredEvent(const rc_client_achievement_t& pAchievement)
{
auto& pGameContext = ra::services::ServiceLocator::GetMutable<ra::data::context::GameContext>();
auto* vmAchievement = pGameContext.Assets().FindAchievement(pAchievement.id);
const auto* vmAchievement = CheckForPauseOnTrigger(pAchievement);
if (!vmAchievement)
{
RA_LOG_ERR("Received achievement triggered event for unknown achievement %u", pAchievement.id);
return;
}

// immediately update the state to Triggered (instead of waiting for AssetListViewModel::DoFrame to do it).
// this captures the unlock time and rich presence state, even if KeepActive it selected.
vmAchievement->SetState(ra::data::models::AssetState::Triggered);

if (vmAchievement->IsPauseOnTrigger())
{
auto& pFrameEventQueue = ra::services::ServiceLocator::GetMutable<ra::services::FrameEventQueue>();
pFrameEventQueue.QueuePauseOnTrigger(vmAchievement->GetName());
}

const auto& pConfiguration = ra::services::ServiceLocator::Get<ra::services::IConfiguration>();
bool bTakeScreenshot = pConfiguration.IsFeatureEnabled(ra::services::Feature::AchievementTriggeredScreenshot);
bool bSubmit = false;
Expand Down Expand Up @@ -1648,7 +1637,7 @@ static void HandleAchievementTriggeredEvent(const rc_client_achievement_t& pAchi
bTakeScreenshot = false;
}

if (bSubmit && pGameContext.GetMode() == ra::data::context::GameContext::Mode::CompatibilityTest)
if (bSubmit && ra::services::ServiceLocator::Get<ra::data::context::GameContext>().GetMode() == ra::data::context::GameContext::Mode::CompatibilityTest)
{
std::wstring sHeader = vmPopup->GetTitle();
sHeader.insert(0, L"Test ");
Expand Down
29 changes: 28 additions & 1 deletion src/services/AchievementRuntimeExports.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "AchievementRuntime.hh"
#include "AchievementRuntimeExports.hh"

#include "Exports.hh"
#include "util\Log.hh"
Expand All @@ -11,6 +12,7 @@

#include "data\context\GameContext.hh"

#include "services\FrameEventQueue.hh"
#include "services\IConfiguration.hh"
#include "services\ServiceLocator.hh"
#include "services\impl\JsonFileConfiguration.hh"
Expand Down Expand Up @@ -850,8 +852,13 @@ class AchievementRuntimeExports : private AchievementRuntime
s_callbacks.log_callback(sMessage, s_callbacks.log_client);
}

static void EventHandlerExternal(const rc_client_event_t* event, rc_client_t*) noexcept(false)
static void EventHandlerExternal(const rc_client_event_t* event, rc_client_t*)
{
Expects(event != nullptr);

if (event->type == RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED)
CheckForPauseOnTrigger(*event->achievement);

if (s_callbacks.event_handler)
s_callbacks.event_handler(event, s_callbacks.event_client);
}
Expand Down Expand Up @@ -1030,6 +1037,26 @@ std::array<AchievementRuntimeExports::MemoryBlockWrapper, 16> AchievementRuntime
} // namespace services
} // namespace ra

const ra::data::models::AchievementModel* CheckForPauseOnTrigger(const rc_client_achievement_t& pAchievement)
{
auto& pGameContext = ra::services::ServiceLocator::GetMutable<ra::data::context::GameContext>();
auto* vmAchievement = pGameContext.Assets().FindAchievement(pAchievement.id);
if (vmAchievement)
{
// immediately update the state to Triggered (instead of waiting for AssetListViewModel::DoFrame to do it).
// this captures the unlock time and rich presence state, even if KeepActive it selected.
vmAchievement->SetState(ra::data::models::AssetState::Triggered);

if (vmAchievement->IsPauseOnTrigger())
{
auto& pFrameEventQueue = ra::services::ServiceLocator::GetMutable<ra::services::FrameEventQueue>();
pFrameEventQueue.QueuePauseOnTrigger(vmAchievement->GetName());
}
}

return vmAchievement;
}

void ResetExternalRcheevosClient() noexcept
{
ra::services::AchievementRuntimeExports::destroy();
Expand Down
8 changes: 7 additions & 1 deletion src/services/AchievementRuntimeExports.hh
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@
#define RA_SERVICES_ACHIEVEMENT_RUNTIME_EXPORTS_HH
#pragma once

void RaiseClientExternalMenuChanged();
#include "data/models/AchievementModel.hh"

#include <rcheevos/include/rc_client.h>

void RaiseClientExternalMenuChanged() noexcept;
void SyncClientExternalRAIntegrationMenuItem(int nMenuItemId);
void SyncClientExternalHardcoreState();
bool IsExternalRcheevosClient() noexcept;
void ResetExternalRcheevosClient() noexcept;
void ResetEmulatorMemoryRegionsForRcheevosClient();

const ra::data::models::AchievementModel* CheckForPauseOnTrigger(const rc_client_achievement_t& pAchievement);

#endif // !RA_SERVICES_ACHIEVEMENT_RUNTIME_EXPORTS_HH
Loading