Skip to content

Commit a086ff3

Browse files
committed
Merge branch 'Transform-effect-associated-skills-and-attributes-in-ENAM-and-IRDT-to-RefIds' into 'master'
Transform magic effect-associated skills and attributes in ENAM and IRDT structs to RefIds See merge request OpenMW/openmw!5143
2 parents b6f633e + 4e828dd commit a086ff3

23 files changed

Lines changed: 100 additions & 108 deletions

apps/components_tests/esm3/testsaveload.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,8 @@ namespace ESM
576576
EffectList record;
577577
record.mList.emplace_back(IndexedENAMstruct{ {
578578
.mEffectID = ESM::MagicEffect::SwiftSwim,
579-
.mSkill = 2,
580-
.mAttribute = 3,
579+
.mSkill = ESM::Skill::MediumArmor,
580+
.mAttribute = ESM::Attribute::Agility,
581581
.mRange = 4,
582582
.mArea = 5,
583583
.mDuration = 6,

apps/esmtool/record.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,16 @@ namespace
154154
for (const ESM::IndexedENAMstruct& effect : effects.mList)
155155
{
156156
int effectIdx = ESM::MagicEffect::refIdToIndex(effect.mData.mEffectID);
157+
int skillIdx = ESM::Skill::refIdToIndex(effect.mData.mSkill);
158+
int attributeIdx = ESM::Attribute::refIdToIndex(effect.mData.mAttribute);
157159
if (effectIdx != -1)
158160
std::cout << " Effect[" << i << "]: " << magicEffectLabel(effectIdx) << " (" << effectIdx << ")"
159161
<< std::endl;
160-
if (effect.mData.mSkill != -1)
161-
std::cout << " Skill: " << skillLabel(effect.mData.mSkill) << " (" << (int)effect.mData.mSkill << ")"
162+
if (skillIdx != -1)
163+
std::cout << " Skill: " << skillLabel(skillIdx) << " (" << skillIdx << ")" << std::endl;
164+
if (attributeIdx != -1)
165+
std::cout << " Attribute: " << attributeLabel(attributeIdx) << " (" << attributeIdx << ")"
162166
<< std::endl;
163-
if (effect.mData.mAttribute != -1)
164-
std::cout << " Attribute: " << attributeLabel(effect.mData.mAttribute) << " ("
165-
<< (int)effect.mData.mAttribute << ")" << std::endl;
166167
std::cout << " Range: " << rangeTypeLabel(effect.mData.mRange) << " (" << effect.mData.mRange << ")"
167168
<< std::endl;
168169
// Area is always zero if range type is "Self"
@@ -850,11 +851,11 @@ namespace EsmTool
850851
continue;
851852

852853
int effectIdx = ESM::MagicEffect::refIdToIndex(mData.mData.mEffectID[i]);
854+
int skillIdx = ESM::Skill::refIdToIndex(mData.mData.mSkills[i]);
855+
int attributeIdx = ESM::Attribute::refIdToIndex(mData.mData.mAttributes[i]);
853856
std::cout << " Effect: " << magicEffectLabel(effectIdx) << " (" << effectIdx << ")" << std::endl;
854-
std::cout << " Skill: " << skillLabel(mData.mData.mSkills[i]) << " (" << mData.mData.mSkills[i] << ")"
855-
<< std::endl;
856-
std::cout << " Attribute: " << attributeLabel(mData.mData.mAttributes[i]) << " ("
857-
<< mData.mData.mAttributes[i] << ")" << std::endl;
857+
std::cout << " Skill: " << skillLabel(skillIdx) << " (" << skillIdx << ")" << std::endl;
858+
std::cout << " Attribute: " << attributeLabel(attributeIdx) << " (" << attributeIdx << ")" << std::endl;
858859
}
859860
std::cout << " Deleted: " << mIsDeleted << std::endl;
860861
}

apps/opencs/model/tools/effectlistcheck.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ namespace CSMTools
2727

2828
// At the time of writing this effects, attributes and skills are mostly hardcoded
2929
int effectIndex = ESM::MagicEffect::refIdToIndex(effect.mData.mEffectID);
30+
int skillIndex = ESM::Skill::refIdToIndex(effect.mData.mSkill);
31+
int attributeIndex = ESM::Attribute::refIdToIndex(effect.mData.mAttribute);
3032
if (effectIndex < -1 || effectIndex >= ESM::MagicEffect::Length)
3133
messages.add(id, "Effect #" + number + ": invalid effect ID", "", CSMDoc::Message::Severity_Error);
32-
if (effect.mData.mSkill < -1 || effect.mData.mSkill >= ESM::Skill::Length)
34+
if (skillIndex < -1 || skillIndex >= ESM::Skill::Length)
3335
messages.add(id, "Effect #" + number + ": invalid skill", "", CSMDoc::Message::Severity_Error);
34-
if (effect.mData.mAttribute < -1 || effect.mData.mAttribute >= ESM::Attribute::Length)
36+
if (attributeIndex < -1 || attributeIndex >= ESM::Attribute::Length)
3537
messages.add(id, "Effect #" + number + ": invalid attribute", "", CSMDoc::Message::Severity_Error);
3638

3739
if (effect.mData.mRange < ESM::RT_Self || effect.mData.mRange > ESM::RT_Target)
@@ -74,13 +76,15 @@ namespace CSMTools
7476

7577
hasEffects = true;
7678
int effectIndex = ESM::MagicEffect::refIdToIndex(ingredient.mData.mEffectID[i]);
79+
int skillIndex = ESM::Skill::refIdToIndex(ingredient.mData.mSkills[i]);
80+
int attributeIndex = ESM::Attribute::refIdToIndex(ingredient.mData.mAttributes[i]);
7781

7882
const std::string number = std::to_string(i + 1);
7983
if (effectIndex < -1 || effectIndex >= ESM::MagicEffect::Length)
8084
messages.add(id, "Effect #" + number + ": invalid effect ID", "", CSMDoc::Message::Severity_Error);
81-
if (ingredient.mData.mSkills[i] < -1 || ingredient.mData.mSkills[i] >= ESM::Skill::Length)
85+
if (skillIndex < -1 || skillIndex >= ESM::Skill::Length)
8286
messages.add(id, "Effect #" + number + ": invalid skill", "", CSMDoc::Message::Severity_Error);
83-
if (ingredient.mData.mAttributes[i] < -1 || ingredient.mData.mAttributes[i] >= ESM::Attribute::Length)
87+
if (attributeIndex < -1 || attributeIndex >= ESM::Attribute::Length)
8488
messages.add(id, "Effect #" + number + ": invalid attribute", "", CSMDoc::Message::Severity_Error);
8589
}
8690

apps/opencs/model/world/nestedcoladapterimp.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
#include <string>
1010
#include <vector>
1111

12+
#include <components/esm/attr.hpp>
1213
#include <components/esm3/effectlist.hpp>
1314
#include <components/esm3/loadmgef.hpp> // for converting magic effect id to string & back
15+
#include <components/esm3/loadskil.hpp>
1416

1517
#include "idcollection.hpp"
1618
#include "nestedcolumnadapter.hpp"
@@ -267,8 +269,6 @@ namespace CSMWorld
267269
ESM::IndexedENAMstruct effect;
268270
effect.mIndex = position;
269271
effect.mData.mEffectID = ESM::MagicEffect::WaterBreathing;
270-
effect.mData.mSkill = -1;
271-
effect.mData.mAttribute = -1;
272272
effect.mData.mRange = 0;
273273
effect.mData.mArea = 0;
274274
effect.mData.mDuration = 0;
@@ -339,14 +339,14 @@ namespace CSMWorld
339339
case 1:
340340
{
341341
if (targetSkill)
342-
return effect.mSkill;
342+
return ESM::Skill::refIdToIndex(effect.mSkill);
343343
else
344344
return QVariant();
345345
}
346346
case 2:
347347
{
348348
if (targetAttribute)
349-
return effect.mAttribute;
349+
return ESM::Attribute::refIdToIndex(effect.mAttribute);
350350
else
351351
return QVariant();
352352
}
@@ -389,19 +389,19 @@ namespace CSMWorld
389389
targetAttribute = mgef.mData.mFlags & ESM::MagicEffect::TargetAttribute;
390390
}
391391
if (!targetSkill)
392-
effect.mSkill = -1;
392+
effect.mSkill = ESM::RefId();
393393
if (!targetAttribute)
394-
effect.mAttribute = -1;
394+
effect.mAttribute = ESM::RefId();
395395
break;
396396
}
397397
case 1:
398398
{
399-
effect.mSkill = static_cast<signed char>(value.toInt());
399+
effect.mSkill = ESM::Skill::indexToRefId(value.toInt());
400400
break;
401401
}
402402
case 2:
403403
{
404-
effect.mAttribute = static_cast<signed char>(value.toInt());
404+
effect.mAttribute = ESM::Attribute::indexToRefId(value.toInt());
405405
break;
406406
}
407407
case 3:

apps/opencs/model/world/refidadapterimp.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,14 @@ QVariant CSMWorld::IngredEffectRefIdAdapter::getNestedData(
160160
case 1:
161161
{
162162
if (targetSkill)
163-
return record.get().mData.mSkills[subRowIndex];
163+
return ESM::Skill::refIdToIndex(record.get().mData.mSkills[subRowIndex]);
164164
else
165165
return QVariant();
166166
}
167167
case 2:
168168
{
169169
if (targetAttribute)
170-
return record.get().mData.mAttributes[subRowIndex];
170+
return ESM::Attribute::refIdToIndex(record.get().mData.mAttributes[subRowIndex]);
171171
else
172172
return QVariant();
173173
}
@@ -205,15 +205,15 @@ void CSMWorld::IngredEffectRefIdAdapter::setNestedData(
205205
}
206206

207207
if (!targetSkill)
208-
ingredient.mData.mSkills[subRowIndex] = -1;
208+
ingredient.mData.mSkills[subRowIndex] = ESM::RefId();
209209
if (!targetAttribute)
210-
ingredient.mData.mAttributes[subRowIndex] = -1;
210+
ingredient.mData.mAttributes[subRowIndex] = ESM::RefId();
211211
break;
212212
case 1:
213-
ingredient.mData.mSkills[subRowIndex] = value.toInt();
213+
ingredient.mData.mSkills[subRowIndex] = ESM::Skill::indexToRefId(value.toInt());
214214
break;
215215
case 2:
216-
ingredient.mData.mAttributes[subRowIndex] = value.toInt();
216+
ingredient.mData.mAttributes[subRowIndex] = ESM::Attribute::indexToRefId(value.toInt());
217217
break;
218218
default:
219219
throw std::runtime_error("Trying to access non-existing column in the nested table!");

apps/openmw/mwclass/ingredient.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ namespace MWClass
135135
continue;
136136
MWGui::Widgets::SpellEffectParams params;
137137
params.mEffectID = ref->mBase->mData.mEffectID[i];
138-
params.mAttribute = ESM::Attribute::indexToRefId(ref->mBase->mData.mAttributes[i]);
139-
params.mSkill = ESM::Skill::indexToRefId(ref->mBase->mData.mSkills[i]);
138+
params.mAttribute = ref->mBase->mData.mAttributes[i];
139+
params.mSkill = ref->mBase->mData.mSkills[i];
140140
params.mKnown = alchemySkill >= fWortChanceValue * (i + 1);
141141

142142
list.push_back(params);

apps/openmw/mwgui/spellcreationdialog.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ namespace
4848
effect.mMagnMax = 0;
4949
effect.mMagnMin = 0;
5050
effect.mRange = 0;
51-
effect.mSkill = -1;
52-
effect.mAttribute = -1;
5351
}
5452
}
5553

@@ -143,8 +141,8 @@ namespace MWGui
143141
mEffect.mMagnMax = 1;
144142
mEffect.mDuration = 1;
145143
mEffect.mArea = 0;
146-
mEffect.mSkill = -1;
147-
mEffect.mAttribute = -1;
144+
mEffect.mSkill = ESM::RefId();
145+
mEffect.mAttribute = ESM::RefId();
148146
eventEffectAdded(mEffect);
149147

150148
onRangeButtonClicked(mRangeButton);
@@ -331,13 +329,13 @@ namespace MWGui
331329

332330
void EditEffectDialog::setSkill(ESM::RefId skill)
333331
{
334-
mEffect.mSkill = static_cast<signed char>(ESM::Skill::refIdToIndex(skill));
332+
mEffect.mSkill = skill;
335333
eventEffectModified(mEffect);
336334
}
337335

338336
void EditEffectDialog::setAttribute(ESM::RefId attribute)
339337
{
340-
mEffect.mAttribute = static_cast<signed char>(ESM::Attribute::refIdToIndex(attribute));
338+
mEffect.mAttribute = attribute;
341339
eventEffectModified(mEffect);
342340
}
343341

@@ -961,8 +959,8 @@ namespace MWGui
961959
{
962960
Widgets::SpellEffectParams params;
963961
params.mEffectID = effectInfo.mEffectID;
964-
params.mSkill = ESM::Skill::indexToRefId(effectInfo.mSkill);
965-
params.mAttribute = ESM::Attribute::indexToRefId(effectInfo.mAttribute);
962+
params.mSkill = effectInfo.mSkill;
963+
params.mAttribute = effectInfo.mAttribute;
966964
params.mDuration = effectInfo.mDuration;
967965
params.mMagnMin = effectInfo.mMagnMin;
968966
params.mMagnMax = effectInfo.mMagnMax;

apps/openmw/mwgui/spellmodel.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ namespace MWGui
5353
if (!effectId.empty())
5454
{
5555
const ESM::MagicEffect* magicEffect = store.get<ESM::MagicEffect>().find(effectId);
56-
const ESM::Attribute* attribute
57-
= store.get<ESM::Attribute>().search(ESM::Attribute::indexToRefId(effect.mData.mAttribute));
58-
const ESM::Skill* skill = store.get<ESM::Skill>().search(ESM::Skill::indexToRefId(effect.mData.mSkill));
56+
const ESM::Attribute* attribute = store.get<ESM::Attribute>().search(effect.mData.mAttribute);
57+
const ESM::Skill* skill = store.get<ESM::Skill>().search(effect.mData.mSkill);
5958

6059
std::string fullEffectName = MWMechanics::getMagicEffectString(*magicEffect, attribute, skill);
6160
std::string convert = Utf8Stream::lowerCaseUtf8(fullEffectName);

apps/openmw/mwgui/tooltips.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,8 @@ namespace MWGui
228228
{
229229
Widgets::SpellEffectParams params;
230230
params.mEffectID = spellEffect.mData.mEffectID;
231-
params.mSkill = ESM::Skill::indexToRefId(spellEffect.mData.mSkill);
232-
params.mAttribute = ESM::Attribute::indexToRefId(spellEffect.mData.mAttribute);
231+
params.mSkill = spellEffect.mData.mSkill;
232+
params.mAttribute = spellEffect.mData.mAttribute;
233233
params.mDuration = spellEffect.mData.mDuration;
234234
params.mMagnMin = spellEffect.mData.mMagnMin;
235235
params.mMagnMax = spellEffect.mData.mMagnMax;

apps/openmw/mwgui/widgets.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ namespace MWGui::Widgets
216216
= creator->createWidget<MWSpellEffect>("MW_EffectImage", coord, MyGUI::Align::Default);
217217
SpellEffectParams params;
218218
params.mEffectID = effectInfo.mData.mEffectID;
219-
params.mSkill = ESM::Skill::indexToRefId(effectInfo.mData.mSkill);
220-
params.mAttribute = ESM::Attribute::indexToRefId(effectInfo.mData.mAttribute);
219+
params.mSkill = effectInfo.mData.mSkill;
220+
params.mAttribute = effectInfo.mData.mAttribute;
221221
params.mDuration = effectInfo.mData.mDuration;
222222
params.mMagnMin = effectInfo.mData.mMagnMin;
223223
params.mMagnMax = effectInfo.mData.mMagnMax;
@@ -333,8 +333,8 @@ namespace MWGui::Widgets
333333
{
334334
SpellEffectParams params;
335335
params.mEffectID = effectInfo.mData.mEffectID;
336-
params.mSkill = ESM::Skill::indexToRefId(effectInfo.mData.mSkill);
337-
params.mAttribute = ESM::Attribute::indexToRefId(effectInfo.mData.mAttribute);
336+
params.mSkill = effectInfo.mData.mSkill;
337+
params.mAttribute = effectInfo.mData.mAttribute;
338338
params.mDuration = effectInfo.mData.mDuration;
339339
params.mMagnMin = effectInfo.mData.mMagnMin;
340340
params.mMagnMax = effectInfo.mData.mMagnMax;

0 commit comments

Comments
 (0)