1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-04 03:40:14 +00:00

Generalize extended storage subrecord handling

This commit is contained in:
Alexei Kotov 2023-08-16 22:33:00 +03:00
parent ed75c0b311
commit 47af96eb12
3 changed files with 15 additions and 48 deletions

View File

@ -196,7 +196,6 @@ void ESM4::NavMesh::load(ESM4::Reader& reader)
std::uint32_t esmVer = reader.esmVersion();
// std::cout << "NavMesh 0x" << std::hex << this << std::endl; // FIXME
std::uint32_t subSize = 0; // for XXXX sub record
// FIXME: debugging only
#if 0
@ -214,18 +213,7 @@ void ESM4::NavMesh::load(ESM4::Reader& reader)
{
if (esmVer == 0x3F800000)
{
// TODO: check if any valid TES5 plugin prepends XXXX to NVNM
if (subSize)
{
reader.skipSubRecordData(subSize);
reader.updateRecordRead(subSize);
subSize = 0;
}
else
{
// FIXME: FO4 appears to have a different format
reader.skipSubRecordData();
}
reader.skipSubRecordData();
break;
}
@ -237,23 +225,6 @@ void ESM4::NavMesh::load(ESM4::Reader& reader)
case ESM4::SUB_ONAM:
case ESM4::SUB_PNAM:
case ESM4::SUB_NNAM:
{
if (subSize)
{
reader.skipSubRecordData(subSize); // special post XXXX
reader.updateRecordRead(subSize); // WARNING: manual update
subSize = 0;
}
else
{
Log(Debug::Verbose) << ESM::printName(subHdr.typeId) << " skipping...";
reader.skipSubRecordData(); // FIXME: process the subrecord rather than skip
}
break;
}
case ESM4::SUB_XXXX:
reader.get(subSize);
break;
case ESM4::SUB_NVER: // FO3
case ESM4::SUB_DATA: // FO3
case ESM4::SUB_NVVX: // FO3

View File

@ -45,8 +45,6 @@ void ESM4::World::load(ESM4::Reader& reader)
// corrupted by the use of ignore flag (TODO: should check to verify).
reader.setCurrWorld(mId); // save for CELL later
std::uint32_t subSize = 0; // for XXXX sub record
std::uint32_t esmVer = reader.esmVersion();
// bool isTES4 = (esmVer == ESM::VER_080 || esmVer == ESM::VER_100);
// bool isFONV = (esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134);
@ -144,19 +142,6 @@ void ESM4::World::load(ESM4::Reader& reader)
reader.get(mParentUseFlags);
break;
case ESM4::SUB_OFST:
if (subSize)
{
reader.skipSubRecordData(subSize); // special post XXXX
reader.updateRecordRead(subSize); // WARNING: manually update
subSize = 0;
}
else
reader.skipSubRecordData(); // FIXME: process the subrecord rather than skip
break;
case ESM4::SUB_XXXX:
reader.get(subSize);
break;
case ESM4::SUB_RNAM: // multiple
case ESM4::SUB_MHDT:
case ESM4::SUB_LTMP:

View File

@ -558,9 +558,6 @@ namespace ESM4
{
bool result = false;
// NOTE: some SubRecords have 0 dataSize (e.g. SUB_RDSD in one of REC_REGN records in Oblivion.esm).
// Also SUB_XXXX has zero dataSize and the following 4 bytes represent the actual dataSize
// - hence it require manual updtes to mCtx.recordRead via updateRecordRead()
// See ESM4::NavMesh and ESM4::World.
if (mCtx.recordHeader.record.dataSize - mCtx.recordRead >= sizeof(mCtx.subRecordHeader))
{
result = getExact(mCtx.subRecordHeader);
@ -582,6 +579,20 @@ namespace ESM4
return false;
}
// Extended storage subrecord redefines the following subrecord's size.
// Would need to redesign the loader to support that, so skip over both subrecords.
if (result && mCtx.subRecordHeader.typeId == ESM4::SUB_XXXX)
{
std::uint32_t extDataSize;
get(extDataSize);
if (!getSubRecordHeader())
return false;
skipSubRecordData(extDataSize);
mCtx.recordRead += extDataSize - mCtx.subRecordHeader.dataSize;
return getSubRecordHeader();
}
return result;
}