mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-28 11:39:42 +00:00
ESM4: use switch-cases when relevant
This commit is contained in:
parent
42c6b3b993
commit
1a62b2e6b5
9 changed files with 168 additions and 160 deletions
|
@ -59,19 +59,22 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_XOWN:
|
||||
{
|
||||
if (subHdr.dataSize == 4 || subHdr.dataSize == 12)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.getFormId(mOwner);
|
||||
if (subHdr.dataSize == 12)
|
||||
case 4:
|
||||
reader.getFormId(mOwner);
|
||||
break;
|
||||
case 12:
|
||||
{
|
||||
reader.getFormId(mOwner);
|
||||
std::uint32_t dummy;
|
||||
reader.get(dummy); // Unknown
|
||||
reader.get(dummy); // Flags
|
||||
reader.get(dummy); // No crime flag, FO4
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -48,42 +48,42 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
|
|||
reader.getLocalizedString(mFullName);
|
||||
break;
|
||||
case ESM4::SUB_DATA:
|
||||
// FO3/FNV or TES4
|
||||
if (subHdr.dataSize == 13 || subHdr.dataSize == 18)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.get(mData.mSpeed);
|
||||
reader.get(mData.mFlags);
|
||||
mData.mFlags &= 0xFF;
|
||||
reader.get(mData.mValue);
|
||||
if (subHdr.dataSize == 13)
|
||||
reader.get(mData.mClipRounds);
|
||||
else
|
||||
case 18: // TES4
|
||||
case 13: // FO3/FNV
|
||||
{
|
||||
reader.get(mData.mWeight);
|
||||
std::uint16_t damageInt;
|
||||
reader.get(damageInt);
|
||||
mData.mDamage = static_cast<float>(damageInt);
|
||||
reader.get(mData.mSpeed);
|
||||
reader.get(mData.mFlags);
|
||||
mData.mFlags &= 0xFF;
|
||||
reader.get(mData.mValue);
|
||||
if (subHdr.dataSize == 13)
|
||||
reader.get(mData.mClipRounds);
|
||||
else
|
||||
{
|
||||
reader.get(mData.mWeight);
|
||||
std::uint16_t damageInt;
|
||||
reader.get(damageInt);
|
||||
mData.mDamage = static_cast<float>(damageInt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// TES5/SSE
|
||||
else if (subHdr.dataSize == 16 || subHdr.dataSize == 20)
|
||||
{
|
||||
reader.getFormId(mData.mProjectile);
|
||||
reader.get(mData.mFlags);
|
||||
reader.get(mData.mDamage);
|
||||
reader.get(mData.mValue);
|
||||
if (subHdr.dataSize == 20)
|
||||
case 16: // TES5
|
||||
case 20: // SSE
|
||||
reader.getFormId(mData.mProjectile);
|
||||
reader.get(mData.mFlags);
|
||||
reader.get(mData.mDamage);
|
||||
reader.get(mData.mValue);
|
||||
if (subHdr.dataSize == 20)
|
||||
reader.get(mData.mWeight);
|
||||
break;
|
||||
case 8:
|
||||
reader.get(mData.mValue);
|
||||
reader.get(mData.mWeight);
|
||||
}
|
||||
// FO4
|
||||
else if (subHdr.dataSize == 8)
|
||||
{
|
||||
reader.get(mData.mValue);
|
||||
reader.get(mData.mWeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ESM4::SUB_DAT2:
|
||||
|
|
|
@ -49,27 +49,23 @@ void ESM4::Armor::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_DATA:
|
||||
{
|
||||
// TES5
|
||||
if (subHdr.dataSize == 8)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.weight);
|
||||
}
|
||||
// FO3, FNV, FO4
|
||||
else if (subHdr.dataSize == 12)
|
||||
{
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.health);
|
||||
reader.get(mData.weight);
|
||||
}
|
||||
// TES4
|
||||
else if (subHdr.dataSize == 14)
|
||||
{
|
||||
reader.get(mData);
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
case 14: // TES4
|
||||
reader.get(mData);
|
||||
break;
|
||||
case 12: // FO3, FNV, FO4
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.health);
|
||||
reader.get(mData.weight);
|
||||
break;
|
||||
case 8: // TES5
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.weight);
|
||||
break;
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -53,30 +53,32 @@ void ESM4::Book::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_DATA:
|
||||
{
|
||||
if (subHdr.dataSize == 8 || subHdr.dataSize == 10 || subHdr.dataSize == 16)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
// TES4, FO3, FNV
|
||||
if (subHdr.dataSize == 10)
|
||||
{
|
||||
case 10: // TES4, FO3, FNV
|
||||
reader.get(mData.flags);
|
||||
reader.get(mData.bookSkill);
|
||||
}
|
||||
// TES5
|
||||
else if (subHdr.dataSize == 16)
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.weight);
|
||||
break;
|
||||
case 16: // TES5
|
||||
{
|
||||
reader.get(mData.flags);
|
||||
reader.get(mData.type);
|
||||
std::uint16_t dummy;
|
||||
reader.get(dummy);
|
||||
reader.get(mData.teaches);
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.weight);
|
||||
break;
|
||||
}
|
||||
// else: FO4
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.weight);
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
case 8: // FO4
|
||||
reader.get(mData.value);
|
||||
reader.get(mData.weight);
|
||||
break;
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -147,19 +147,22 @@ void ESM4::Cell::load(ESM4::Reader& reader)
|
|||
}
|
||||
case ESM4::SUB_XOWN:
|
||||
{
|
||||
if (subHdr.dataSize == 4 || subHdr.dataSize == 12)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.getFormId(mOwner);
|
||||
if (subHdr.dataSize == 12)
|
||||
case 4:
|
||||
reader.getFormId(mOwner);
|
||||
break;
|
||||
case 12:
|
||||
{
|
||||
reader.getFormId(mOwner);
|
||||
std::uint32_t dummy;
|
||||
reader.get(dummy); // Unknown
|
||||
reader.get(dummy); // Flags
|
||||
reader.get(dummy); // No crime flag, FO4
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -177,27 +180,20 @@ void ESM4::Cell::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_XCLL:
|
||||
{
|
||||
// TES4
|
||||
if (subHdr.dataSize == 36)
|
||||
reader.get(&mLighting, 36);
|
||||
// FO3, FONV
|
||||
else if (subHdr.dataSize == 40)
|
||||
reader.get(mLighting);
|
||||
// TES5
|
||||
else if (subHdr.dataSize == 92)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.get(mLighting);
|
||||
reader.skipSubRecordData(52); // FIXME
|
||||
}
|
||||
// FO4
|
||||
else if (subHdr.dataSize == 136)
|
||||
{
|
||||
reader.get(mLighting);
|
||||
reader.skipSubRecordData(96); // FIXME
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
case 36: // TES4
|
||||
reader.get(&mLighting, 36);
|
||||
break;
|
||||
case 40: // FO3/FNV
|
||||
case 92: // TES5 (FIXME)
|
||||
case 136: // FO4 (FIXME)
|
||||
reader.get(mLighting);
|
||||
reader.skipSubRecordData(subHdr.dataSize - 40);
|
||||
break;
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -52,20 +52,25 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_ANAM:
|
||||
{
|
||||
if (subHdr.dataSize == 8)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.getFormId(mParent);
|
||||
reader.getFormId(mPrevious);
|
||||
}
|
||||
// Animation Group Section. TES4 stores the IDs above in DATA
|
||||
else if (subHdr.dataSize == 1)
|
||||
{
|
||||
uint8_t dummy;
|
||||
reader.get(dummy);
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
case 1: // TES4
|
||||
{
|
||||
// Animation group section
|
||||
uint8_t dummy;
|
||||
reader.get(dummy);
|
||||
break;
|
||||
}
|
||||
case 8: // Everything else
|
||||
{
|
||||
// These IDs go into DATA for TES4
|
||||
reader.getFormId(mParent);
|
||||
reader.getFormId(mPrevious);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -46,22 +46,18 @@ void ESM4::LandTexture::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_HNAM:
|
||||
{
|
||||
// TES5+
|
||||
if (subHdr.dataSize == 2)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.get(mHavokFriction);
|
||||
reader.get(mHavokRestitution);
|
||||
}
|
||||
// TES4, FO3, FNV
|
||||
else if (subHdr.dataSize == 3)
|
||||
{
|
||||
reader.get(mHavokMaterial);
|
||||
reader.get(mHavokFriction);
|
||||
reader.get(mHavokRestitution);
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
case 3: // TES4, FO3, FNV
|
||||
reader.get(mHavokMaterial);
|
||||
[[fallthrough]];
|
||||
case 2:
|
||||
reader.get(mHavokFriction);
|
||||
reader.get(mHavokRestitution);
|
||||
break;
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -114,15 +114,17 @@ void ESM4::Npc::load(ESM4::Reader& reader)
|
|||
}
|
||||
case ESM4::SUB_ACBS:
|
||||
{
|
||||
if (subHdr.dataSize == 24)
|
||||
reader.get(mBaseConfig);
|
||||
// TES4
|
||||
else if (subHdr.dataSize == 16)
|
||||
reader.get(&mBaseConfig, 16);
|
||||
// FO4
|
||||
else if (subHdr.dataSize == 20)
|
||||
reader.get(&mBaseConfig, 20);
|
||||
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
case 16: // TES4
|
||||
case 24: // FO3/FNV, TES5
|
||||
case 20: // FO4
|
||||
reader.get(&mBaseConfig, subHdr.dataSize);
|
||||
break;
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ESM4::SUB_DATA:
|
||||
|
|
|
@ -67,19 +67,22 @@ void ESM4::Reference::load(ESM4::Reader& reader)
|
|||
break;
|
||||
case ESM4::SUB_XOWN:
|
||||
{
|
||||
if (subHdr.dataSize == 4 || subHdr.dataSize == 12)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.getFormId(mOwner);
|
||||
if (subHdr.dataSize == 12)
|
||||
case 4:
|
||||
reader.getFormId(mOwner);
|
||||
break;
|
||||
case 12:
|
||||
{
|
||||
reader.getFormId(mOwner);
|
||||
std::uint32_t dummy;
|
||||
reader.get(dummy); // Unknown
|
||||
reader.get(dummy); // Flags
|
||||
reader.get(dummy); // No crime flag, FO4
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -99,22 +102,27 @@ void ESM4::Reference::load(ESM4::Reader& reader)
|
|||
}
|
||||
case ESM4::SUB_XTEL:
|
||||
{
|
||||
if (subHdr.dataSize == 28 || subHdr.dataSize == 32 || subHdr.dataSize == 36)
|
||||
switch (subHdr.dataSize)
|
||||
{
|
||||
reader.getFormId(mDoor.destDoor);
|
||||
reader.get(mDoor.destPos);
|
||||
mDoor.flags = 0;
|
||||
if (subHdr.dataSize == 32 || subHdr.dataSize == 36)
|
||||
case 28:
|
||||
case 32: // FO3, FNV, TES5
|
||||
case 36: // FO4
|
||||
{
|
||||
reader.get(mDoor.flags);
|
||||
// FO4
|
||||
if (subHdr.dataSize == 36)
|
||||
reader.getFormId(mDoor.transitionInt);
|
||||
reader.getFormId(mDoor.destDoor);
|
||||
reader.get(mDoor.destPos);
|
||||
mDoor.flags = 0;
|
||||
if (subHdr.dataSize >= 32)
|
||||
{
|
||||
reader.get(mDoor.flags);
|
||||
// FO4
|
||||
if (subHdr.dataSize == 36)
|
||||
reader.getFormId(mDoor.transitionInt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reader.skipSubRecordData();
|
||||
default:
|
||||
reader.skipSubRecordData();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue