From 4b3de46bfa23c3f9bc9ecdf4798b33d5d6af8828 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 6 Jul 2021 12:37:02 +1000 Subject: [PATCH] Use enums in place of magic numbers. Ensure Creature and NPC cell references are always saved as persistent. --- apps/opencs/model/doc/savingstages.cpp | 6 +++++- apps/opencs/model/world/refidadapterimp.hpp | 6 +++--- apps/openmw/mwclass/creature.cpp | 2 +- apps/openmw/mwclass/npc.cpp | 2 +- components/esm/esmcommon.hpp | 5 +++++ components/esm/loadstat.cpp | 4 ++-- 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/opencs/model/doc/savingstages.cpp b/apps/opencs/model/doc/savingstages.cpp index 27b31251e5..8c17a3b8c1 100644 --- a/apps/opencs/model/doc/savingstages.cpp +++ b/apps/opencs/model/doc/savingstages.cpp @@ -342,8 +342,12 @@ void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages) CSMWorld::CellRef refRecord = ref.get(); + CSMWorld::RefIdData::LocalIndex localIndex = refIdData.searchId(refRecord.mRefID); unsigned int recordFlags = refIdData.getRecordFlags(refRecord.mRefID); - bool isPersistent = ((recordFlags & 0x00000400) != 0) || refRecord.mTeleport; + bool isPersistent = ((recordFlags & ESM::FLAG_Persistent) != 0) + || refRecord.mTeleport + || localIndex.second == CSMWorld::UniversalId::Type_Creature + || localIndex.second == CSMWorld::UniversalId::Type_Npc; if (isPersistent) persistentRefs.push_back(*iter); diff --git a/apps/opencs/model/world/refidadapterimp.hpp b/apps/opencs/model/world/refidadapterimp.hpp index 210deca69b..1d1b5a94a6 100644 --- a/apps/opencs/model/world/refidadapterimp.hpp +++ b/apps/opencs/model/world/refidadapterimp.hpp @@ -153,7 +153,7 @@ namespace CSMWorld return QString::fromUtf8 (record.get().mModel.c_str()); if (column==mModel.mPersistence) - return (record.get().mRecordFlags & 0x00000400) != 0; + return (record.get().mRecordFlags & ESM::FLAG_Persistent) != 0; return BaseRefIdAdapter::getData (column, data, index); } @@ -171,9 +171,9 @@ namespace CSMWorld else if (column==mModel.mPersistence) { if (value.toInt() != 0) - record2.mRecordFlags |= 0x00000400; + record2.mRecordFlags |= ESM::FLAG_Persistent; else - record2.mRecordFlags &= ~0x00000400; + record2.mRecordFlags &= ~ESM::FLAG_Persistent; } else { diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 0a40139d36..141bf99e92 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -588,7 +588,7 @@ namespace MWClass bool Creature::isPersistent(const MWWorld::ConstPtr &actor) const { const MWWorld::LiveCellRef* ref = actor.get(); - return (ref->mBase->mRecordFlags & 0x0400) != 0; + return (ref->mBase->mRecordFlags & ESM::FLAG_Persistent) != 0; } std::string Creature::getSoundIdFromSndGen(const MWWorld::Ptr &ptr, const std::string &name) const diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 1951f964bc..6131f86269 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -403,7 +403,7 @@ namespace MWClass bool Npc::isPersistent(const MWWorld::ConstPtr &actor) const { const MWWorld::LiveCellRef* ref = actor.get(); - return (ref->mBase->mRecordFlags & 0x0400) != 0; + return (ref->mBase->mRecordFlags & ESM::FLAG_Persistent) != 0; } std::string Npc::getModel(const MWWorld::ConstPtr &ptr) const diff --git a/components/esm/esmcommon.hpp b/components/esm/esmcommon.hpp index 749e9a85d6..10e05de905 100644 --- a/components/esm/esmcommon.hpp +++ b/components/esm/esmcommon.hpp @@ -16,6 +16,11 @@ enum Version VER_13 = 0x3fa66666 }; +enum RecordFlag + { + FLAG_Persistent = 0x00000400, + FLAG_Blocked = 0x00002000 + }; // CRTP for FIXED_STRING class, a structure used for holding fixed-length strings template< template class DERIVED, size_t SIZE> diff --git a/components/esm/loadstat.cpp b/components/esm/loadstat.cpp index 0c97662d7e..543e76bc85 100644 --- a/components/esm/loadstat.cpp +++ b/components/esm/loadstat.cpp @@ -12,8 +12,8 @@ namespace ESM { isDeleted = false; mRecordFlags = esm.getRecordFlags(); - //bool isBlocked = (mRecordFlags & 0x00002000) != 0; - //bool isPersistent = (mRecordFlags & 0x00000400) != 0; + //bool isBlocked = (mRecordFlags & ESM::FLAG_Blocked) != 0; + //bool isPersistent = (mRecordFlags & ESM::FLAG_Persistent) != 0; bool hasName = false; while (esm.hasMoreSubs())