From a529a16822e69627cd896585ffbdec63612ab68f Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 27 Jan 2024 01:36:29 +0100 Subject: [PATCH] RTech: add helpers for parsing patch header data Should significantly reduce noise in code --- r5dev/rtech/pak/paktools.cpp | 42 ++++++++++++++++++++++++++++++++++++ r5dev/rtech/pak/paktools.h | 4 ++++ 2 files changed, 46 insertions(+) diff --git a/r5dev/rtech/pak/paktools.cpp b/r5dev/rtech/pak/paktools.cpp index 3900b125..c30f9199 100644 --- a/r5dev/rtech/pak/paktools.cpp +++ b/r5dev/rtech/pak/paktools.cpp @@ -145,3 +145,45 @@ const PakLoadedInfo_t* Pak_GetPakInfo(const char* const pakName) Warning(eDLL_T::RTECH, "%s - Failed to retrieve pak info for name '%s'\n", __FUNCTION__, pakName); return nullptr; } + +//----------------------------------------------------------------------------- +// returns a pointer to the patch data header +//----------------------------------------------------------------------------- +PakPatchDataHeader_t* Pak_GetPatchDataHeader(PakFileHeader_t* const pakHeader) +{ + // shouldn't be called if the pak doesn1't have patches! + assert(pakHeader->patchIndex > 0); + return reinterpret_cast(reinterpret_cast(pakHeader) + sizeof(PakFileHeader_t)); +} + +//----------------------------------------------------------------------------- +// returns a pointer to the patch file header +//----------------------------------------------------------------------------- +PakPatchFileHeader_t* Pak_GetPatchFileHeader(PakFileHeader_t* const pakHeader, const int index) +{ + assert(pakHeader->patchIndex > 0 && index < pakHeader->patchIndex); + uint8_t* address = reinterpret_cast(pakHeader); + + // skip the file header + address += sizeof(PakFileHeader_t); + + // skip the patch data header, the patch file headers start from there + address += sizeof(PakPatchDataHeader_t); + PakPatchFileHeader_t* const patchHeaders = reinterpret_cast(address); + + return &patchHeaders[index]; +} + +//----------------------------------------------------------------------------- +// returns the patch number belonging to the index provided +//----------------------------------------------------------------------------- +short Pak_GetPatchNumberForIndex(PakFileHeader_t* const pakHeader, const int index) +{ + const uint8_t* patchHeader = reinterpret_cast(Pak_GetPatchFileHeader(pakHeader, pakHeader->patchIndex - 1)); + + // skip the last patch file header, the patch number start from there + patchHeader += sizeof(PakPatchFileHeader_t); + const short* patchNumber = reinterpret_cast(patchHeader); + + return patchNumber[index]; +} diff --git a/r5dev/rtech/pak/paktools.h b/r5dev/rtech/pak/paktools.h index af32e13c..1755781f 100644 --- a/r5dev/rtech/pak/paktools.h +++ b/r5dev/rtech/pak/paktools.h @@ -11,4 +11,8 @@ extern PakGuid_t Pak_StringToGuid(const char* const string); extern const PakLoadedInfo_t* Pak_GetPakInfo(const PakHandle_t pakId); extern const PakLoadedInfo_t* Pak_GetPakInfo(const char* const pakName); +extern PakPatchDataHeader_t* Pak_GetPatchDataHeader(PakFileHeader_t* const pakHeader); +extern PakPatchFileHeader_t* Pak_GetPatchFileHeader(PakFileHeader_t* const pakHeader, const int index); +extern short Pak_GetPatchNumberForIndex(PakFileHeader_t* const pakHeader, const int index); + #endif // !RTECH_PAKTOOLS_H