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:
parent
ed75c0b311
commit
47af96eb12
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user