From 1a62b2e6b5acb1fccccdc332e79a8ec6ab14b51c Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Thu, 17 Aug 2023 21:39:50 +0300 Subject: [PATCH] ESM4: use switch-cases when relevant --- components/esm4/loadachr.cpp | 19 ++++++----- components/esm4/loadammo.cpp | 64 ++++++++++++++++++------------------ components/esm4/loadarmo.cpp | 36 +++++++++----------- components/esm4/loadbook.cpp | 30 +++++++++-------- components/esm4/loadcell.cpp | 52 ++++++++++++++--------------- components/esm4/loadidle.cpp | 31 +++++++++-------- components/esm4/loadltex.cpp | 26 +++++++-------- components/esm4/loadnpc.cpp | 20 ++++++----- components/esm4/loadrefr.cpp | 50 ++++++++++++++++------------ 9 files changed, 168 insertions(+), 160 deletions(-) diff --git a/components/esm4/loadachr.cpp b/components/esm4/loadachr.cpp index fb2f304a51..1a6d47497e 100644 --- a/components/esm4/loadachr.cpp +++ b/components/esm4/loadachr.cpp @@ -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; } diff --git a/components/esm4/loadammo.cpp b/components/esm4/loadammo.cpp index 28da90255b..8c5bc45c85 100644 --- a/components/esm4/loadammo.cpp +++ b/components/esm4/loadammo.cpp @@ -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(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(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: diff --git a/components/esm4/loadarmo.cpp b/components/esm4/loadarmo.cpp index 6c4e1e9a3e..572cbd6ecd 100644 --- a/components/esm4/loadarmo.cpp +++ b/components/esm4/loadarmo.cpp @@ -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; } diff --git a/components/esm4/loadbook.cpp b/components/esm4/loadbook.cpp index d78c7ada6a..f2842e5313 100644 --- a/components/esm4/loadbook.cpp +++ b/components/esm4/loadbook.cpp @@ -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; } diff --git a/components/esm4/loadcell.cpp b/components/esm4/loadcell.cpp index 53f12c3dde..0091ab0bd6 100644 --- a/components/esm4/loadcell.cpp +++ b/components/esm4/loadcell.cpp @@ -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; } diff --git a/components/esm4/loadidle.cpp b/components/esm4/loadidle.cpp index f0e1f986f2..310c43b2e1 100644 --- a/components/esm4/loadidle.cpp +++ b/components/esm4/loadidle.cpp @@ -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; } diff --git a/components/esm4/loadltex.cpp b/components/esm4/loadltex.cpp index b6f083dd03..955ac938e3 100644 --- a/components/esm4/loadltex.cpp +++ b/components/esm4/loadltex.cpp @@ -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; } diff --git a/components/esm4/loadnpc.cpp b/components/esm4/loadnpc.cpp index 5bbb5ae0a0..65292e63a8 100644 --- a/components/esm4/loadnpc.cpp +++ b/components/esm4/loadnpc.cpp @@ -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: diff --git a/components/esm4/loadrefr.cpp b/components/esm4/loadrefr.cpp index 63cac33115..5f37800b3c 100644 --- a/components/esm4/loadrefr.cpp +++ b/components/esm4/loadrefr.cpp @@ -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; }