Skip to content

Commit dc022d1

Browse files
committed
Merge branch 'Assign-RefIds-to-MagicEffects' into 'master'
Assign StringRefIds to magic effects See merge request OpenMW/openmw!5064
2 parents 74387b4 + c6cc1be commit dc022d1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+2135
-1918
lines changed

apps/components_tests/esm3/testsaveload.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <components/esm3/loaddial.hpp>
99
#include <components/esm3/loadinfo.hpp>
1010
#include <components/esm3/loadland.hpp>
11+
#include <components/esm3/loadmgef.hpp>
1112
#include <components/esm3/loadregn.hpp>
1213
#include <components/esm3/loadscpt.hpp>
1314
#include <components/esm3/loadweap.hpp>
@@ -574,7 +575,7 @@ namespace ESM
574575
{
575576
EffectList record;
576577
record.mList.emplace_back(IndexedENAMstruct{ {
577-
.mEffectID = 1,
578+
.mEffectID = ESM::MagicEffect::SwiftSwim,
578579
.mSkill = 2,
579580
.mAttribute = 3,
580581
.mRange = 4,

apps/esmtool/record.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,10 @@ namespace
153153
int i = 0;
154154
for (const ESM::IndexedENAMstruct& effect : effects.mList)
155155
{
156-
std::cout << " Effect[" << i << "]: " << magicEffectLabel(effect.mData.mEffectID) << " ("
157-
<< effect.mData.mEffectID << ")" << std::endl;
156+
int effectIdx = ESM::MagicEffect::refIdToIndex(effect.mData.mEffectID);
157+
if (effectIdx != -1)
158+
std::cout << " Effect[" << i << "]: " << magicEffectLabel(effectIdx) << " (" << effectIdx << ")"
159+
<< std::endl;
158160
if (effect.mData.mSkill != -1)
159161
std::cout << " Skill: " << skillLabel(effect.mData.mSkill) << " (" << (int)effect.mData.mSkill << ")"
160162
<< std::endl;
@@ -843,11 +845,12 @@ namespace EsmTool
843845
std::cout << " Value: " << mData.mData.mValue << std::endl;
844846
for (int i = 0; i != 4; i++)
845847
{
846-
// A value of -1 means no effect
847-
if (mData.mData.mEffectID[i] == -1)
848+
// A value of EmptyRefId means no effect
849+
if (mData.mData.mEffectID[i].empty())
848850
continue;
849-
std::cout << " Effect: " << magicEffectLabel(mData.mData.mEffectID[i]) << " (" << mData.mData.mEffectID[i]
850-
<< ")" << std::endl;
851+
852+
int effectIdx = ESM::MagicEffect::refIdToIndex(mData.mData.mEffectID[i]);
853+
std::cout << " Effect: " << magicEffectLabel(effectIdx) << " (" << effectIdx << ")" << std::endl;
851854
std::cout << " Skill: " << skillLabel(mData.mData.mSkills[i]) << " (" << mData.mData.mSkills[i] << ")"
852855
<< std::endl;
853856
std::cout << " Attribute: " << attributeLabel(mData.mData.mAttributes[i]) << " ("
@@ -973,7 +976,8 @@ namespace EsmTool
973976
template <>
974977
void Record<ESM::MagicEffect>::print()
975978
{
976-
std::cout << " Index: " << magicEffectLabel(mData.mIndex) << " (" << mData.mIndex << ")" << std::endl;
979+
int effectIdx = ESM::MagicEffect::refIdToIndex(mData.mId);
980+
std::cout << " Index: " << magicEffectLabel(effectIdx) << " (" << effectIdx << ")" << std::endl;
977981
std::cout << " Description: " << mData.mDescription << std::endl;
978982
std::cout << " Icon: " << mData.mIcon << std::endl;
979983
std::cout << " Flags: " << magicEffectFlags(mData.mData.mFlags) << std::endl;

apps/opencs/model/doc/document.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,11 +128,18 @@ void CSMDoc::Document::addOptionalGlobals()
128128

129129
void CSMDoc::Document::addOptionalMagicEffects()
130130
{
131-
for (int i = ESM::MagicEffect::SummonFabricant; i <= ESM::MagicEffect::SummonCreature05; ++i)
131+
static const std::array<ESM::RefId, 6> optionalMagicEffects{
132+
ESM::MagicEffect::SummonFabricant,
133+
ESM::MagicEffect::SummonWolf,
134+
ESM::MagicEffect::SummonBear,
135+
ESM::MagicEffect::SummonBonewolf,
136+
ESM::MagicEffect::SummonCreature04,
137+
ESM::MagicEffect::SummonCreature05,
138+
};
139+
for (const auto effectId : optionalMagicEffects)
132140
{
133141
ESM::MagicEffect effect;
134-
effect.mIndex = i;
135-
effect.mId = ESM::MagicEffect::indexToRefId(i);
142+
effect.mId = effectId;
136143
effect.blank();
137144

138145
addOptionalMagicEffect(effect);
@@ -282,10 +289,7 @@ void CSMDoc::Document::createBase()
282289
for (int i = 0; i < ESM::MagicEffect::Length; ++i)
283290
{
284291
ESM::MagicEffect record;
285-
286-
record.mIndex = i;
287292
record.mId = ESM::MagicEffect::indexToRefId(i);
288-
289293
record.blank();
290294

291295
getData().getMagicEffects().add(record);

apps/opencs/model/tools/effectlistcheck.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ namespace CSMTools
2626
const std::string number = std::to_string(i);
2727

2828
// At the time of writing this effects, attributes and skills are mostly hardcoded
29-
if (effect.mData.mEffectID < 0 || effect.mData.mEffectID >= ESM::MagicEffect::Length)
29+
int effectIndex = ESM::MagicEffect::refIdToIndex(effect.mData.mEffectID);
30+
if (effectIndex < -1 || effectIndex >= ESM::MagicEffect::Length)
3031
messages.add(id, "Effect #" + number + ": invalid effect ID", "", CSMDoc::Message::Severity_Error);
3132
if (effect.mData.mSkill < -1 || effect.mData.mSkill >= ESM::Skill::Length)
3233
messages.add(id, "Effect #" + number + ": invalid skill", "", CSMDoc::Message::Severity_Error);
@@ -68,13 +69,14 @@ namespace CSMTools
6869

6970
for (size_t i = 0; i < 4; i++)
7071
{
71-
if (ingredient.mData.mEffectID[i] == -1)
72+
if (ingredient.mData.mEffectID[i].empty())
7273
continue;
7374

7475
hasEffects = true;
76+
int effectIndex = ESM::MagicEffect::refIdToIndex(ingredient.mData.mEffectID[i]);
7577

7678
const std::string number = std::to_string(i + 1);
77-
if (ingredient.mData.mEffectID[i] < -1 || ingredient.mData.mEffectID[i] >= ESM::MagicEffect::Length)
79+
if (effectIndex < -1 || effectIndex >= ESM::MagicEffect::Length)
7880
messages.add(id, "Effect #" + number + ": invalid effect ID", "", CSMDoc::Message::Severity_Error);
7981
if (ingredient.mData.mSkills[i] < -1 || ingredient.mData.mSkills[i] >= ESM::Skill::Length)
8082
messages.add(id, "Effect #" + number + ": invalid skill", "", CSMDoc::Message::Severity_Error);

apps/opencs/model/world/collection.hpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,6 @@ namespace CSMWorld
7373
return ESM::RefId::stringRefId(Land::createUniqueRecordId(record.mX, record.mY));
7474
}
7575

76-
inline ESM::RefId getRecordId(const ESM::MagicEffect& record)
77-
{
78-
return ESM::RefId::stringRefId(CSMWorld::getStringId(record.mId));
79-
}
80-
81-
inline void setRecordId(const ESM::RefId& id, ESM::MagicEffect& record)
82-
{
83-
int index = ESM::MagicEffect::indexNameToIndex(id.getRefIdString());
84-
record.mId = ESM::RefId::index(ESM::REC_MGEF, static_cast<std::uint32_t>(index));
85-
}
86-
8776
inline void setRecordId(const ESM::RefId& id, ESM::Skill& record)
8877
{
8978
if (const auto* skillId = id.getIf<ESM::SkillId>())

apps/opencs/model/world/columnimp.cpp

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,7 @@ namespace CSMWorld
2525

2626
std::string operator()(ESM::FormId value) const { return value.toString("FormId:"); }
2727

28-
std::string operator()(ESM::IndexRefId value) const
29-
{
30-
switch (value.getRecordType())
31-
{
32-
case ESM::REC_MGEF:
33-
return std::string(ESM::MagicEffect::sIndexNames[value.getValue()]);
34-
default:
35-
break;
36-
}
37-
38-
return value.toDebugString();
39-
}
28+
std::string operator()(ESM::IndexRefId value) const { return value.toDebugString(); }
4029

4130
template <class T>
4231
std::string operator()(const T& value) const

apps/opencs/model/world/nestedcoladapterimp.hpp

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ namespace CSMWorld
260260
// blank row
261261
ESM::IndexedENAMstruct effect;
262262
effect.mIndex = position;
263-
effect.mData.mEffectID = 0;
263+
effect.mData.mEffectID = ESM::MagicEffect::WaterBreathing;
264264
effect.mData.mSkill = -1;
265265
effect.mData.mAttribute = -1;
266266
effect.mData.mRange = 0;
@@ -319,34 +319,28 @@ namespace CSMWorld
319319
switch (subColIndex)
320320
{
321321
case 0:
322-
return effect.mEffectID;
322+
return ESM::MagicEffect::refIdToIndex(effect.mEffectID);
323323
case 1:
324324
{
325-
switch (effect.mEffectID)
326-
{
327-
case ESM::MagicEffect::DrainSkill:
328-
case ESM::MagicEffect::DamageSkill:
329-
case ESM::MagicEffect::RestoreSkill:
330-
case ESM::MagicEffect::FortifySkill:
331-
case ESM::MagicEffect::AbsorbSkill:
332-
return effect.mSkill;
333-
default:
334-
return QVariant();
335-
}
325+
if (effect.mEffectID == ESM::MagicEffect::DrainSkill
326+
|| effect.mEffectID == ESM::MagicEffect::DamageSkill
327+
|| effect.mEffectID == ESM::MagicEffect::RestoreSkill
328+
|| effect.mEffectID == ESM::MagicEffect::FortifySkill
329+
|| effect.mEffectID == ESM::MagicEffect::AbsorbSkill)
330+
return effect.mSkill;
331+
else
332+
return QVariant();
336333
}
337334
case 2:
338335
{
339-
switch (effect.mEffectID)
340-
{
341-
case ESM::MagicEffect::DrainAttribute:
342-
case ESM::MagicEffect::DamageAttribute:
343-
case ESM::MagicEffect::RestoreAttribute:
344-
case ESM::MagicEffect::FortifyAttribute:
345-
case ESM::MagicEffect::AbsorbAttribute:
346-
return effect.mAttribute;
347-
default:
348-
return QVariant();
349-
}
336+
if (effect.mEffectID == ESM::MagicEffect::DrainAttribute
337+
|| effect.mEffectID == ESM::MagicEffect::DamageAttribute
338+
|| effect.mEffectID == ESM::MagicEffect::RestoreAttribute
339+
|| effect.mEffectID == ESM::MagicEffect::FortifyAttribute
340+
|| effect.mEffectID == ESM::MagicEffect::AbsorbAttribute)
341+
return effect.mAttribute;
342+
else
343+
return QVariant();
350344
}
351345
case 3:
352346
return effect.mRange;
@@ -377,26 +371,23 @@ namespace CSMWorld
377371
{
378372
case 0:
379373
{
380-
effect.mEffectID = static_cast<short>(value.toInt());
381-
switch (effect.mEffectID)
374+
effect.mEffectID = ESM::MagicEffect::indexToRefId(value.toInt());
375+
if (effect.mEffectID == ESM::MagicEffect::DrainSkill
376+
|| effect.mEffectID == ESM::MagicEffect::DamageSkill
377+
|| effect.mEffectID == ESM::MagicEffect::RestoreSkill
378+
|| effect.mEffectID == ESM::MagicEffect::FortifySkill
379+
|| effect.mEffectID == ESM::MagicEffect::AbsorbSkill)
380+
effect.mAttribute = -1;
381+
else if (effect.mEffectID == ESM::MagicEffect::DrainAttribute
382+
|| effect.mEffectID == ESM::MagicEffect::DamageAttribute
383+
|| effect.mEffectID == ESM::MagicEffect::RestoreAttribute
384+
|| effect.mEffectID == ESM::MagicEffect::FortifyAttribute
385+
|| effect.mEffectID == ESM::MagicEffect::AbsorbAttribute)
386+
effect.mSkill = -1;
387+
else
382388
{
383-
case ESM::MagicEffect::DrainSkill:
384-
case ESM::MagicEffect::DamageSkill:
385-
case ESM::MagicEffect::RestoreSkill:
386-
case ESM::MagicEffect::FortifySkill:
387-
case ESM::MagicEffect::AbsorbSkill:
388-
effect.mAttribute = -1;
389-
break;
390-
case ESM::MagicEffect::DrainAttribute:
391-
case ESM::MagicEffect::DamageAttribute:
392-
case ESM::MagicEffect::RestoreAttribute:
393-
case ESM::MagicEffect::FortifyAttribute:
394-
case ESM::MagicEffect::AbsorbAttribute:
395-
effect.mSkill = -1;
396-
break;
397-
default:
398-
effect.mSkill = -1;
399-
effect.mAttribute = -1;
389+
effect.mSkill = -1;
390+
effect.mAttribute = -1;
400391
}
401392
break;
402393
}

apps/opencs/model/world/refidadapterimp.cpp

Lines changed: 29 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -144,37 +144,29 @@ QVariant CSMWorld::IngredEffectRefIdAdapter::getNestedData(
144144
if (subRowIndex < 0 || subRowIndex >= 4)
145145
throw std::runtime_error("index out of range");
146146

147+
ESM::RefId effectId = record.get().mData.mEffectID[subRowIndex];
148+
147149
switch (subColIndex)
148150
{
149151
case 0:
150-
return record.get().mData.mEffectID[subRowIndex];
152+
return ESM::MagicEffect::refIdToIndex(effectId);
151153
case 1:
152154
{
153-
switch (record.get().mData.mEffectID[subRowIndex])
154-
{
155-
case ESM::MagicEffect::DrainSkill:
156-
case ESM::MagicEffect::DamageSkill:
157-
case ESM::MagicEffect::RestoreSkill:
158-
case ESM::MagicEffect::FortifySkill:
159-
case ESM::MagicEffect::AbsorbSkill:
160-
return record.get().mData.mSkills[subRowIndex];
161-
default:
162-
return QVariant();
163-
}
155+
if (effectId == ESM::MagicEffect::DrainSkill || effectId == ESM::MagicEffect::DamageSkill
156+
|| effectId == ESM::MagicEffect::RestoreSkill || effectId == ESM::MagicEffect::FortifySkill
157+
|| effectId == ESM::MagicEffect::AbsorbSkill)
158+
return record.get().mData.mSkills[subRowIndex];
159+
else
160+
return QVariant();
164161
}
165162
case 2:
166163
{
167-
switch (record.get().mData.mEffectID[subRowIndex])
168-
{
169-
case ESM::MagicEffect::DrainAttribute:
170-
case ESM::MagicEffect::DamageAttribute:
171-
case ESM::MagicEffect::RestoreAttribute:
172-
case ESM::MagicEffect::FortifyAttribute:
173-
case ESM::MagicEffect::AbsorbAttribute:
174-
return record.get().mData.mAttributes[subRowIndex];
175-
default:
176-
return QVariant();
177-
}
164+
if (effectId == ESM::MagicEffect::DrainAttribute || effectId == ESM::MagicEffect::DamageAttribute
165+
|| effectId == ESM::MagicEffect::RestoreAttribute || effectId == ESM::MagicEffect::FortifyAttribute
166+
|| effectId == ESM::MagicEffect::AbsorbAttribute)
167+
return record.get().mData.mAttributes[subRowIndex];
168+
else
169+
return QVariant();
178170
}
179171
default:
180172
throw std::runtime_error("Trying to access non-existing column in the nested table!");
@@ -191,29 +183,24 @@ void CSMWorld::IngredEffectRefIdAdapter::setNestedData(
191183
if (subRowIndex < 0 || subRowIndex >= 4)
192184
throw std::runtime_error("index out of range");
193185

186+
ESM::RefId effectId = ESM::MagicEffect::indexToRefId(value.toInt());
187+
194188
switch (subColIndex)
195189
{
196190
case 0:
197-
ingredient.mData.mEffectID[subRowIndex] = value.toInt();
198-
switch (ingredient.mData.mEffectID[subRowIndex])
191+
ingredient.mData.mEffectID[subRowIndex] = effectId;
192+
if (effectId == ESM::MagicEffect::DrainSkill || effectId == ESM::MagicEffect::DamageSkill
193+
|| effectId == ESM::MagicEffect::RestoreSkill || effectId == ESM::MagicEffect::FortifySkill
194+
|| effectId == ESM::MagicEffect::AbsorbSkill)
195+
ingredient.mData.mAttributes[subRowIndex] = -1;
196+
else if (effectId == ESM::MagicEffect::DrainAttribute || effectId == ESM::MagicEffect::DamageAttribute
197+
|| effectId == ESM::MagicEffect::RestoreAttribute || effectId == ESM::MagicEffect::FortifyAttribute
198+
|| effectId == ESM::MagicEffect::AbsorbAttribute)
199+
ingredient.mData.mSkills[subRowIndex] = -1;
200+
else
199201
{
200-
case ESM::MagicEffect::DrainSkill:
201-
case ESM::MagicEffect::DamageSkill:
202-
case ESM::MagicEffect::RestoreSkill:
203-
case ESM::MagicEffect::FortifySkill:
204-
case ESM::MagicEffect::AbsorbSkill:
205-
ingredient.mData.mAttributes[subRowIndex] = -1;
206-
break;
207-
case ESM::MagicEffect::DrainAttribute:
208-
case ESM::MagicEffect::DamageAttribute:
209-
case ESM::MagicEffect::RestoreAttribute:
210-
case ESM::MagicEffect::FortifyAttribute:
211-
case ESM::MagicEffect::AbsorbAttribute:
212-
ingredient.mData.mSkills[subRowIndex] = -1;
213-
break;
214-
default:
215-
ingredient.mData.mSkills[subRowIndex] = -1;
216-
ingredient.mData.mAttributes[subRowIndex] = -1;
202+
ingredient.mData.mSkills[subRowIndex] = -1;
203+
ingredient.mData.mAttributes[subRowIndex] = -1;
217204
}
218205
break;
219206
case 1:

apps/openmw/mwclass/ingredient.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ namespace MWClass
7171

7272
std::unique_ptr<MWWorld::Action> Ingredient::use(const MWWorld::Ptr& ptr, bool force) const
7373
{
74-
if (ptr.get<ESM::Ingredient>()->mBase->mData.mEffectID[0] < 0)
74+
if (ptr.get<ESM::Ingredient>()->mBase->mData.mEffectID[0].empty())
7575
return std::make_unique<MWWorld::NullAction>();
7676
std::unique_ptr<MWWorld::Action> action = std::make_unique<MWWorld::ActionEat>(ptr);
7777

@@ -131,10 +131,10 @@ namespace MWClass
131131
MWGui::Widgets::SpellEffectList list;
132132
for (int i = 0; i < 4; ++i)
133133
{
134-
if (ref->mBase->mData.mEffectID[i] < 0)
134+
if (ref->mBase->mData.mEffectID[i].empty())
135135
continue;
136136
MWGui::Widgets::SpellEffectParams params;
137-
params.mEffectID = static_cast<short>(ref->mBase->mData.mEffectID[i]);
137+
params.mEffectID = ref->mBase->mData.mEffectID[i];
138138
params.mAttribute = ESM::Attribute::indexToRefId(ref->mBase->mData.mAttributes[i]);
139139
params.mSkill = ESM::Skill::indexToRefId(ref->mBase->mData.mSkills[i]);
140140
params.mKnown = alchemySkill >= fWortChanceValue * (i + 1);

apps/openmw/mwgui/alchemywindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ namespace MWGui
459459
for (const MWMechanics::EffectKey& effectKey : effectIds)
460460
{
461461
Widgets::SpellEffectParams params;
462-
params.mEffectID = static_cast<short>(effectKey.mId);
462+
params.mEffectID = effectKey.mId;
463463
const ESM::MagicEffect* magicEffect
464464
= MWBase::Environment::get().getESMStore()->get<ESM::MagicEffect>().find(effectKey.mId);
465465
if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetSkill)

0 commit comments

Comments
 (0)