diff --git a/apps/openmw/mwgui/spellcreationdialog.cpp b/apps/openmw/mwgui/spellcreationdialog.cpp index 69eb0fbf46..f1ed1c4219 100644 --- a/apps/openmw/mwgui/spellcreationdialog.cpp +++ b/apps/openmw/mwgui/spellcreationdialog.cpp @@ -37,8 +37,8 @@ namespace const MWWorld::Store& gmst = MWBase::Environment::get().getESMStore()->get(); - return gmst.find(ESM::MagicEffect::effectIdToString(id1))->mValue.getString() - < gmst.find(ESM::MagicEffect::effectIdToString(id2))->mValue.getString(); + return gmst.find(ESM::MagicEffect::effectIdToGmstString(id1))->mValue.getString() + < gmst.find(ESM::MagicEffect::effectIdToGmstString(id2))->mValue.getString(); } void init(ESM::ENAMstruct& effect) @@ -196,7 +196,8 @@ namespace MWGui mEffectImage->setImageTexture(Misc::ResourceHelpers::correctIconPath( effect->mIcon, MWBase::Environment::get().getResourceSystem()->getVFS())); - mEffectName->setCaptionWithReplacing("#{" + ESM::MagicEffect::effectIdToString(effect->mIndex) + "}"); + mEffectName->setCaptionWithReplacing( + "#{" + std::string(ESM::MagicEffect::effectIdToGmstString(effect->mIndex)) + "}"); mEffect.mEffectID = effect->mIndex; @@ -552,7 +553,7 @@ namespace MWGui mAvailableEffectsList->addItem(MWBase::Environment::get() .getESMStore() ->get() - .find(ESM::MagicEffect::effectIdToString(effectId)) + .find(ESM::MagicEffect::effectIdToGmstString(effectId)) ->mValue.getString()); mButtonMapping[i] = effectId; ++i; @@ -565,7 +566,7 @@ namespace MWGui const std::string& name = MWBase::Environment::get() .getESMStore() ->get() - .find(ESM::MagicEffect::effectIdToString(effectId)) + .find(ESM::MagicEffect::effectIdToGmstString(effectId)) ->mValue.getString(); MyGUI::Widget* w = mAvailableEffectsList->getItemWidget(name); diff --git a/apps/openmw/mwgui/spellicons.cpp b/apps/openmw/mwgui/spellicons.cpp index dcd65c48b4..3bce6f4fde 100644 --- a/apps/openmw/mwgui/spellicons.cpp +++ b/apps/openmw/mwgui/spellicons.cpp @@ -162,10 +162,10 @@ namespace MWGui image->setImageTexture(Misc::ResourceHelpers::correctIconPath( effect->mIcon, MWBase::Environment::get().getResourceSystem()->getVFS())); - const std::string& name = ESM::MagicEffect::effectIdToString(effectId); + std::string_view name = ESM::MagicEffect::effectIdToGmstString(effectId); ToolTipInfo tooltipInfo; - tooltipInfo.caption = "#{" + name + "}"; + tooltipInfo.caption = "#{" + std::string(name) + "}"; tooltipInfo.icon = effect->mIcon; tooltipInfo.imageSize = 16; tooltipInfo.wordWrap = false; diff --git a/apps/openmw/mwgui/tooltips.cpp b/apps/openmw/mwgui/tooltips.cpp index 84fb8157a3..593a52e720 100644 --- a/apps/openmw/mwgui/tooltips.cpp +++ b/apps/openmw/mwgui/tooltips.cpp @@ -954,7 +954,7 @@ namespace MWGui void ToolTips::createMagicEffectToolTip(MyGUI::Widget* widget, short id) { const ESM::MagicEffect* effect = MWBase::Environment::get().getESMStore()->get().find(id); - const std::string& name = ESM::MagicEffect::effectIdToString(id); + std::string_view name = ESM::MagicEffect::effectIdToGmstString(id); std::string icon = effect->mIcon; int slashPos = icon.rfind('\\'); @@ -963,7 +963,7 @@ namespace MWGui widget->setUserString("ToolTipType", "Layout"); widget->setUserString("ToolTipLayout", "MagicEffectToolTip"); - widget->setUserString("Caption_MagicEffectName", "#{" + name + "}"); + widget->setUserString("Caption_MagicEffectName", "#{" + std::string(name) + "}"); widget->setUserString("Caption_MagicEffectDescription", effect->mDescription); widget->setUserString("Caption_MagicEffectSchool", "#{sSchool}: " + sSchoolNames[effect->mData.mSchool]); widget->setUserString("ImageTexture_MagicEffectImage", icon); diff --git a/apps/openmw/mwlua/magicbindings.cpp b/apps/openmw/mwlua/magicbindings.cpp index 02ef0eba65..85893a8c08 100644 --- a/apps/openmw/mwlua/magicbindings.cpp +++ b/apps/openmw/mwlua/magicbindings.cpp @@ -191,12 +191,9 @@ namespace MWLua sol::table effect(context.mLua->sol(), sol::create); magicApi["EFFECT_TYPE"] = LuaUtil::makeStrictReadOnly(effect); - for (int id = 0; id < ESM::MagicEffect::Length; ++id) + for (const auto& it : ESM::MagicEffect::sEffectNames) { - auto name = ESM::MagicEffect::effectIdToString(id); - // Chop off the 'sEffect' prefix present on 100% of effect id strings - name = name.substr(7); - effect[name] = Misc::StringUtils::lowerCase(name); + effect[it.second] = Misc::StringUtils::lowerCase(it.second); } // Spell store @@ -266,7 +263,7 @@ namespace MWLua auto effectParamsT = lua.new_usertype("ESM3_EffectParams"); effectParamsT[sol::meta_function::to_string] = [magicEffectStore](const ESM::ENAMstruct& params) { const ESM::MagicEffect* const rec = magicEffectStore->find(params.mEffectID); - return "ESM3_EffectParams[" + ESM::MagicEffect::effectIdToString(rec->mIndex) + "]"; + return "ESM3_EffectParams[" + std::string(ESM::MagicEffect::effectIdToGmstString(rec->mIndex)) + "]"; }; effectParamsT["effect"] = sol::readonly_property([magicEffectStore](const ESM::ENAMstruct& params) -> const ESM::MagicEffect* { @@ -299,11 +296,10 @@ namespace MWLua auto magicEffectT = context.mLua->sol().new_usertype("ESM3_MagicEffect"); magicEffectT[sol::meta_function::to_string] = [](const ESM::MagicEffect& rec) { - return "ESM3_MagicEffect[" + ESM::MagicEffect::effectIdToString(rec.mIndex) + "]"; + return "ESM3_MagicEffect[" + std::string(ESM::MagicEffect::effectIdToGmstString(rec.mIndex)) + "]"; }; magicEffectT["id"] = sol::readonly_property([](const ESM::MagicEffect& rec) -> std::string { - auto gmstName = ESM::MagicEffect::effectIdToString(rec.mIndex); - auto name = gmstName.substr(7); // Remove the 'sEffect' prefix + auto name = ESM::MagicEffect::effectIdToName(rec.mIndex); return Misc::StringUtils::lowerCase(name); }); magicEffectT["name"] = sol::readonly_property([](const ESM::MagicEffect& rec) -> std::string_view { @@ -311,7 +307,7 @@ namespace MWLua .getWorld() ->getStore() .get() - .find(ESM::MagicEffect::effectIdToString(rec.mIndex)) + .find(ESM::MagicEffect::effectIdToGmstString(rec.mIndex)) ->mValue.getString(); }); magicEffectT["school"] @@ -331,11 +327,10 @@ namespace MWLua auto activeEffectT = context.mLua->sol().new_usertype("ActiveEffect"); activeEffectT[sol::meta_function::to_string] = [](const ActiveEffect& effect) { - return "ActiveEffect[" + ESM::MagicEffect::effectIdToString(effect.key.mId) + "]"; + return "ActiveEffect[" + std::string(ESM::MagicEffect::effectIdToGmstString(effect.key.mId)) + "]"; }; activeEffectT["id"] = sol::readonly_property([](const ActiveEffect& effect) -> std::string { - auto gmstName = ESM::MagicEffect::effectIdToString(effect.key.mId); - auto name = gmstName.substr(7); // Remove the 'sEffect' prefix + auto name = ESM::MagicEffect::effectIdToName(effect.key.mId); return Misc::StringUtils::lowerCase(name); }); activeEffectT["name"] @@ -575,7 +570,7 @@ namespace MWLua if (!effects.isActor()) return sol::nullopt; - auto id = ESM::MagicEffect::effectStringToId("sEffect" + std::string(idStr)); + auto id = ESM::MagicEffect::effectNameToId(idStr); auto* rec = MWBase::Environment::get().getWorld()->getStore().get().find(id); MWMechanics::EffectKey key = MWMechanics::EffectKey(id); diff --git a/apps/openmw/mwmechanics/magiceffects.cpp b/apps/openmw/mwmechanics/magiceffects.cpp index 61589490e7..d2446fc975 100644 --- a/apps/openmw/mwmechanics/magiceffects.cpp +++ b/apps/openmw/mwmechanics/magiceffects.cpp @@ -268,7 +268,7 @@ namespace MWMechanics if (spellLine.empty()) { - const std::string& effectIDStr = ESM::MagicEffect::effectIdToString(effect.mIndex); + std::string_view effectIDStr = ESM::MagicEffect::effectIdToGmstString(effect.mIndex); spellLine = windowManager->getGameSettingString(effectIDStr, {}); } diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 080b6094d7..2d4d5d045a 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -582,7 +582,7 @@ namespace MWScript k.has_value() && *k >= 0 && *k <= 32767) key = *k; else - key = ESM::MagicEffect::effectStringToId({ effect }); + key = ESM::MagicEffect::effectGmstIdToId(effect); const MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr); diff --git a/apps/openmw/mwworld/esmstore.cpp b/apps/openmw/mwworld/esmstore.cpp index ae539fcab1..915a6b5a4b 100644 --- a/apps/openmw/mwworld/esmstore.cpp +++ b/apps/openmw/mwworld/esmstore.cpp @@ -538,8 +538,8 @@ namespace MWWorld { iter->mAttribute = -1; Log(Debug::Verbose) - << ESM::MagicEffect::effectIdToString(iter->mEffectID) << " effect of spell '" << spell.mId - << "' has an attribute argument present. Dropping the argument."; + << ESM::MagicEffect::effectIdToGmstString(iter->mEffectID) << " effect of spell '" + << spell.mId << "' has an attribute argument present. Dropping the argument."; changed = true; } } @@ -549,8 +549,8 @@ namespace MWWorld { iter->mSkill = -1; Log(Debug::Verbose) - << ESM::MagicEffect::effectIdToString(iter->mEffectID) << " effect of spell '" << spell.mId - << "' has a skill argument present. Dropping the argument."; + << ESM::MagicEffect::effectIdToGmstString(iter->mEffectID) << " effect of spell '" + << spell.mId << "' has a skill argument present. Dropping the argument."; changed = true; } } @@ -558,8 +558,9 @@ namespace MWWorld { iter->mSkill = -1; iter->mAttribute = -1; - Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(iter->mEffectID) << " effect of spell '" - << spell.mId << "' has argument(s) present. Dropping the argument(s)."; + Log(Debug::Verbose) << ESM::MagicEffect::effectIdToGmstString(iter->mEffectID) + << " effect of spell '" << spell.mId + << "' has argument(s) present. Dropping the argument(s)."; changed = true; } diff --git a/components/esm3/loadmgef.cpp b/components/esm3/loadmgef.cpp index f077221125..adcf386172 100644 --- a/components/esm3/loadmgef.cpp +++ b/components/esm3/loadmgef.cpp @@ -351,171 +351,307 @@ namespace ESM return -1; } - static std::map genNameMap() - { - // Map effect ID to GMST name - // http://www.uesp.net/morrow/hints/mweffects.shtml - std::map names; - names[85] = "sEffectAbsorbAttribute"; - names[88] = "sEffectAbsorbFatigue"; - names[86] = "sEffectAbsorbHealth"; - names[87] = "sEffectAbsorbSpellPoints"; - names[89] = "sEffectAbsorbSkill"; - names[63] = "sEffectAlmsiviIntervention"; - names[47] = "sEffectBlind"; - names[123] = "sEffectBoundBattleAxe"; - names[129] = "sEffectBoundBoots"; - names[127] = "sEffectBoundCuirass"; - names[120] = "sEffectBoundDagger"; - names[131] = "sEffectBoundGloves"; - names[128] = "sEffectBoundHelm"; - names[125] = "sEffectBoundLongbow"; - names[126] = "sEffectExtraSpell"; - names[121] = "sEffectBoundLongsword"; - names[122] = "sEffectBoundMace"; - names[130] = "sEffectBoundShield"; - names[124] = "sEffectBoundSpear"; - names[7] = "sEffectBurden"; - names[50] = "sEffectCalmCreature"; - names[49] = "sEffectCalmHumanoid"; - names[40] = "sEffectChameleon"; - names[44] = "sEffectCharm"; - names[118] = "sEffectCommandCreatures"; - names[119] = "sEffectCommandHumanoids"; - names[132] = "sEffectCorpus"; // NB this typo. (bethesda made it) - names[70] = "sEffectCureBlightDisease"; - names[69] = "sEffectCureCommonDisease"; - names[71] = "sEffectCureCorprusDisease"; - names[73] = "sEffectCureParalyzation"; - names[72] = "sEffectCurePoison"; - names[22] = "sEffectDamageAttribute"; - names[25] = "sEffectDamageFatigue"; - names[23] = "sEffectDamageHealth"; - names[24] = "sEffectDamageMagicka"; - names[26] = "sEffectDamageSkill"; - names[54] = "sEffectDemoralizeCreature"; - names[53] = "sEffectDemoralizeHumanoid"; - names[64] = "sEffectDetectAnimal"; - names[65] = "sEffectDetectEnchantment"; - names[66] = "sEffectDetectKey"; - names[38] = "sEffectDisintegrateArmor"; - names[37] = "sEffectDisintegrateWeapon"; - names[57] = "sEffectDispel"; - names[62] = "sEffectDivineIntervention"; - names[17] = "sEffectDrainAttribute"; - names[20] = "sEffectDrainFatigue"; - names[18] = "sEffectDrainHealth"; - names[19] = "sEffectDrainSpellpoints"; - names[21] = "sEffectDrainSkill"; - names[8] = "sEffectFeather"; - names[14] = "sEffectFireDamage"; - names[4] = "sEffectFireShield"; - names[117] = "sEffectFortifyAttackBonus"; - names[79] = "sEffectFortifyAttribute"; - names[82] = "sEffectFortifyFatigue"; - names[80] = "sEffectFortifyHealth"; - names[81] = "sEffectFortifySpellpoints"; - names[84] = "sEffectFortifyMagickaMultiplier"; - names[83] = "sEffectFortifySkill"; - names[52] = "sEffectFrenzyCreature"; - names[51] = "sEffectFrenzyHumanoid"; - names[16] = "sEffectFrostDamage"; - names[6] = "sEffectFrostShield"; - names[39] = "sEffectInvisibility"; - names[9] = "sEffectJump"; - names[10] = "sEffectLevitate"; - names[41] = "sEffectLight"; - names[5] = "sEffectLightningShield"; - names[12] = "sEffectLock"; - names[60] = "sEffectMark"; - names[43] = "sEffectNightEye"; - names[13] = "sEffectOpen"; - names[45] = "sEffectParalyze"; - names[27] = "sEffectPoison"; - names[56] = "sEffectRallyCreature"; - names[55] = "sEffectRallyHumanoid"; - names[61] = "sEffectRecall"; - names[68] = "sEffectReflect"; - names[100] = "sEffectRemoveCurse"; - names[95] = "sEffectResistBlightDisease"; - names[94] = "sEffectResistCommonDisease"; - names[96] = "sEffectResistCorprusDisease"; - names[90] = "sEffectResistFire"; - names[91] = "sEffectResistFrost"; - names[93] = "sEffectResistMagicka"; - names[98] = "sEffectResistNormalWeapons"; - names[99] = "sEffectResistParalysis"; - names[97] = "sEffectResistPoison"; - names[92] = "sEffectResistShock"; - names[74] = "sEffectRestoreAttribute"; - names[77] = "sEffectRestoreFatigue"; - names[75] = "sEffectRestoreHealth"; - names[76] = "sEffectRestoreSpellPoints"; - names[78] = "sEffectRestoreSkill"; - names[42] = "sEffectSanctuary"; - names[3] = "sEffectShield"; - names[15] = "sEffectShockDamage"; - names[46] = "sEffectSilence"; - names[11] = "sEffectSlowFall"; - names[58] = "sEffectSoultrap"; - names[48] = "sEffectSound"; - names[67] = "sEffectSpellAbsorption"; - names[136] = "sEffectStuntedMagicka"; - names[106] = "sEffectSummonAncestralGhost"; - names[110] = "sEffectSummonBonelord"; - names[108] = "sEffectSummonLeastBonewalker"; - names[134] = "sEffectSummonCenturionSphere"; - names[103] = "sEffectSummonClannfear"; - names[104] = "sEffectSummonDaedroth"; - names[105] = "sEffectSummonDremora"; - names[114] = "sEffectSummonFlameAtronach"; - names[115] = "sEffectSummonFrostAtronach"; - names[113] = "sEffectSummonGoldenSaint"; - names[109] = "sEffectSummonGreaterBonewalker"; - names[112] = "sEffectSummonHunger"; - names[102] = "sEffectSummonScamp"; - names[107] = "sEffectSummonSkeletalMinion"; - names[116] = "sEffectSummonStormAtronach"; - names[111] = "sEffectSummonWingedTwilight"; - names[135] = "sEffectSunDamage"; - names[1] = "sEffectSwiftSwim"; - names[59] = "sEffectTelekinesis"; - names[101] = "sEffectTurnUndead"; - names[133] = "sEffectVampirism"; - names[0] = "sEffectWaterBreathing"; - names[2] = "sEffectWaterWalking"; - names[33] = "sEffectWeaknesstoBlightDisease"; - names[32] = "sEffectWeaknesstoCommonDisease"; - names[34] = "sEffectWeaknesstoCorprusDisease"; - names[28] = "sEffectWeaknesstoFire"; - names[29] = "sEffectWeaknesstoFrost"; - names[31] = "sEffectWeaknesstoMagicka"; - names[36] = "sEffectWeaknesstoNormalWeapons"; - names[35] = "sEffectWeaknesstoPoison"; - names[30] = "sEffectWeaknesstoShock"; + // Map effect ID to GMST name + const std::map MagicEffect::sGmstEffectIds = { + { MagicEffect::AbsorbAttribute, "sEffectAbsorbAttribute" }, + { MagicEffect::AbsorbFatigue, "sEffectAbsorbFatigue" }, + { MagicEffect::AbsorbHealth, "sEffectAbsorbHealth" }, + { MagicEffect::AbsorbMagicka, "sEffectAbsorbSpellPoints" }, + { MagicEffect::AbsorbSkill, "sEffectAbsorbSkill" }, + { MagicEffect::AlmsiviIntervention, "sEffectAlmsiviIntervention" }, + { MagicEffect::Blind, "sEffectBlind" }, + { MagicEffect::BoundBattleAxe, "sEffectBoundBattleAxe" }, + { MagicEffect::BoundBoots, "sEffectBoundBoots" }, + { MagicEffect::BoundCuirass, "sEffectBoundCuirass" }, + { MagicEffect::BoundDagger, "sEffectBoundDagger" }, + { MagicEffect::BoundGloves, "sEffectBoundGloves" }, + { MagicEffect::BoundHelm, "sEffectBoundHelm" }, + { MagicEffect::BoundLongbow, "sEffectBoundLongbow" }, + { MagicEffect::ExtraSpell, "sEffectExtraSpell" }, + { MagicEffect::BoundLongsword, "sEffectBoundLongsword" }, + { MagicEffect::BoundMace, "sEffectBoundMace" }, + { MagicEffect::BoundShield, "sEffectBoundShield" }, + { MagicEffect::BoundSpear, "sEffectBoundSpear" }, + { MagicEffect::Burden, "sEffectBurden" }, + { MagicEffect::CalmCreature, "sEffectCalmCreature" }, + { MagicEffect::CalmHumanoid, "sEffectCalmHumanoid" }, + { MagicEffect::Chameleon, "sEffectChameleon" }, + { MagicEffect::Charm, "sEffectCharm" }, + { MagicEffect::CommandCreature, "sEffectCommandCreatures" }, + { MagicEffect::CommandHumanoid, "sEffectCommandHumanoids" }, + { MagicEffect::Corprus, "sEffectCorpus" }, // NB this typo. (bethesda made it) + { MagicEffect::CureBlightDisease, "sEffectCureBlightDisease" }, + { MagicEffect::CureCommonDisease, "sEffectCureCommonDisease" }, + { MagicEffect::CureCorprusDisease, "sEffectCureCorprusDisease" }, + { MagicEffect::CureParalyzation, "sEffectCureParalyzation" }, + { MagicEffect::CurePoison, "sEffectCurePoison" }, + { MagicEffect::DamageAttribute, "sEffectDamageAttribute" }, + { MagicEffect::DamageFatigue, "sEffectDamageFatigue" }, + { MagicEffect::DamageHealth, "sEffectDamageHealth" }, + { MagicEffect::DamageMagicka, "sEffectDamageMagicka" }, + { MagicEffect::DamageSkill, "sEffectDamageSkill" }, + { MagicEffect::DemoralizeCreature, "sEffectDemoralizeCreature" }, + { MagicEffect::DemoralizeHumanoid, "sEffectDemoralizeHumanoid" }, + { MagicEffect::DetectAnimal, "sEffectDetectAnimal" }, + { MagicEffect::DetectEnchantment, "sEffectDetectEnchantment" }, + { MagicEffect::DetectKey, "sEffectDetectKey" }, + { MagicEffect::DisintegrateArmor, "sEffectDisintegrateArmor" }, + { MagicEffect::DisintegrateWeapon, "sEffectDisintegrateWeapon" }, + { MagicEffect::Dispel, "sEffectDispel" }, + { MagicEffect::DivineIntervention, "sEffectDivineIntervention" }, + { MagicEffect::DrainAttribute, "sEffectDrainAttribute" }, + { MagicEffect::DrainFatigue, "sEffectDrainFatigue" }, + { MagicEffect::DrainHealth, "sEffectDrainHealth" }, + { MagicEffect::DrainMagicka, "sEffectDrainSpellpoints" }, + { MagicEffect::DrainSkill, "sEffectDrainSkill" }, + { MagicEffect::Feather, "sEffectFeather" }, + { MagicEffect::FireDamage, "sEffectFireDamage" }, + { MagicEffect::FireShield, "sEffectFireShield" }, + { MagicEffect::FortifyAttack, "sEffectFortifyAttackBonus" }, + { MagicEffect::FortifyAttribute, "sEffectFortifyAttribute" }, + { MagicEffect::FortifyFatigue, "sEffectFortifyFatigue" }, + { MagicEffect::FortifyHealth, "sEffectFortifyHealth" }, + { MagicEffect::FortifyMagicka, "sEffectFortifySpellpoints" }, + { MagicEffect::FortifyMaximumMagicka, "sEffectFortifyMagickaMultiplier" }, + { MagicEffect::FortifySkill, "sEffectFortifySkill" }, + { MagicEffect::FrenzyCreature, "sEffectFrenzyCreature" }, + { MagicEffect::FrenzyHumanoid, "sEffectFrenzyHumanoid" }, + { MagicEffect::FrostDamage, "sEffectFrostDamage" }, + { MagicEffect::FrostShield, "sEffectFrostShield" }, + { MagicEffect::Invisibility, "sEffectInvisibility" }, + { MagicEffect::Jump, "sEffectJump" }, + { MagicEffect::Levitate, "sEffectLevitate" }, + { MagicEffect::Light, "sEffectLight" }, + { MagicEffect::LightningShield, "sEffectLightningShield" }, + { MagicEffect::Lock, "sEffectLock" }, + { MagicEffect::Mark, "sEffectMark" }, + { MagicEffect::NightEye, "sEffectNightEye" }, + { MagicEffect::Open, "sEffectOpen" }, + { MagicEffect::Paralyze, "sEffectParalyze" }, + { MagicEffect::Poison, "sEffectPoison" }, + { MagicEffect::RallyCreature, "sEffectRallyCreature" }, + { MagicEffect::RallyHumanoid, "sEffectRallyHumanoid" }, + { MagicEffect::Recall, "sEffectRecall" }, + { MagicEffect::Reflect, "sEffectReflect" }, + { MagicEffect::RemoveCurse, "sEffectRemoveCurse" }, + { MagicEffect::ResistBlightDisease, "sEffectResistBlightDisease" }, + { MagicEffect::ResistCommonDisease, "sEffectResistCommonDisease" }, + { MagicEffect::ResistCorprusDisease, "sEffectResistCorprusDisease" }, + { MagicEffect::ResistFire, "sEffectResistFire" }, + { MagicEffect::ResistFrost, "sEffectResistFrost" }, + { MagicEffect::ResistMagicka, "sEffectResistMagicka" }, + { MagicEffect::ResistNormalWeapons, "sEffectResistNormalWeapons" }, + { MagicEffect::ResistParalysis, "sEffectResistParalysis" }, + { MagicEffect::ResistPoison, "sEffectResistPoison" }, + { MagicEffect::ResistShock, "sEffectResistShock" }, + { MagicEffect::RestoreAttribute, "sEffectRestoreAttribute" }, + { MagicEffect::RestoreFatigue, "sEffectRestoreFatigue" }, + { MagicEffect::RestoreHealth, "sEffectRestoreHealth" }, + { MagicEffect::RestoreMagicka, "sEffectRestoreSpellPoints" }, + { MagicEffect::RestoreSkill, "sEffectRestoreSkill" }, + { MagicEffect::Sanctuary, "sEffectSanctuary" }, + { MagicEffect::Shield, "sEffectShield" }, + { MagicEffect::ShockDamage, "sEffectShockDamage" }, + { MagicEffect::Silence, "sEffectSilence" }, + { MagicEffect::SlowFall, "sEffectSlowFall" }, + { MagicEffect::Soultrap, "sEffectSoultrap" }, + { MagicEffect::Sound, "sEffectSound" }, + { MagicEffect::SpellAbsorption, "sEffectSpellAbsorption" }, + { MagicEffect::StuntedMagicka, "sEffectStuntedMagicka" }, + { MagicEffect::SummonAncestralGhost, "sEffectSummonAncestralGhost" }, + { MagicEffect::SummonBonelord, "sEffectSummonBonelord" }, + { MagicEffect::SummonBonewalker, "sEffectSummonLeastBonewalker" }, + { MagicEffect::SummonCenturionSphere, "sEffectSummonCenturionSphere" }, + { MagicEffect::SummonClannfear, "sEffectSummonClannfear" }, + { MagicEffect::SummonDaedroth, "sEffectSummonDaedroth" }, + { MagicEffect::SummonDremora, "sEffectSummonDremora" }, + { MagicEffect::SummonFlameAtronach, "sEffectSummonFlameAtronach" }, + { MagicEffect::SummonFrostAtronach, "sEffectSummonFrostAtronach" }, + { MagicEffect::SummonGoldenSaint, "sEffectSummonGoldenSaint" }, + { MagicEffect::SummonGreaterBonewalker, "sEffectSummonGreaterBonewalker" }, + { MagicEffect::SummonHunger, "sEffectSummonHunger" }, + { MagicEffect::SummonScamp, "sEffectSummonScamp" }, + { MagicEffect::SummonSkeletalMinion, "sEffectSummonSkeletalMinion" }, + { MagicEffect::SummonStormAtronach, "sEffectSummonStormAtronach" }, + { MagicEffect::SummonWingedTwilight, "sEffectSummonWingedTwilight" }, + { MagicEffect::SunDamage, "sEffectSunDamage" }, + { MagicEffect::SwiftSwim, "sEffectSwiftSwim" }, + { MagicEffect::Telekinesis, "sEffectTelekinesis" }, + { MagicEffect::TurnUndead, "sEffectTurnUndead" }, + { MagicEffect::Vampirism, "sEffectVampirism" }, + { MagicEffect::WaterBreathing, "sEffectWaterBreathing" }, + { MagicEffect::WaterWalking, "sEffectWaterWalking" }, + { MagicEffect::WeaknessToBlightDisease, "sEffectWeaknesstoBlightDisease" }, + { MagicEffect::WeaknessToCommonDisease, "sEffectWeaknesstoCommonDisease" }, + { MagicEffect::WeaknessToCorprusDisease, "sEffectWeaknesstoCorprusDisease" }, + { MagicEffect::WeaknessToFire, "sEffectWeaknesstoFire" }, + { MagicEffect::WeaknessToFrost, "sEffectWeaknesstoFrost" }, + { MagicEffect::WeaknessToMagicka, "sEffectWeaknesstoMagicka" }, + { MagicEffect::WeaknessToNormalWeapons, "sEffectWeaknesstoNormalWeapons" }, + { MagicEffect::WeaknessToPoison, "sEffectWeaknesstoPoison" }, + { MagicEffect::WeaknessToShock, "sEffectWeaknesstoShock" }, // bloodmoon - names[138] = "sEffectSummonCreature01"; - names[139] = "sEffectSummonCreature02"; - names[140] = "sEffectSummonCreature03"; - names[141] = "sEffectSummonCreature04"; - names[142] = "sEffectSummonCreature05"; + { MagicEffect::SummonWolf, "sEffectSummonCreature01" }, + { MagicEffect::SummonBear, "sEffectSummonCreature02" }, + { MagicEffect::SummonBonewolf, "sEffectSummonCreature03" }, + { MagicEffect::SummonCreature04, "sEffectSummonCreature04" }, + { MagicEffect::SummonCreature05, "sEffectSummonCreature05" }, // tribunal - names[137] = "sEffectSummonFabricant"; + { MagicEffect::SummonFabricant, "sEffectSummonFabricant" }, + }; - return names; - } - const std::map MagicEffect::sNames = genNameMap(); + // Map effect ID to identifying name + const std::map MagicEffect::sEffectNames = { + { MagicEffect::AbsorbAttribute, "AbsorbAttribute" }, + { MagicEffect::AbsorbFatigue, "AbsorbFatigue" }, + { MagicEffect::AbsorbHealth, "AbsorbHealth" }, + { MagicEffect::AbsorbMagicka, "AbsorbMagicka" }, + { MagicEffect::AbsorbSkill, "AbsorbSkill" }, + { MagicEffect::AlmsiviIntervention, "AlmsiviIntervention" }, + { MagicEffect::Blind, "Blind" }, + { MagicEffect::BoundBattleAxe, "BoundBattleAxe" }, + { MagicEffect::BoundBoots, "BoundBoots" }, + { MagicEffect::BoundCuirass, "BoundCuirass" }, + { MagicEffect::BoundDagger, "BoundDagger" }, + { MagicEffect::BoundGloves, "BoundGloves" }, + { MagicEffect::BoundHelm, "BoundHelm" }, + { MagicEffect::BoundLongbow, "BoundLongbow" }, + { MagicEffect::ExtraSpell, "ExtraSpell" }, + { MagicEffect::BoundLongsword, "BoundLongsword" }, + { MagicEffect::BoundMace, "BoundMace" }, + { MagicEffect::BoundShield, "BoundShield" }, + { MagicEffect::BoundSpear, "BoundSpear" }, + { MagicEffect::Burden, "Burden" }, + { MagicEffect::CalmCreature, "CalmCreature" }, + { MagicEffect::CalmHumanoid, "CalmHumanoid" }, + { MagicEffect::Chameleon, "Chameleon" }, + { MagicEffect::Charm, "Charm" }, + { MagicEffect::CommandCreature, "CommandCreature" }, + { MagicEffect::CommandHumanoid, "CommandHumanoid" }, + { MagicEffect::Corprus, "Corprus" }, // NB this typo. (bethesda made it) + { MagicEffect::CureBlightDisease, "CureBlightDisease" }, + { MagicEffect::CureCommonDisease, "CureCommonDisease" }, + { MagicEffect::CureCorprusDisease, "CureCorprusDisease" }, + { MagicEffect::CureParalyzation, "CureParalyzation" }, + { MagicEffect::CurePoison, "CurePoison" }, + { MagicEffect::DamageAttribute, "DamageAttribute" }, + { MagicEffect::DamageFatigue, "DamageFatigue" }, + { MagicEffect::DamageHealth, "DamageHealth" }, + { MagicEffect::DamageMagicka, "DamageMagicka" }, + { MagicEffect::DamageSkill, "DamageSkill" }, + { MagicEffect::DemoralizeCreature, "DemoralizeCreature" }, + { MagicEffect::DemoralizeHumanoid, "DemoralizeHumanoid" }, + { MagicEffect::DetectAnimal, "DetectAnimal" }, + { MagicEffect::DetectEnchantment, "DetectEnchantment" }, + { MagicEffect::DetectKey, "DetectKey" }, + { MagicEffect::DisintegrateArmor, "DisintegrateArmor" }, + { MagicEffect::DisintegrateWeapon, "DisintegrateWeapon" }, + { MagicEffect::Dispel, "Dispel" }, + { MagicEffect::DivineIntervention, "DivineIntervention" }, + { MagicEffect::DrainAttribute, "DrainAttribute" }, + { MagicEffect::DrainFatigue, "DrainFatigue" }, + { MagicEffect::DrainHealth, "DrainHealth" }, + { MagicEffect::DrainMagicka, "DrainMagicka" }, + { MagicEffect::DrainSkill, "DrainSkill" }, + { MagicEffect::Feather, "Feather" }, + { MagicEffect::FireDamage, "FireDamage" }, + { MagicEffect::FireShield, "FireShield" }, + { MagicEffect::FortifyAttack, "FortifyAttack" }, + { MagicEffect::FortifyAttribute, "FortifyAttribute" }, + { MagicEffect::FortifyFatigue, "FortifyFatigue" }, + { MagicEffect::FortifyHealth, "FortifyHealth" }, + { MagicEffect::FortifyMagicka, "FortifyMagicka" }, + { MagicEffect::FortifyMaximumMagicka, "FortifyMaximumMagicka" }, + { MagicEffect::FortifySkill, "FortifySkill" }, + { MagicEffect::FrenzyCreature, "FrenzyCreature" }, + { MagicEffect::FrenzyHumanoid, "FrenzyHumanoid" }, + { MagicEffect::FrostDamage, "FrostDamage" }, + { MagicEffect::FrostShield, "FrostShield" }, + { MagicEffect::Invisibility, "Invisibility" }, + { MagicEffect::Jump, "Jump" }, + { MagicEffect::Levitate, "Levitate" }, + { MagicEffect::Light, "Light" }, + { MagicEffect::LightningShield, "LightningShield" }, + { MagicEffect::Lock, "Lock" }, + { MagicEffect::Mark, "Mark" }, + { MagicEffect::NightEye, "NightEye" }, + { MagicEffect::Open, "Open" }, + { MagicEffect::Paralyze, "Paralyze" }, + { MagicEffect::Poison, "Poison" }, + { MagicEffect::RallyCreature, "RallyCreature" }, + { MagicEffect::RallyHumanoid, "RallyHumanoid" }, + { MagicEffect::Recall, "Recall" }, + { MagicEffect::Reflect, "Reflect" }, + { MagicEffect::RemoveCurse, "RemoveCurse" }, + { MagicEffect::ResistBlightDisease, "ResistBlightDisease" }, + { MagicEffect::ResistCommonDisease, "ResistCommonDisease" }, + { MagicEffect::ResistCorprusDisease, "ResistCorprusDisease" }, + { MagicEffect::ResistFire, "ResistFire" }, + { MagicEffect::ResistFrost, "ResistFrost" }, + { MagicEffect::ResistMagicka, "ResistMagicka" }, + { MagicEffect::ResistNormalWeapons, "ResistNormalWeapons" }, + { MagicEffect::ResistParalysis, "ResistParalysis" }, + { MagicEffect::ResistPoison, "ResistPoison" }, + { MagicEffect::ResistShock, "ResistShock" }, + { MagicEffect::RestoreAttribute, "RestoreAttribute" }, + { MagicEffect::RestoreFatigue, "RestoreFatigue" }, + { MagicEffect::RestoreHealth, "RestoreHealth" }, + { MagicEffect::RestoreMagicka, "RestoreMagicka" }, + { MagicEffect::RestoreSkill, "RestoreSkill" }, + { MagicEffect::Sanctuary, "Sanctuary" }, + { MagicEffect::Shield, "Shield" }, + { MagicEffect::ShockDamage, "ShockDamage" }, + { MagicEffect::Silence, "Silence" }, + { MagicEffect::SlowFall, "SlowFall" }, + { MagicEffect::Soultrap, "Soultrap" }, + { MagicEffect::Sound, "Sound" }, + { MagicEffect::SpellAbsorption, "SpellAbsorption" }, + { MagicEffect::StuntedMagicka, "StuntedMagicka" }, + { MagicEffect::SummonAncestralGhost, "SummonAncestralGhost" }, + { MagicEffect::SummonBonelord, "SummonBonelord" }, + { MagicEffect::SummonBonewalker, "SummonBonewalker" }, + { MagicEffect::SummonCenturionSphere, "SummonCenturionSphere" }, + { MagicEffect::SummonClannfear, "SummonClannfear" }, + { MagicEffect::SummonDaedroth, "SummonDaedroth" }, + { MagicEffect::SummonDremora, "SummonDremora" }, + { MagicEffect::SummonFlameAtronach, "SummonFlameAtronach" }, + { MagicEffect::SummonFrostAtronach, "SummonFrostAtronach" }, + { MagicEffect::SummonGoldenSaint, "SummonGoldenSaint" }, + { MagicEffect::SummonGreaterBonewalker, "SummonGreaterBonewalker" }, + { MagicEffect::SummonHunger, "SummonHunger" }, + { MagicEffect::SummonScamp, "SummonScamp" }, + { MagicEffect::SummonSkeletalMinion, "SummonSkeletalMinion" }, + { MagicEffect::SummonStormAtronach, "SummonStormAtronach" }, + { MagicEffect::SummonWingedTwilight, "SummonWingedTwilight" }, + { MagicEffect::SunDamage, "SunDamage" }, + { MagicEffect::SwiftSwim, "SwiftSwim" }, + { MagicEffect::Telekinesis, "Telekinesis" }, + { MagicEffect::TurnUndead, "TurnUndead" }, + { MagicEffect::Vampirism, "Vampirism" }, + { MagicEffect::WaterBreathing, "WaterBreathing" }, + { MagicEffect::WaterWalking, "WaterWalking" }, + { MagicEffect::WeaknessToBlightDisease, "WeaknessToBlightDisease" }, + { MagicEffect::WeaknessToCommonDisease, "WeaknessToCommonDisease" }, + { MagicEffect::WeaknessToCorprusDisease, "WeaknessToCorprusDisease" }, + { MagicEffect::WeaknessToFire, "WeaknessToFire" }, + { MagicEffect::WeaknessToFrost, "WeaknessToFrost" }, + { MagicEffect::WeaknessToMagicka, "WeaknessToMagicka" }, + { MagicEffect::WeaknessToNormalWeapons, "WeaknessToNormalWeapons" }, + { MagicEffect::WeaknessToPoison, "WeaknessToPoison" }, + { MagicEffect::WeaknessToShock, "WeaknessToShock" }, - const std::string& MagicEffect::effectIdToString(short effectID) - { - std::map::const_iterator name = sNames.find(effectID); - if (name == sNames.end()) - throw std::runtime_error(std::string("Unimplemented effect ID ") + std::to_string(effectID)); + // bloodmoon + { MagicEffect::SummonWolf, "SummonWolf" }, + { MagicEffect::SummonBear, "SummonBear" }, + { MagicEffect::SummonBonewolf, "SummonBonewolf" }, + { MagicEffect::SummonCreature04, "SummonCreature04" }, + { MagicEffect::SummonCreature05, "SummonCreature05" }, - return name->second; - } + // tribunal + { MagicEffect::SummonFabricant, "SummonFabricant" }, + }; class FindSecond { @@ -535,17 +671,6 @@ namespace ESM } }; - short MagicEffect::effectStringToId(std::string_view effect) - { - std::map::const_iterator name; - - name = std::find_if(sNames.begin(), sNames.end(), FindSecond(effect)); - if (name == sNames.end()) - throw std::runtime_error("Unimplemented effect " + std::string(effect)); - - return name->first; - } - MagicEffect::MagnitudeDisplayType MagicEffect::getMagnitudeDisplayType() const { if (mData.mFlags & NoMagnitude) @@ -587,6 +712,42 @@ namespace ESM mDescription.clear(); } + std::string_view MagicEffect::effectIdToGmstString(int effectID) + { + auto name = sGmstEffectIds.find(effectID); + if (name == sGmstEffectIds.end()) + throw std::runtime_error(std::string("Unimplemented effect ID ") + std::to_string(effectID)); + + return name->second; + } + + std::string_view MagicEffect::effectIdToName(int effectID) + { + auto name = sEffectNames.find(effectID); + if (name == sEffectNames.end()) + throw std::runtime_error(std::string("Unimplemented effect ID ") + std::to_string(effectID)); + + return name->second; + } + + int MagicEffect::effectNameToId(std::string_view effect) + { + auto name = std::find_if(sEffectNames.begin(), sEffectNames.end(), FindSecond(effect)); + if (name == sEffectNames.end()) + throw std::runtime_error("Unimplemented effect " + std::string(effect)); + + return name->first; + } + + int MagicEffect::effectGmstIdToId(std::string_view gmstId) + { + auto name = std::find_if(sGmstEffectIds.begin(), sGmstEffectIds.end(), FindSecond(gmstId)); + if (name == sGmstEffectIds.end()) + throw std::runtime_error("Unimplemented effect " + std::string(gmstId)); + + return name->first; + } + RefId MagicEffect::indexToRefId(int index) { if (index == -1) diff --git a/components/esm3/loadmgef.hpp b/components/esm3/loadmgef.hpp index 9357eb69c2..c26dfde319 100644 --- a/components/esm3/loadmgef.hpp +++ b/components/esm3/loadmgef.hpp @@ -79,11 +79,6 @@ namespace ESM float mUnknown2; // Called "Size Cap" in CS }; // 36 bytes - static const std::map sNames; - - static const std::string& effectIdToString(short effectID); - static short effectStringToId(std::string_view effect); - /// Returns the effect that provides resistance against \a effect (or -1 if there's none) static short getResistanceEffect(short effect); /// Returns the effect that induces weakness against \a effect (or -1 if there's none) @@ -269,6 +264,13 @@ namespace ESM Length }; + static const std::map sGmstEffectIds; + static const std::map sEffectNames; + static std::string_view effectIdToGmstString(int effectID); + static std::string_view effectIdToName(int effectID); + static int effectNameToId(std::string_view effect); + static int effectGmstIdToId(std::string_view gmstId); + static const std::string_view sIndexNames[MagicEffect::Length]; static RefId indexToRefId(int index);