mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 16:02:26 +00:00
nptrophy: UnlockTrophy(), DestroyContext()
This commit is contained in:
parent
a0d580e348
commit
b8d7ea66c4
@ -440,11 +440,47 @@ constexpr int ORBIS_USER_SERVICE_ERROR_BUFFER_TOO_SHORT = 0x8096000A;
|
|||||||
constexpr int ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER = 0x80A10003;
|
constexpr int ORBIS_SYSTEM_SERVICE_ERROR_PARAMETER = 0x80A10003;
|
||||||
|
|
||||||
// NpTrophy library
|
// NpTrophy library
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_UNKNOWN = 0x80551600;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_NOT_INITIALIZED = 0x80551601;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_ALREADY_INITIALIZED = 0x80551602;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_OUT_OF_MEMORY = 0x80551603;
|
||||||
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80551604;
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT = 0x80551604;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INSUFFICIENT_BUFFER = 0x80551605;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_EXCEEDS_MAX = 0x80551606;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_ABORT = 0x80551607;
|
||||||
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80551608;
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE = 0x80551608;
|
||||||
constexpr int ORBIS_NP_TROPHY_ERROR_HANDLE_EXCEEDS_MAX = 0x80551624;
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT = 0x80551609;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_ID = 0x8055160A;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_GROUP_ID = 0x8055160B;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_TROPHY_ALREADY_UNLOCKED = 0x8055160C;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_PLATINUM_CANNOT_UNLOCK = 0x8055160D;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_ACCOUNTID_NOT_MATCH = 0x8055160E;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_NOT_REGISTERED = 0x8055160F;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_ALREADY_REGISTERED = 0x80551610;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_BROKEN_DATA = 0x80551611;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INSUFFICIENT_SPACE = 0x80551612;
|
||||||
constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_ALREADY_EXISTS = 0x80551613;
|
constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_ALREADY_EXISTS = 0x80551613;
|
||||||
constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_EXCEEDS_MAX = 0x80551622;
|
constexpr int ORBIS_NP_TROPHY_ERROR_ICON_FILE_NOT_FOUND = 0x80551614;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_TRP_FILE_FORMAT = 0x80551616;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_UNSUPPORTED_TRP_FILE = 0x80551617;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_CONF_FORMAT = 0x80551618;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_UNSUPPORTED_TROPHY_CONF = 0x80551619;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_TROPHY_NOT_UNLOCKED = 0x8055161A;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_USER_NOT_FOUND = 0x8055161C;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_USER_NOT_LOGGED_IN = 0x8055161D;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_USER_LOGOUT = 0x8055161E;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_USE_TRP_FOR_DEVELOPMENT = 0x8055161F;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_NP_SERVICE_LABEL = 0x80551621;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_NOT_SUPPORTED = 0x80551622;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_CONTEXT_EXCEEDS_MAX = 0x80551623;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_HANDLE_EXCEEDS_MAX = 0x80551624;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INVALID_USER_ID = 0x80551625;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_TITLE_CONF_NOT_INSTALLED = 0x80551626;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_BROKEN_TITLE_CONF = 0x80551627;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_INCONSISTENT_TITLE_CONF = 0x80551628;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_TITLE_BACKGROUND = 0x80551629;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_SCREENSHOT_DISABLED = 0x8055162B;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_ERROR_SCREENSHOT_DISPLAY_BUFFER_NOT_IN_USE = 0x8055162D;
|
||||||
|
|
||||||
// AvPlayer library
|
// AvPlayer library
|
||||||
constexpr int ORBIS_AVPLAYER_ERROR_INVALID_PARAMS = 0x806A0001;
|
constexpr int ORBIS_AVPLAYER_ERROR_INVALID_PARAMS = 0x806A0001;
|
||||||
|
@ -4,13 +4,17 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
#include "common/path_util.h"
|
||||||
#include "common/slot_vector.h"
|
#include "common/slot_vector.h"
|
||||||
#include "core/libraries/error_codes.h"
|
#include "core/libraries/error_codes.h"
|
||||||
#include "core/libraries/libs.h"
|
#include "core/libraries/libs.h"
|
||||||
|
#include "externals/pugixml/src/pugixml.hpp"
|
||||||
#include "np_trophy.h"
|
#include "np_trophy.h"
|
||||||
|
|
||||||
namespace Libraries::NpTrophy {
|
namespace Libraries::NpTrophy {
|
||||||
|
|
||||||
|
std::string game_serial;
|
||||||
|
|
||||||
static constexpr auto MaxTrophyHandles = 4u;
|
static constexpr auto MaxTrophyHandles = 4u;
|
||||||
static constexpr auto MaxTrophyContexts = 8u;
|
static constexpr auto MaxTrophyContexts = 8u;
|
||||||
|
|
||||||
@ -24,11 +28,11 @@ struct ContextKeyHash {
|
|||||||
struct TrophyContext {
|
struct TrophyContext {
|
||||||
u32 context_id;
|
u32 context_id;
|
||||||
};
|
};
|
||||||
static Common::SlotVector<u32> trophy_handles{};
|
static Common::SlotVector<OrbisNpTrophyHandle> trophy_handles{};
|
||||||
static Common::SlotVector<ContextKey> trophy_contexts{};
|
static Common::SlotVector<ContextKey> trophy_contexts{};
|
||||||
static std::unordered_map<ContextKey, TrophyContext, ContextKeyHash> contexts_internal{};
|
static std::unordered_map<ContextKey, TrophyContext, ContextKeyHash> contexts_internal{};
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyAbortHandle() {
|
int PS4_SYSV_ABI sceNpTrophyAbortHandle(OrbisNpTrophyHandle handle) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
@ -83,8 +87,8 @@ int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(u32* context, u32 user_id, u32 service_label,
|
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t user_id,
|
||||||
u64 options) {
|
uint32_t service_label, uint64_t options) {
|
||||||
ASSERT(options == 0ull);
|
ASSERT(options == 0ull);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT;
|
return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT;
|
||||||
@ -107,7 +111,7 @@ s32 PS4_SYSV_ABI sceNpTrophyCreateContext(u32* context, u32 user_id, u32 service
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(u32* handle) {
|
s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(OrbisNpTrophyHandle* handle) {
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT;
|
return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
@ -122,54 +126,90 @@ s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(u32* handle) {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyDestroyContext() {
|
int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_INFO(Lib_NpTrophy, "Destroyed Context {}", context);
|
||||||
|
|
||||||
|
if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT;
|
||||||
|
|
||||||
|
Common::SlotId contextId;
|
||||||
|
contextId.index = context;
|
||||||
|
|
||||||
|
ContextKey contextkey = trophy_contexts[contextId];
|
||||||
|
trophy_contexts.erase(contextId);
|
||||||
|
contexts_internal.erase(contextkey);
|
||||||
|
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(u32 handle) {
|
s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle) {
|
||||||
if (!trophy_handles.is_allocated({handle})) {
|
if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (!trophy_handles.is_allocated({static_cast<u32>(handle)})) {
|
||||||
return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE;
|
return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
trophy_handles.erase({handle});
|
trophy_handles.erase({static_cast<u32>(handle)});
|
||||||
LOG_INFO(Lib_NpTrophy, "Handle {} destroyed", handle);
|
LOG_INFO(Lib_NpTrophy, "Handle {} destroyed", handle);
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameIcon() {
|
int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
void* buffer, size_t* size) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameInfo() {
|
int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyGameDetails* details,
|
||||||
|
OrbisNpTrophyGameData* data) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon() {
|
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyGroupId groupId, void* buffer, size_t* size) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupInfo() {
|
int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyGroupId groupId,
|
||||||
|
OrbisNpTrophyGroupDetails* details,
|
||||||
|
OrbisNpTrophyGroupData* data) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon() {
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyId trophyId, void* buffer, size_t* size) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo() {
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyId trophyId, OrbisNpTrophyDetails* details,
|
||||||
|
OrbisNpTrophyData* data) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, u32* flags, u32* count) {
|
s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(OrbisNpTrophyContext context,
|
||||||
|
OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyFlagArray* flags, u32* count) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
*flags = 0u;
|
|
||||||
|
if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT;
|
||||||
|
|
||||||
|
if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (flags == nullptr || count == nullptr)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT;
|
||||||
|
|
||||||
|
// flags->flag_bits = 0u;
|
||||||
*count = 0;
|
*count = 0;
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
@ -239,8 +279,16 @@ int PS4_SYSV_ABI sceNpTrophyNumInfoGetTotal() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyRegisterContext() {
|
int PS4_SYSV_ABI sceNpTrophyRegisterContext(OrbisNpTrophyContext context,
|
||||||
|
OrbisNpTrophyHandle handle, uint64_t options) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
|
|
||||||
|
if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT;
|
||||||
|
|
||||||
|
if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +302,8 @@ int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyNum() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyShowTrophyList() {
|
int PS4_SYSV_ABI sceNpTrophyShowTrophyList(OrbisNpTrophyContext context,
|
||||||
|
OrbisNpTrophyHandle handle) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
@ -474,8 +523,73 @@ int PS4_SYSV_ABI sceNpTrophySystemSetDbgParamInt() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyUnlockTrophy() {
|
int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
OrbisNpTrophyId trophyId, OrbisNpTrophyId* platinumId) {
|
||||||
|
LOG_INFO(Lib_NpTrophy, "Unlocking trophy id {}", trophyId);
|
||||||
|
|
||||||
|
if (context == ORBIS_NP_TROPHY_INVALID_CONTEXT)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_CONTEXT;
|
||||||
|
|
||||||
|
if (handle == ORBIS_NP_TROPHY_INVALID_HANDLE)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (trophyId >= 127)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_TROPHY_ID;
|
||||||
|
|
||||||
|
if (platinumId == nullptr)
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_INVALID_ARGUMENT;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
const auto trophyDir =
|
||||||
|
Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles";
|
||||||
|
#else
|
||||||
|
const auto trophyDir =
|
||||||
|
Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pugi::xml_document doc;
|
||||||
|
pugi::xml_parse_result result =
|
||||||
|
doc.load_file((trophyDir.string() + "\\trophy00\\Xml\\TROP.XML").c_str());
|
||||||
|
|
||||||
|
// only do this if platinum is not unlocked
|
||||||
|
*platinumId = ORBIS_NP_TROPHY_INVALID_TROPHY_ID;
|
||||||
|
// check if all trophies are unlocked and if they are unlock plat and set its ID
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
bool foundTrophy = false;
|
||||||
|
auto trophyconf = doc.child("trophyconf");
|
||||||
|
for (pugi::xml_node_iterator it = trophyconf.children().begin();
|
||||||
|
it != trophyconf.children().end() && !foundTrophy; ++it) {
|
||||||
|
|
||||||
|
std::string childTrophyId = reinterpret_cast<const char*>(it->attribute("id").value());
|
||||||
|
std::string childTrophyName = reinterpret_cast<const char*>(it->name());
|
||||||
|
std::string childTrophyType =
|
||||||
|
reinterpret_cast<const char*>(it->attribute("ttype").value());
|
||||||
|
std::string childTrophyUnlockState =
|
||||||
|
reinterpret_cast<const char*>(it->attribute("unlockstate").value());
|
||||||
|
|
||||||
|
if (std::string(childTrophyName) == "trophy" && std::stoi(childTrophyId) == trophyId) {
|
||||||
|
LOG_INFO(Lib_NpTrophy, "Found trophy to unlock {} : {}",
|
||||||
|
it->child("name").text().as_string(),
|
||||||
|
it->child("detail").text().as_string());
|
||||||
|
if (childTrophyUnlockState == "unlocked") {
|
||||||
|
LOG_INFO(Lib_NpTrophy, "Trophy already unlocked");
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_TROPHY_ALREADY_UNLOCKED;
|
||||||
|
} else {
|
||||||
|
if (std::string(it->attribute("unlockstate").value()).empty()) {
|
||||||
|
it->append_attribute("unlockstate") = "unlocked";
|
||||||
|
} else {
|
||||||
|
it->attribute("unlockstate").set_value("unlocked");
|
||||||
|
}
|
||||||
|
|
||||||
|
doc.save_file((trophyDir.string() + "\\trophy00\\Xml\\TROP.XML").c_str());
|
||||||
|
}
|
||||||
|
foundTrophy = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
LOG_INFO(Lib_NpTrophy, "couldnt parse xml : {}", result.description());
|
||||||
|
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/types.h"
|
#include "common/types.h"
|
||||||
|
#include "core/libraries/rtc/rtc.h"
|
||||||
|
|
||||||
namespace Core::Loader {
|
namespace Core::Loader {
|
||||||
class SymbolsResolver;
|
class SymbolsResolver;
|
||||||
@ -11,7 +12,110 @@ class SymbolsResolver;
|
|||||||
|
|
||||||
namespace Libraries::NpTrophy {
|
namespace Libraries::NpTrophy {
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyAbortHandle();
|
extern std::string game_serial;
|
||||||
|
|
||||||
|
constexpr int ORBIS_NP_TROPHY_FLAG_SETSIZE = 128;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_FLAG_BITS_SHIFT = 5;
|
||||||
|
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GAME_TITLE_MAX_SIZE = 128;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GAME_DESCR_MAX_SIZE = 1024;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GROUP_TITLE_MAX_SIZE = 128;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GROUP_DESCR_MAX_SIZE = 1024;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_NAME_MAX_SIZE = 128;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_DESCR_MAX_SIZE = 1024;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_NUM_MAX = 128;
|
||||||
|
|
||||||
|
constexpr int ORBIS_NP_TROPHY_INVALID_HANDLE = -1;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_INVALID_CONTEXT = -1;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_INVALID_TROPHY_ID = -1;
|
||||||
|
|
||||||
|
typedef int32_t OrbisNpTrophyHandle;
|
||||||
|
typedef int32_t OrbisNpTrophyContext;
|
||||||
|
typedef int32_t OrbisNpTrophyId;
|
||||||
|
typedef uint32_t OrbisNpTrophyFlagMask;
|
||||||
|
|
||||||
|
struct OrbisNpTrophyFlagArray {
|
||||||
|
OrbisNpTrophyFlagMask
|
||||||
|
flag_bits[ORBIS_NP_TROPHY_FLAG_SETSIZE >> ORBIS_NP_TROPHY_FLAG_BITS_SHIFT];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OrbisNpTrophyData {
|
||||||
|
size_t size;
|
||||||
|
OrbisNpTrophyId trophyId;
|
||||||
|
bool unlocked;
|
||||||
|
uint8_t reserved[3];
|
||||||
|
Rtc::OrbisRtcTick timestamp;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef int32_t OrbisNpTrophyGrade;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GRADE_UNKNOWN = 0;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GRADE_PLATINUM = 1;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GRADE_GOLD = 2;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GRADE_SILVER = 3;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_GRADE_BRONZE = 4;
|
||||||
|
|
||||||
|
typedef int32_t OrbisNpTrophyGroupId;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_BASE_GAME_GROUP_ID = -1;
|
||||||
|
constexpr int ORBIS_NP_TROPHY_INVALID_GROUP_ID = -2;
|
||||||
|
|
||||||
|
struct OrbisNpTrophyDetails {
|
||||||
|
size_t size;
|
||||||
|
OrbisNpTrophyId trophyId;
|
||||||
|
OrbisNpTrophyGrade trophyGrade;
|
||||||
|
OrbisNpTrophyGroupId groupId;
|
||||||
|
bool hidden;
|
||||||
|
uint8_t reserved[3];
|
||||||
|
char name[ORBIS_NP_TROPHY_NAME_MAX_SIZE];
|
||||||
|
char description[ORBIS_NP_TROPHY_DESCR_MAX_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OrbisNpTrophyGameData {
|
||||||
|
size_t size;
|
||||||
|
uint32_t unlockedTrophies;
|
||||||
|
uint32_t unlockedPlatinum;
|
||||||
|
uint32_t unlockedGold;
|
||||||
|
uint32_t unlockedSilver;
|
||||||
|
uint32_t unlockedBronze;
|
||||||
|
uint32_t progressPercentage;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OrbisNpTrophyGameDetails {
|
||||||
|
size_t size;
|
||||||
|
uint32_t numGroups;
|
||||||
|
uint32_t numTrophies;
|
||||||
|
uint32_t numPlatinum;
|
||||||
|
uint32_t numGold;
|
||||||
|
uint32_t numSilver;
|
||||||
|
uint32_t numBronze;
|
||||||
|
char title[ORBIS_NP_TROPHY_GAME_TITLE_MAX_SIZE];
|
||||||
|
char description[ORBIS_NP_TROPHY_GAME_DESCR_MAX_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OrbisNpTrophyGroupData {
|
||||||
|
size_t size;
|
||||||
|
OrbisNpTrophyGroupId groupId;
|
||||||
|
uint32_t unlockedTrophies;
|
||||||
|
uint32_t unlockedPlatinum;
|
||||||
|
uint32_t unlockedGold;
|
||||||
|
uint32_t unlockedSilver;
|
||||||
|
uint32_t unlockedBronze;
|
||||||
|
uint32_t progressPercentage;
|
||||||
|
uint8_t reserved[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct OrbisNpTrophyGroupDetails {
|
||||||
|
size_t size;
|
||||||
|
OrbisNpTrophyGroupId groupId;
|
||||||
|
uint32_t numTrophies;
|
||||||
|
uint32_t numPlatinum;
|
||||||
|
uint32_t numGold;
|
||||||
|
uint32_t numSilver;
|
||||||
|
uint32_t numBronze;
|
||||||
|
char title[ORBIS_NP_TROPHY_GROUP_TITLE_MAX_SIZE];
|
||||||
|
char description[ORBIS_NP_TROPHY_GROUP_DESCR_MAX_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
int PS4_SYSV_ABI sceNpTrophyAbortHandle(OrbisNpTrophyHandle handle);
|
||||||
int PS4_SYSV_ABI sceNpTrophyCaptureScreenshot();
|
int PS4_SYSV_ABI sceNpTrophyCaptureScreenshot();
|
||||||
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyDetails();
|
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyDetails();
|
||||||
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyFlagArray();
|
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyFlagArray();
|
||||||
@ -22,18 +126,30 @@ int PS4_SYSV_ABI sceNpTrophyConfigGetTrophySetInfoInGroup();
|
|||||||
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophySetVersion();
|
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophySetVersion();
|
||||||
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyTitleDetails();
|
int PS4_SYSV_ABI sceNpTrophyConfigGetTrophyTitleDetails();
|
||||||
int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature();
|
int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature();
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(u32* context, u32 user_id, u32 service_label,
|
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t user_id,
|
||||||
u64 options);
|
uint32_t service_label, uint64_t options);
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(u32* handle);
|
s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(OrbisNpTrophyHandle* handle);
|
||||||
int PS4_SYSV_ABI sceNpTrophyDestroyContext();
|
int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context);
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(u32 handle);
|
s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameIcon();
|
int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameInfo();
|
void* buffer, size_t* size);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon();
|
int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupInfo();
|
OrbisNpTrophyGameDetails* details,
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon();
|
OrbisNpTrophyGameData* data);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo();
|
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, u32* flags, u32* count);
|
OrbisNpTrophyGroupId groupId, void* buffer, size_t* size);
|
||||||
|
int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyGroupId groupId,
|
||||||
|
OrbisNpTrophyGroupDetails* details,
|
||||||
|
OrbisNpTrophyGroupData* data);
|
||||||
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyId trophyId, void* buffer, size_t* size);
|
||||||
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyId trophyId, OrbisNpTrophyDetails* details,
|
||||||
|
OrbisNpTrophyData* data);
|
||||||
|
s32 PS4_SYSV_ABI sceNpTrophyGetTrophyUnlockState(OrbisNpTrophyContext context,
|
||||||
|
OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyFlagArray* flags, u32* count);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGroupArrayGetNum();
|
int PS4_SYSV_ABI sceNpTrophyGroupArrayGetNum();
|
||||||
int PS4_SYSV_ABI sceNpTrophyIntAbortHandle();
|
int PS4_SYSV_ABI sceNpTrophyIntAbortHandle();
|
||||||
int PS4_SYSV_ABI sceNpTrophyIntCheckNetSyncTitles();
|
int PS4_SYSV_ABI sceNpTrophyIntCheckNetSyncTitles();
|
||||||
@ -47,10 +163,12 @@ int PS4_SYSV_ABI sceNpTrophyIntGetTrpIconByUri();
|
|||||||
int PS4_SYSV_ABI sceNpTrophyIntNetSyncTitle();
|
int PS4_SYSV_ABI sceNpTrophyIntNetSyncTitle();
|
||||||
int PS4_SYSV_ABI sceNpTrophyIntNetSyncTitles();
|
int PS4_SYSV_ABI sceNpTrophyIntNetSyncTitles();
|
||||||
int PS4_SYSV_ABI sceNpTrophyNumInfoGetTotal();
|
int PS4_SYSV_ABI sceNpTrophyNumInfoGetTotal();
|
||||||
int PS4_SYSV_ABI sceNpTrophyRegisterContext();
|
int PS4_SYSV_ABI sceNpTrophyRegisterContext(OrbisNpTrophyContext context,
|
||||||
|
OrbisNpTrophyHandle handle, uint64_t options);
|
||||||
int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyFlagArray();
|
int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyFlagArray();
|
||||||
int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyNum();
|
int PS4_SYSV_ABI sceNpTrophySetInfoGetTrophyNum();
|
||||||
int PS4_SYSV_ABI sceNpTrophyShowTrophyList();
|
int PS4_SYSV_ABI sceNpTrophyShowTrophyList(OrbisNpTrophyContext context,
|
||||||
|
OrbisNpTrophyHandle handle);
|
||||||
int PS4_SYSV_ABI sceNpTrophySystemAbortHandle();
|
int PS4_SYSV_ABI sceNpTrophySystemAbortHandle();
|
||||||
int PS4_SYSV_ABI sceNpTrophySystemBuildGroupIconUri();
|
int PS4_SYSV_ABI sceNpTrophySystemBuildGroupIconUri();
|
||||||
int PS4_SYSV_ABI sceNpTrophySystemBuildNetTrophyIconUri();
|
int PS4_SYSV_ABI sceNpTrophySystemBuildNetTrophyIconUri();
|
||||||
@ -94,7 +212,8 @@ int PS4_SYSV_ABI sceNpTrophySystemRemoveTitleData();
|
|||||||
int PS4_SYSV_ABI sceNpTrophySystemRemoveUserData();
|
int PS4_SYSV_ABI sceNpTrophySystemRemoveUserData();
|
||||||
int PS4_SYSV_ABI sceNpTrophySystemSetDbgParam();
|
int PS4_SYSV_ABI sceNpTrophySystemSetDbgParam();
|
||||||
int PS4_SYSV_ABI sceNpTrophySystemSetDbgParamInt();
|
int PS4_SYSV_ABI sceNpTrophySystemSetDbgParamInt();
|
||||||
int PS4_SYSV_ABI sceNpTrophyUnlockTrophy();
|
int PS4_SYSV_ABI sceNpTrophyUnlockTrophy(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
|
OrbisNpTrophyId trophyId, OrbisNpTrophyId* platinumId);
|
||||||
int PS4_SYSV_ABI Func_149656DA81D41C59();
|
int PS4_SYSV_ABI Func_149656DA81D41C59();
|
||||||
int PS4_SYSV_ABI Func_9F80071876FFA5F6();
|
int PS4_SYSV_ABI Func_9F80071876FFA5F6();
|
||||||
int PS4_SYSV_ABI Func_F8EF6F5350A91990();
|
int PS4_SYSV_ABI Func_F8EF6F5350A91990();
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "core/libraries/libc_internal/libc_internal.h"
|
#include "core/libraries/libc_internal/libc_internal.h"
|
||||||
#include "core/libraries/libs.h"
|
#include "core/libraries/libs.h"
|
||||||
#include "core/libraries/ngs2/ngs2.h"
|
#include "core/libraries/ngs2/ngs2.h"
|
||||||
|
#include "core/libraries/np_trophy/np_trophy.h"
|
||||||
#include "core/libraries/rtc/rtc.h"
|
#include "core/libraries/rtc/rtc.h"
|
||||||
#include "core/libraries/videoout/video_out.h"
|
#include "core/libraries/videoout/video_out.h"
|
||||||
#include "core/linker.h"
|
#include "core/linker.h"
|
||||||
@ -99,6 +100,7 @@ void Emulator::Run(const std::filesystem::path& file) {
|
|||||||
auto* param_sfo = Common::Singleton<PSF>::Instance();
|
auto* param_sfo = Common::Singleton<PSF>::Instance();
|
||||||
param_sfo->open(sce_sys_folder.string() + "/param.sfo", {});
|
param_sfo->open(sce_sys_folder.string() + "/param.sfo", {});
|
||||||
id = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9);
|
id = std::string(param_sfo->GetString("CONTENT_ID"), 7, 9);
|
||||||
|
Libraries::NpTrophy::game_serial = id;
|
||||||
#ifdef ENABLE_QT_GUI
|
#ifdef ENABLE_QT_GUI
|
||||||
MemoryPatcher::g_game_serial = id;
|
MemoryPatcher::g_game_serial = id;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user