diff --git a/apps/esmtool/record.cpp b/apps/esmtool/record.cpp index 444d255647..48d18a235a 100644 --- a/apps/esmtool/record.cpp +++ b/apps/esmtool/record.cpp @@ -153,7 +153,7 @@ namespace int i = 0; for (const ESM::IndexedENAMstruct& effect : effects.mList) { - std::cout << " Effect[" << i << "]: " << magicEffectLabel(ESM::MagicEffect::refIdToIndex(effect.mData.mEffectID)) << " (" + std::cout << " Effect[" << i << "]: " << magicEffectLabel(effect.mData.mEffectID) << " (" << effect.mData.mEffectID << ")" << std::endl; if (effect.mData.mSkill != -1) std::cout << " Skill: " << skillLabel(effect.mData.mSkill) << " (" << (int)effect.mData.mSkill << ")" @@ -973,9 +973,7 @@ namespace EsmTool template <> void Record::print() { - std::cout << " Id: " << mData.mId << std::endl; - std::cout << " Index: " << magicEffectLabel(ESM::MagicEffect::refIdToIndex(mData.mId)) << " (" - << ESM::MagicEffect::refIdToIndex(mData.mId) << ")" << std::endl; + std::cout << " Index: " << magicEffectLabel(mData.mIndex) << " (" << mData.mIndex << ")" << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Icon: " << mData.mIcon << std::endl; std::cout << " Flags: " << magicEffectFlags(mData.mData.mFlags) << std::endl; diff --git a/apps/opencs/model/world/collection.hpp b/apps/opencs/model/world/collection.hpp index 1350666cfc..9d3658cdf0 100644 --- a/apps/opencs/model/world/collection.hpp +++ b/apps/opencs/model/world/collection.hpp @@ -80,9 +80,8 @@ namespace CSMWorld inline void setRecordId(const ESM::RefId& id, ESM::MagicEffect& record) { - if (const auto* magicEffectId = id.getIf()) - record.mId = *magicEffectId; - throw std::runtime_error("Invalid magic effect id: " + id.toDebugString()); + int index = ESM::MagicEffect::indexNameToIndex(id.getRefIdString()); + record.mId = ESM::RefId::index(ESM::REC_MGEF, static_cast(index)); } inline void setRecordId(const ESM::RefId& id, ESM::Skill& record) diff --git a/apps/opencs/model/world/columnimp.cpp b/apps/opencs/model/world/columnimp.cpp index 7080f2f7be..baf2e5d8e3 100644 --- a/apps/opencs/model/world/columnimp.cpp +++ b/apps/opencs/model/world/columnimp.cpp @@ -30,7 +30,7 @@ namespace CSMWorld switch (value.getRecordType()) { case ESM::REC_MGEF: - return std::string(ESM::MagicEffect::indexToName(value.getValue())); + return std::string(ESM::MagicEffect::sIndexNames[value.getValue()]); default: break; } diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index cc5d593592..c7daa9072c 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -580,7 +580,7 @@ namespace MWScript runtime.pop(); if (ptr.getClass().isActor()) - ptr.getClass().getCreatureStats(ptr).getActiveSpells().purgeEffect(ptr, effectId); + ptr.getClass().getCreatureStats(ptr).getActiveSpells().purgeEffect(ptr, ESM::MagicEffect::indexToRefId(static_cast(effectId))); } }; @@ -1262,13 +1262,13 @@ namespace MWScript template class OpGetMagicEffect : public Interpreter::Opcode0 { - int mPositiveEffect; - int mNegativeEffect; + ESM::RefId mPositiveEffect; + ESM::RefId mNegativeEffect; public: OpGetMagicEffect(int positiveEffect, int negativeEffect) - : mPositiveEffect(positiveEffect) - , mNegativeEffect(negativeEffect) + : mPositiveEffect(ESM::MagicEffect::indexToRefId(positiveEffect)) + , mNegativeEffect(ESM::MagicEffect::indexToRefId(negativeEffect)) { } @@ -1284,7 +1284,7 @@ namespace MWScript const MWMechanics::MagicEffects& effects = ptr.getClass().getCreatureStats(ptr).getMagicEffects(); float currentValue = effects.getOrDefault(mPositiveEffect).getMagnitude(); - if (mNegativeEffect != -1) + if (!mNegativeEffect.empty()) currentValue -= effects.getOrDefault(mNegativeEffect).getMagnitude(); // GetResist* should take in account elemental shields @@ -1303,13 +1303,13 @@ namespace MWScript template class OpSetMagicEffect : public Interpreter::Opcode0 { - int mPositiveEffect; - int mNegativeEffect; + ESM::RefId mPositiveEffect; + ESM::RefId mNegativeEffect; public: OpSetMagicEffect(int positiveEffect, int negativeEffect) - : mPositiveEffect(positiveEffect) - , mNegativeEffect(negativeEffect) + : mPositiveEffect(ESM::MagicEffect::indexToRefId(positiveEffect)) + , mNegativeEffect(ESM::MagicEffect::indexToRefId(negativeEffect)) { } @@ -1325,7 +1325,7 @@ namespace MWScript MWMechanics::MagicEffects& effects = ptr.getClass().getCreatureStats(ptr).getMagicEffects(); float currentValue = effects.getOrDefault(mPositiveEffect).getMagnitude(); - if (mNegativeEffect != -1) + if (!mNegativeEffect.empty()) currentValue -= effects.getOrDefault(mNegativeEffect).getMagnitude(); // SetResist* should take in account elemental shields @@ -1343,13 +1343,13 @@ namespace MWScript template class OpModMagicEffect : public Interpreter::Opcode0 { - int mPositiveEffect; - int mNegativeEffect; + ESM::RefId mPositiveEffect; + ESM::RefId mNegativeEffect; public: OpModMagicEffect(int positiveEffect, int negativeEffect) - : mPositiveEffect(positiveEffect) - , mNegativeEffect(negativeEffect) + : mPositiveEffect(ESM::MagicEffect::indexToRefId(positiveEffect)) + , mNegativeEffect(ESM::MagicEffect::indexToRefId(negativeEffect)) { } @@ -1415,8 +1415,8 @@ namespace MWScript struct MagicEffect { - int mPositiveEffect; - int mNegativeEffect; + ESM::RefId mPositiveEffect; + ESM::RefId mNegativeEffect; }; void installOpcodes(Interpreter::Interpreter& interpreter) @@ -1569,36 +1569,36 @@ namespace MWScript interpreter.installSegment5>(Compiler::Stats::opcodeGetStatExplicit); static const MagicEffect sMagicEffects[] = { - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistMagicka), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToMagicka) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistFire), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToFire) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistFrost), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToFrost) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistShock), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToShock) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistCommonDisease), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToCommonDisease) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistBlightDisease), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToBlightDisease) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistCorprusDisease), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToCorprusDisease) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistPoison), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToPoison) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistParalysis), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::ResistNormalWeapons), ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WeaknessToNormalWeapons) }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WaterBreathing), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Chameleon), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::WaterWalking), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::SwiftSwim), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Jump), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Levitate), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Shield), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Sound), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Silence), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Blind), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Paralyze), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Invisibility), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::FortifyAttack), -1 }, - { ESM::MagicEffect::refIdToIndex(ESM::MagicEffect::Sanctuary), -1 }, + { ESM::MagicEffect::ResistMagicka, ESM::MagicEffect::WeaknessToMagicka }, + { ESM::MagicEffect::ResistFire, ESM::MagicEffect::WeaknessToFire }, + { ESM::MagicEffect::ResistFrost, ESM::MagicEffect::WeaknessToFrost }, + { ESM::MagicEffect::ResistShock, ESM::MagicEffect::WeaknessToShock }, + { ESM::MagicEffect::ResistCommonDisease, ESM::MagicEffect::WeaknessToCommonDisease }, + { ESM::MagicEffect::ResistBlightDisease, ESM::MagicEffect::WeaknessToBlightDisease }, + { ESM::MagicEffect::ResistCorprusDisease, ESM::MagicEffect::WeaknessToCorprusDisease }, + { ESM::MagicEffect::ResistPoison, ESM::MagicEffect::WeaknessToPoison }, + { ESM::MagicEffect::ResistParalysis, ESM::RefId() }, + { ESM::MagicEffect::ResistNormalWeapons, ESM::MagicEffect::WeaknessToNormalWeapons }, + { ESM::MagicEffect::WaterBreathing, ESM::RefId() }, + { ESM::MagicEffect::Chameleon, ESM::RefId() }, + { ESM::MagicEffect::WaterWalking, ESM::RefId() }, + { ESM::MagicEffect::SwiftSwim, ESM::RefId() }, + { ESM::MagicEffect::Jump, ESM::RefId() }, + { ESM::MagicEffect::Levitate, ESM::RefId() }, + { ESM::MagicEffect::Shield, ESM::RefId() }, + { ESM::MagicEffect::Sound, ESM::RefId() }, + { ESM::MagicEffect::Silence, ESM::RefId() }, + { ESM::MagicEffect::Blind, ESM::RefId() }, + { ESM::MagicEffect::Paralyze, ESM::RefId() }, + { ESM::MagicEffect::Invisibility, ESM::RefId() }, + { ESM::MagicEffect::FortifyAttack, ESM::RefId() }, + { ESM::MagicEffect::Sanctuary, ESM::RefId() }, }; for (int i = 0; i < 24; ++i) { - int positive = sMagicEffects[i].mPositiveEffect; - int negative = sMagicEffects[i].mNegativeEffect; + int positive = ESM::MagicEffect::refIdToIndex(sMagicEffects[i].mPositiveEffect); + int negative = ESM::MagicEffect::refIdToIndex(sMagicEffects[i].mNegativeEffect); interpreter.installSegment5>( Compiler::Stats::opcodeGetMagicEffect + i, positive, negative);