mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-12-09 13:19:00 +00:00
Trophy fixes IXXXX (#3653)
* fixing missing trophy files extraction * implemented sceNpTrophyGetGameIcon * adjustments * improvements * argg * added assert * done * fixed compiling
This commit is contained in:
@@ -105,7 +105,7 @@ bool TRP::Extract(const std::filesystem::path& trophyPath, const std::string tit
|
|||||||
TrpEntry entry;
|
TrpEntry entry;
|
||||||
file.Read(entry);
|
file.Read(entry);
|
||||||
std::string_view name(entry.entry_name);
|
std::string_view name(entry.entry_name);
|
||||||
if (entry.flag == 0 && name.find("TROP") != std::string::npos) { // PNG
|
if (entry.flag == 0) { // PNG
|
||||||
if (!file.Seek(entry.entry_pos)) {
|
if (!file.Seek(entry.entry_pos)) {
|
||||||
LOG_CRITICAL(Common_Filesystem, "Failed to seek to TRP entry offset");
|
LOG_CRITICAL(Common_Filesystem, "Failed to seek to TRP entry offset");
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "core/libraries/np/np_trophy.h"
|
#include "core/libraries/np/np_trophy.h"
|
||||||
#include "core/libraries/np/np_trophy_error.h"
|
#include "core/libraries/np/np_trophy_error.h"
|
||||||
#include "core/libraries/np/trophy_ui.h"
|
#include "core/libraries/np/trophy_ui.h"
|
||||||
|
#include "core/memory.h"
|
||||||
|
|
||||||
namespace Libraries::Np::NpTrophy {
|
namespace Libraries::Np::NpTrophy {
|
||||||
|
|
||||||
@@ -148,8 +149,8 @@ int PS4_SYSV_ABI sceNpTrophyConfigHasGroupFeature() {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, int32_t user_id,
|
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, s32 user_id,
|
||||||
uint32_t service_label, uint64_t options) {
|
uint32_t service_label, u64 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;
|
||||||
@@ -230,9 +231,34 @@ s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle) {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 ReadFile(Common::FS::IOFile& file, void* buf, u64 nbytes) {
|
||||||
|
const auto* memory = Core::Memory::Instance();
|
||||||
|
// Invalidate up to the actual number of bytes that could be read.
|
||||||
|
const auto remaining = file.GetSize() - file.Tell();
|
||||||
|
memory->InvalidateMemory(reinterpret_cast<VAddr>(buf), std::min<u64>(nbytes, remaining));
|
||||||
|
|
||||||
|
return file.ReadRaw<u8>(buf, nbytes);
|
||||||
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
void* buffer, size_t* size) {
|
void* buffer, u64* size) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
ASSERT(size != nullptr);
|
||||||
|
const auto trophy_dir =
|
||||||
|
Common::FS::GetUserPath(Common::FS::PathType::MetaDataDir) / game_serial / "TrophyFiles";
|
||||||
|
auto icon_file = trophy_dir / "trophy00" / "Icons" / "ICON0.PNG";
|
||||||
|
|
||||||
|
Common::FS::IOFile icon(icon_file, Common::FS::FileAccessMode::Read);
|
||||||
|
if (!icon.IsOpen()) {
|
||||||
|
LOG_ERROR(Lib_NpTrophy, "Failed to open trophy icon file: {}", icon_file.string());
|
||||||
|
return ORBIS_NP_TROPHY_ERROR_ICON_FILE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
u64 icon_size = icon.GetSize();
|
||||||
|
|
||||||
|
if (buffer != nullptr) {
|
||||||
|
ReadFile(icon, buffer, *size);
|
||||||
|
} else {
|
||||||
|
*size = icon_size;
|
||||||
|
}
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,7 +355,7 @@ int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTro
|
|||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyGroupId groupId, void* buffer, size_t* size) {
|
OrbisNpTrophyGroupId groupId, void* buffer, u64* size) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
@@ -436,7 +462,7 @@ int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTr
|
|||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyId trophyId, void* buffer, size_t* size) {
|
OrbisNpTrophyId trophyId, void* buffer, u64* size) {
|
||||||
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
LOG_ERROR(Lib_NpTrophy, "(STUBBED) called");
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,24 +132,24 @@ 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(OrbisNpTrophyContext* context, int32_t user_id,
|
s32 PS4_SYSV_ABI sceNpTrophyCreateContext(OrbisNpTrophyContext* context, s32 user_id,
|
||||||
u32 service_label, uint64_t options);
|
u32 service_label, u64 options);
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(OrbisNpTrophyHandle* handle);
|
s32 PS4_SYSV_ABI sceNpTrophyCreateHandle(OrbisNpTrophyHandle* handle);
|
||||||
int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context);
|
int PS4_SYSV_ABI sceNpTrophyDestroyContext(OrbisNpTrophyContext context);
|
||||||
s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle);
|
s32 PS4_SYSV_ABI sceNpTrophyDestroyHandle(OrbisNpTrophyHandle handle);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetGameIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
void* buffer, size_t* size);
|
void* buffer, u64* size);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetGameInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyGameDetails* details,
|
OrbisNpTrophyGameDetails* details,
|
||||||
OrbisNpTrophyGameData* data);
|
OrbisNpTrophyGameData* data);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetGroupIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyGroupId groupId, void* buffer, size_t* size);
|
OrbisNpTrophyGroupId groupId, void* buffer, u64* size);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetGroupInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyGroupId groupId,
|
OrbisNpTrophyGroupId groupId,
|
||||||
OrbisNpTrophyGroupDetails* details,
|
OrbisNpTrophyGroupDetails* details,
|
||||||
OrbisNpTrophyGroupData* data);
|
OrbisNpTrophyGroupData* data);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyIcon(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyId trophyId, void* buffer, size_t* size);
|
OrbisNpTrophyId trophyId, void* buffer, u64* size);
|
||||||
int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
int PS4_SYSV_ABI sceNpTrophyGetTrophyInfo(OrbisNpTrophyContext context, OrbisNpTrophyHandle handle,
|
||||||
OrbisNpTrophyId trophyId, OrbisNpTrophyDetails* details,
|
OrbisNpTrophyId trophyId, OrbisNpTrophyDetails* details,
|
||||||
OrbisNpTrophyData* data);
|
OrbisNpTrophyData* data);
|
||||||
|
|||||||
Reference in New Issue
Block a user