1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-01-31 19:18:27 +00:00

- Changed set and get methods in magic effect adapters to use MGEF context to determine skill and attribute associations.

- Changed SpellEffectParams equality operator in widgets to fetch skill and attribute associations via MGEF in ESM store.
This commit is contained in:
Telvanni 4Life 2026-01-13 17:00:00 -05:00
parent 8d23662cf2
commit 51bf0074ad
4 changed files with 75 additions and 47 deletions

View file

@ -321,28 +321,32 @@ namespace CSMWorld
throw std::runtime_error("index out of range");
ESM::ENAMstruct effect = effectsList[subRowIndex].mData;
bool targetSkill = false, targetAttribute = false;
if (mMagicEffects)
{
int recordIndex = mMagicEffects->searchId(effect.mEffectID);
if (recordIndex != -1)
{
const ESM::MagicEffect& mgef = mMagicEffects->getRecord(recordIndex).get();
targetSkill = mgef.mData.mFlags & ESM::MagicEffect::TargetSkill;
targetAttribute = mgef.mData.mFlags & ESM::MagicEffect::TargetAttribute;
}
}
switch (subColIndex)
{
case 0:
return ESM::MagicEffect::refIdToIndex(effect.mEffectID);
case 1:
{
if (effect.mEffectID == ESM::MagicEffect::DrainSkill
|| effect.mEffectID == ESM::MagicEffect::DamageSkill
|| effect.mEffectID == ESM::MagicEffect::RestoreSkill
|| effect.mEffectID == ESM::MagicEffect::FortifySkill
|| effect.mEffectID == ESM::MagicEffect::AbsorbSkill)
if (targetSkill)
return effect.mSkill;
else
return QVariant();
}
case 2:
{
if (effect.mEffectID == ESM::MagicEffect::DrainAttribute
|| effect.mEffectID == ESM::MagicEffect::DamageAttribute
|| effect.mEffectID == ESM::MagicEffect::RestoreAttribute
|| effect.mEffectID == ESM::MagicEffect::FortifyAttribute
|| effect.mEffectID == ESM::MagicEffect::AbsorbAttribute)
if (targetAttribute)
return effect.mAttribute;
else
return QVariant();
@ -372,22 +376,26 @@ namespace CSMWorld
throw std::runtime_error("index out of range");
ESM::ENAMstruct effect = effectsList[subRowIndex].mData;
bool targetSkill = false, targetAttribute = false;
switch (subColIndex)
{
case 0:
{
effect.mEffectID = ESM::MagicEffect::indexToRefId(value.toInt());
if (effect.mEffectID == ESM::MagicEffect::DrainSkill
|| effect.mEffectID == ESM::MagicEffect::DamageSkill
|| effect.mEffectID == ESM::MagicEffect::RestoreSkill
|| effect.mEffectID == ESM::MagicEffect::FortifySkill
|| effect.mEffectID == ESM::MagicEffect::AbsorbSkill)
if (mMagicEffects)
{
int recordIndex = mMagicEffects->searchId(effect.mEffectID);
if (recordIndex != -1)
{
const ESM::MagicEffect& mgef = mMagicEffects->getRecord(recordIndex).get();
targetSkill = mgef.mData.mFlags & ESM::MagicEffect::TargetSkill;
targetAttribute = mgef.mData.mFlags & ESM::MagicEffect::TargetAttribute;
}
}
if (targetSkill)
effect.mAttribute = -1;
else if (effect.mEffectID == ESM::MagicEffect::DrainAttribute
|| effect.mEffectID == ESM::MagicEffect::DamageAttribute
|| effect.mEffectID == ESM::MagicEffect::RestoreAttribute
|| effect.mEffectID == ESM::MagicEffect::FortifyAttribute
|| effect.mEffectID == ESM::MagicEffect::AbsorbAttribute)
else if (targetAttribute)
effect.mSkill = -1;
else
{

View file

@ -13,6 +13,7 @@
#include <components/esm3/loadmgef.hpp>
#include <components/esm3/loadskil.hpp>
#include "idcollection.hpp"
#include "nestedtablewrapper.hpp"
CSMWorld::PotionColumns::PotionColumns(const InventoryColumns& columns)
@ -145,6 +146,17 @@ QVariant CSMWorld::IngredEffectRefIdAdapter::getNestedData(
throw std::runtime_error("index out of range");
ESM::RefId effectId = record.get().mData.mEffectID[subRowIndex];
bool targetSkill = false, targetAttribute = false;
if (!effectId.empty() && mMagicEffects)
{
int recordIndex = mMagicEffects->searchId(effectId);
if (recordIndex != -1)
{
const ESM::MagicEffect& mgef = mMagicEffects->getRecord(recordIndex).get();
targetSkill = mgef.mData.mFlags & ESM::MagicEffect::TargetSkill;
targetAttribute = mgef.mData.mFlags & ESM::MagicEffect::TargetAttribute;
}
}
switch (subColIndex)
{
@ -152,18 +164,14 @@ QVariant CSMWorld::IngredEffectRefIdAdapter::getNestedData(
return ESM::MagicEffect::refIdToIndex(effectId);
case 1:
{
if (effectId == ESM::MagicEffect::DrainSkill || effectId == ESM::MagicEffect::DamageSkill
|| effectId == ESM::MagicEffect::RestoreSkill || effectId == ESM::MagicEffect::FortifySkill
|| effectId == ESM::MagicEffect::AbsorbSkill)
if (targetSkill)
return record.get().mData.mSkills[subRowIndex];
else
return QVariant();
}
case 2:
{
if (effectId == ESM::MagicEffect::DrainAttribute || effectId == ESM::MagicEffect::DamageAttribute
|| effectId == ESM::MagicEffect::RestoreAttribute || effectId == ESM::MagicEffect::FortifyAttribute
|| effectId == ESM::MagicEffect::AbsorbAttribute)
if (targetAttribute)
return record.get().mData.mAttributes[subRowIndex];
else
return QVariant();
@ -184,18 +192,26 @@ void CSMWorld::IngredEffectRefIdAdapter::setNestedData(
throw std::runtime_error("index out of range");
ESM::RefId effectId = ESM::MagicEffect::indexToRefId(value.toInt());
bool targetSkill = false, targetAttribute = false;
switch (subColIndex)
{
case 0:
ingredient.mData.mEffectID[subRowIndex] = effectId;
if (effectId == ESM::MagicEffect::DrainSkill || effectId == ESM::MagicEffect::DamageSkill
|| effectId == ESM::MagicEffect::RestoreSkill || effectId == ESM::MagicEffect::FortifySkill
|| effectId == ESM::MagicEffect::AbsorbSkill)
if (!effectId.empty() && mMagicEffects)
{
int recordIndex = mMagicEffects->searchId(effectId);
if (recordIndex != -1)
{
const ESM::MagicEffect& mgef = mMagicEffects->getRecord(recordIndex).get();
targetSkill = mgef.mData.mFlags & ESM::MagicEffect::TargetSkill;
targetAttribute = mgef.mData.mFlags & ESM::MagicEffect::TargetAttribute;
}
}
if (targetSkill)
ingredient.mData.mAttributes[subRowIndex] = -1;
else if (effectId == ESM::MagicEffect::DrainAttribute || effectId == ESM::MagicEffect::DamageAttribute
|| effectId == ESM::MagicEffect::RestoreAttribute || effectId == ESM::MagicEffect::FortifyAttribute
|| effectId == ESM::MagicEffect::AbsorbAttribute)
else if (targetAttribute)
ingredient.mData.mSkills[subRowIndex] = -1;
else
{

View file

@ -25,6 +25,24 @@
namespace MWGui::Widgets
{
/* SpellEffectParams */
bool SpellEffectParams::operator==(const SpellEffectParams& other) const
{
if (mEffectID != other.mEffectID)
return false;
if (mEffectID.empty())
return true;
const ESM::MagicEffect* mgef
= MWBase::Environment::get().getESMStore()->get<ESM::MagicEffect>().find(mEffectID);
bool involvesSkill = mgef->mData.mFlags & ESM::MagicEffect::TargetSkill;
bool involvesAttribute = mgef->mData.mFlags & ESM::MagicEffect::TargetAttribute;
return ((other.mSkill == mSkill) || !involvesSkill) && ((other.mAttribute == mAttribute) && !involvesAttribute)
&& (other.mArea == mArea);
}
/* MWSkill */
MWSkill::MWSkill()

View file

@ -64,21 +64,7 @@ namespace MWGui
// value of 0 -> no area effect
int mArea;
bool operator==(const SpellEffectParams& other) const
{
if (mEffectID != other.mEffectID)
return false;
bool involvesAttribute = (mEffectID == ESM::MagicEffect::RestoreAttribute
|| mEffectID == ESM::MagicEffect::AbsorbAttribute || mEffectID == ESM::MagicEffect::DrainAttribute
|| mEffectID == ESM::MagicEffect::FortifyAttribute
|| mEffectID == ESM::MagicEffect::DamageAttribute);
bool involvesSkill = (mEffectID == ESM::MagicEffect::RestoreSkill
|| mEffectID == ESM::MagicEffect::AbsorbSkill || mEffectID == ESM::MagicEffect::DrainSkill
|| mEffectID == ESM::MagicEffect::FortifySkill || mEffectID == ESM::MagicEffect::DamageSkill);
return ((other.mSkill == mSkill) || !involvesSkill)
&& ((other.mAttribute == mAttribute) && !involvesAttribute) && (other.mArea == mArea);
}
bool operator==(const SpellEffectParams& other) const;
};
typedef std::vector<SpellEffectParams> SpellEffectList;