1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-28 16:09:43 +00:00

ESM4: use switch-cases when relevant

This commit is contained in:
Alexei Kotov 2023-08-17 21:39:50 +03:00
parent 42c6b3b993
commit 1a62b2e6b5
9 changed files with 168 additions and 160 deletions

View file

@ -59,19 +59,22 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_XOWN: case ESM4::SUB_XOWN:
{ {
if (subHdr.dataSize == 4 || subHdr.dataSize == 12) switch (subHdr.dataSize)
{ {
reader.getFormId(mOwner); case 4:
if (subHdr.dataSize == 12) reader.getFormId(mOwner);
break;
case 12:
{ {
reader.getFormId(mOwner);
std::uint32_t dummy; std::uint32_t dummy;
reader.get(dummy); // Unknown reader.get(dummy); // Unknown
reader.get(dummy); // Flags reader.get(dummy); // No crime flag, FO4
break;
} }
} default:
else reader.skipSubRecordData();
{ break;
reader.skipSubRecordData();
} }
break; break;
} }

View file

@ -48,42 +48,42 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
reader.getLocalizedString(mFullName); reader.getLocalizedString(mFullName);
break; break;
case ESM4::SUB_DATA: case ESM4::SUB_DATA:
// FO3/FNV or TES4 switch (subHdr.dataSize)
if (subHdr.dataSize == 13 || subHdr.dataSize == 18)
{ {
reader.get(mData.mSpeed); case 18: // TES4
reader.get(mData.mFlags); case 13: // FO3/FNV
mData.mFlags &= 0xFF;
reader.get(mData.mValue);
if (subHdr.dataSize == 13)
reader.get(mData.mClipRounds);
else
{ {
reader.get(mData.mWeight); reader.get(mData.mSpeed);
std::uint16_t damageInt; reader.get(mData.mFlags);
reader.get(damageInt); mData.mFlags &= 0xFF;
mData.mDamage = static_cast<float>(damageInt); 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;
} }
} case 16: // TES5
// TES5/SSE case 20: // SSE
else if (subHdr.dataSize == 16 || subHdr.dataSize == 20) reader.getFormId(mData.mProjectile);
{ reader.get(mData.mFlags);
reader.getFormId(mData.mProjectile); reader.get(mData.mDamage);
reader.get(mData.mFlags); reader.get(mData.mValue);
reader.get(mData.mDamage); if (subHdr.dataSize == 20)
reader.get(mData.mValue); reader.get(mData.mWeight);
if (subHdr.dataSize == 20) break;
case 8:
reader.get(mData.mValue);
reader.get(mData.mWeight); reader.get(mData.mWeight);
} break;
// FO4 default:
else if (subHdr.dataSize == 8) reader.skipSubRecordData();
{ break;
reader.get(mData.mValue);
reader.get(mData.mWeight);
}
else
{
reader.skipSubRecordData();
} }
break; break;
case ESM4::SUB_DAT2: case ESM4::SUB_DAT2:

View file

@ -49,27 +49,23 @@ void ESM4::Armor::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_DATA: case ESM4::SUB_DATA:
{ {
// TES5 switch (subHdr.dataSize)
if (subHdr.dataSize == 8)
{ {
reader.get(mData.value); case 14: // TES4
reader.get(mData.weight); reader.get(mData);
} break;
// FO3, FNV, FO4 case 12: // FO3, FNV, FO4
else if (subHdr.dataSize == 12) reader.get(mData.value);
{ reader.get(mData.health);
reader.get(mData.value); reader.get(mData.weight);
reader.get(mData.health); break;
reader.get(mData.weight); case 8: // TES5
} reader.get(mData.value);
// TES4 reader.get(mData.weight);
else if (subHdr.dataSize == 14) break;
{ default:
reader.get(mData); reader.skipSubRecordData();
} break;
else
{
reader.skipSubRecordData();
} }
break; break;
} }

View file

@ -53,30 +53,32 @@ void ESM4::Book::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_DATA: case ESM4::SUB_DATA:
{ {
if (subHdr.dataSize == 8 || subHdr.dataSize == 10 || subHdr.dataSize == 16) switch (subHdr.dataSize)
{ {
// TES4, FO3, FNV case 10: // TES4, FO3, FNV
if (subHdr.dataSize == 10)
{
reader.get(mData.flags); reader.get(mData.flags);
reader.get(mData.bookSkill); reader.get(mData.bookSkill);
} reader.get(mData.value);
// TES5 reader.get(mData.weight);
else if (subHdr.dataSize == 16) break;
case 16: // TES5
{ {
reader.get(mData.flags); reader.get(mData.flags);
reader.get(mData.type); reader.get(mData.type);
std::uint16_t dummy; std::uint16_t dummy;
reader.get(dummy); reader.get(dummy);
reader.get(mData.teaches); reader.get(mData.teaches);
reader.get(mData.value);
reader.get(mData.weight);
break;
} }
// else: FO4 case 8: // FO4
reader.get(mData.value); reader.get(mData.value);
reader.get(mData.weight); reader.get(mData.weight);
} break;
else default:
{ reader.skipSubRecordData();
reader.skipSubRecordData(); break;
} }
break; break;
} }

View file

@ -147,19 +147,22 @@ void ESM4::Cell::load(ESM4::Reader& reader)
} }
case ESM4::SUB_XOWN: case ESM4::SUB_XOWN:
{ {
if (subHdr.dataSize == 4 || subHdr.dataSize == 12) switch (subHdr.dataSize)
{ {
reader.getFormId(mOwner); case 4:
if (subHdr.dataSize == 12) reader.getFormId(mOwner);
break;
case 12:
{ {
reader.getFormId(mOwner);
std::uint32_t dummy; std::uint32_t dummy;
reader.get(dummy); // Unknown reader.get(dummy); // Unknown
reader.get(dummy); // Flags reader.get(dummy); // No crime flag, FO4
break;
} }
} default:
else reader.skipSubRecordData();
{ break;
reader.skipSubRecordData();
} }
break; break;
} }
@ -177,27 +180,20 @@ void ESM4::Cell::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_XCLL: case ESM4::SUB_XCLL:
{ {
// TES4 switch (subHdr.dataSize)
if (subHdr.dataSize == 36)
reader.get(&mLighting, 36);
// FO3, FONV
else if (subHdr.dataSize == 40)
reader.get(mLighting);
// TES5
else if (subHdr.dataSize == 92)
{ {
reader.get(mLighting); case 36: // TES4
reader.skipSubRecordData(52); // FIXME reader.get(&mLighting, 36);
} break;
// FO4 case 40: // FO3/FNV
else if (subHdr.dataSize == 136) case 92: // TES5 (FIXME)
{ case 136: // FO4 (FIXME)
reader.get(mLighting); reader.get(mLighting);
reader.skipSubRecordData(96); // FIXME reader.skipSubRecordData(subHdr.dataSize - 40);
} break;
else default:
{ reader.skipSubRecordData();
reader.skipSubRecordData(); break;
} }
break; break;
} }

View file

@ -52,20 +52,25 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_ANAM: case ESM4::SUB_ANAM:
{ {
if (subHdr.dataSize == 8) switch (subHdr.dataSize)
{ {
reader.getFormId(mParent); case 1: // TES4
reader.getFormId(mPrevious); {
} // Animation group section
// Animation Group Section. TES4 stores the IDs above in DATA uint8_t dummy;
else if (subHdr.dataSize == 1) reader.get(dummy);
{ break;
uint8_t dummy; }
reader.get(dummy); case 8: // Everything else
} {
else // These IDs go into DATA for TES4
{ reader.getFormId(mParent);
reader.skipSubRecordData(); reader.getFormId(mPrevious);
break;
}
default:
reader.skipSubRecordData();
break;
} }
break; break;
} }

View file

@ -46,22 +46,18 @@ void ESM4::LandTexture::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_HNAM: case ESM4::SUB_HNAM:
{ {
// TES5+ switch (subHdr.dataSize)
if (subHdr.dataSize == 2)
{ {
reader.get(mHavokFriction); case 3: // TES4, FO3, FNV
reader.get(mHavokRestitution); reader.get(mHavokMaterial);
} [[fallthrough]];
// TES4, FO3, FNV case 2:
else if (subHdr.dataSize == 3) reader.get(mHavokFriction);
{ reader.get(mHavokRestitution);
reader.get(mHavokMaterial); break;
reader.get(mHavokFriction); default:
reader.get(mHavokRestitution); reader.skipSubRecordData();
} break;
else
{
reader.skipSubRecordData();
} }
break; break;
} }

View file

@ -114,15 +114,17 @@ void ESM4::Npc::load(ESM4::Reader& reader)
} }
case ESM4::SUB_ACBS: case ESM4::SUB_ACBS:
{ {
if (subHdr.dataSize == 24) switch (subHdr.dataSize)
reader.get(mBaseConfig); {
// TES4 case 16: // TES4
else if (subHdr.dataSize == 16) case 24: // FO3/FNV, TES5
reader.get(&mBaseConfig, 16); case 20: // FO4
// FO4 reader.get(&mBaseConfig, subHdr.dataSize);
else if (subHdr.dataSize == 20) break;
reader.get(&mBaseConfig, 20); default:
reader.skipSubRecordData();
break;
}
break; break;
} }
case ESM4::SUB_DATA: case ESM4::SUB_DATA:

View file

@ -67,19 +67,22 @@ void ESM4::Reference::load(ESM4::Reader& reader)
break; break;
case ESM4::SUB_XOWN: case ESM4::SUB_XOWN:
{ {
if (subHdr.dataSize == 4 || subHdr.dataSize == 12) switch (subHdr.dataSize)
{ {
reader.getFormId(mOwner); case 4:
if (subHdr.dataSize == 12) reader.getFormId(mOwner);
break;
case 12:
{ {
reader.getFormId(mOwner);
std::uint32_t dummy; std::uint32_t dummy;
reader.get(dummy); // Unknown reader.get(dummy); // Unknown
reader.get(dummy); // Flags reader.get(dummy); // No crime flag, FO4
break;
} }
} default:
else reader.skipSubRecordData();
{ break;
reader.skipSubRecordData();
} }
break; break;
} }
@ -99,22 +102,27 @@ void ESM4::Reference::load(ESM4::Reader& reader)
} }
case ESM4::SUB_XTEL: case ESM4::SUB_XTEL:
{ {
if (subHdr.dataSize == 28 || subHdr.dataSize == 32 || subHdr.dataSize == 36) switch (subHdr.dataSize)
{ {
reader.getFormId(mDoor.destDoor); case 28:
reader.get(mDoor.destPos); case 32: // FO3, FNV, TES5
mDoor.flags = 0; case 36: // FO4
if (subHdr.dataSize == 32 || subHdr.dataSize == 36)
{ {
reader.get(mDoor.flags); reader.getFormId(mDoor.destDoor);
// FO4 reader.get(mDoor.destPos);
if (subHdr.dataSize == 36) mDoor.flags = 0;
reader.getFormId(mDoor.transitionInt); if (subHdr.dataSize >= 32)
{
reader.get(mDoor.flags);
// FO4
if (subHdr.dataSize == 36)
reader.getFormId(mDoor.transitionInt);
}
break;
} }
} default:
else reader.skipSubRecordData();
{ break;
reader.skipSubRecordData();
} }
break; break;
} }