1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-01-21 08:00:54 +00:00

Changed statsextensions internal representations of magic effects to RefId. Interfaces with mwscript remain index-based.

This commit is contained in:
Telvanni 4Life 2025-12-12 19:43:28 -05:00
parent 5839910eea
commit 6ca64fdddd
4 changed files with 48 additions and 51 deletions

View file

@ -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<ESM::MagicEffect>::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;

View file

@ -80,9 +80,8 @@ namespace CSMWorld
inline void setRecordId(const ESM::RefId& id, ESM::MagicEffect& record)
{
if (const auto* magicEffectId = id.getIf<ESM::MagicEffectId>())
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<std::uint32_t>(index));
}
inline void setRecordId(const ESM::RefId& id, ESM::Skill& record)

View file

@ -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;
}

View file

@ -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<int>(effectId)));
}
};
@ -1262,13 +1262,13 @@ namespace MWScript
template <class R>
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 R>
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 R>
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<OpGetStat<ExplicitRef>>(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<OpGetMagicEffect<ImplicitRef>>(
Compiler::Stats::opcodeGetMagicEffect + i, positive, negative);