RTech: add helpers for parsing patch header data

Should significantly reduce noise in code
This commit is contained in:
Kawe Mazidjatari 2024-01-27 01:36:29 +01:00
parent b707fba198
commit b65d74e8c7
2 changed files with 46 additions and 0 deletions

View File

@ -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<PakPatchDataHeader_t*>(reinterpret_cast<uint8_t* const>(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<uint8_t* const>(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<PakPatchFileHeader_t* const>(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<const uint8_t*>(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<const short*>(patchHeader);
return patchNumber[index];
}

View File

@ -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