diff --git a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp index 3268c01ecc..1a9262b8da 100644 --- a/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp +++ b/apps/openmw/mwmechanics/mechanicsmanagerimp.cpp @@ -1924,11 +1924,11 @@ namespace MWMechanics void MechanicsManager::applyWerewolfAcrobatics(const MWWorld::Ptr& actor) { - const MWWorld::Store& gmst - = MWBase::Environment::get().getESMStore()->get(); + const ESM::Skill* acrobatics + = MWBase::Environment::get().getESMStore()->get().find(ESM::Skill::Acrobatics); MWMechanics::NpcStats& stats = actor.getClass().getNpcStats(actor); - auto& skill = stats.getSkill(ESM::Skill::Acrobatics); - skill.setModifier(gmst.find("fWerewolfAcrobatics")->mValue.getFloat() - skill.getModified()); + auto& skill = stats.getSkill(acrobatics->mIndex); + skill.setModifier(acrobatics->mWerewolfValue - skill.getModified()); } void MechanicsManager::cleanupSummonedCreature(const MWWorld::Ptr& caster, int creatureActorId) diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp index 3a388883fd..72933d0970 100644 --- a/apps/openmw/mwworld/player.cpp +++ b/apps/openmw/mwworld/player.cpp @@ -103,18 +103,14 @@ namespace MWWorld npcStats.setAttribute(attribute.mId, value); } - for (size_t i = 0; i < ESM::Skill::Length; i++) + for (const auto& [_, skill] : store->get()) { // Acrobatics is set separately for some reason. - if (i == ESM::Skill::Acrobatics) + if (skill.mIndex == ESM::Skill::Acrobatics) continue; - // "Mercantile"! >_< - std::string name = "fWerewolf" - + ((i == ESM::Skill::Mercantile) ? std::string("Merchantile") : ESM::Skill::sSkillNames[i]); - - MWMechanics::SkillValue& value = npcStats.getSkill(i); - value.setModifier(gmst.find(name)->mValue.getFloat() - value.getModified()); + MWMechanics::SkillValue& value = npcStats.getSkill(skill.mIndex); + value.setModifier(skill.mWerewolfValue - value.getModified()); } } diff --git a/apps/openmw/mwworld/store.cpp b/apps/openmw/mwworld/store.cpp index ee0d71f5ab..080a9eb3e8 100644 --- a/apps/openmw/mwworld/store.cpp +++ b/apps/openmw/mwworld/store.cpp @@ -919,34 +919,35 @@ namespace MWWorld void Store::setUp(const MWWorld::Store& settings) { - constexpr std::string_view skillNameIdsAndIcons[ESM::Skill::Length][2] = { - { "sSkillBlock", "icons\\k\\combat_block.dds" }, - { "sSkillArmorer", "icons\\k\\combat_armor.dds" }, - { "sSkillMediumarmor", "icons\\k\\combat_mediumarmor.dds" }, - { "sSkillHeavyarmor", "icons\\k\\combat_heavyarmor.dds" }, - { "sSkillBluntweapon", "icons\\k\\combat_blunt.dds" }, - { "sSkillLongblade", "icons\\k\\combat_longblade.dds" }, - { "sSkillAxe", "icons\\k\\combat_axe.dds" }, - { "sSkillSpear", "icons\\k\\combat_spear.dds" }, - { "sSkillAthletics", "icons\\k\\combat_athletics.dds" }, - { "sSkillEnchant", "icons\\k\\magic_enchant.dds" }, - { "sSkillDestruction", "icons\\k\\magic_destruction.dds" }, - { "sSkillAlteration", "icons\\k\\magic_alteration.dds" }, - { "sSkillIllusion", "icons\\k\\magic_illusion.dds" }, - { "sSkillConjuration", "icons\\k\\magic_conjuration.dds" }, - { "sSkillMysticism", "icons\\k\\magic_mysticism.dds" }, - { "sSkillRestoration", "icons\\k\\magic_restoration.dds" }, - { "sSkillAlchemy", "icons\\k\\magic_alchemy.dds" }, - { "sSkillUnarmored", "icons\\k\\magic_unarmored.dds" }, - { "sSkillSecurity", "icons\\k\\stealth_security.dds" }, - { "sSkillSneak", "icons\\k\\stealth_sneak.dds" }, - { "sSkillAcrobatics", "icons\\k\\stealth_acrobatics.dds" }, - { "sSkillLightarmor", "icons\\k\\stealth_lightarmor.dds" }, - { "sSkillShortblade", "icons\\k\\stealth_shortblade.dds" }, - { "sSkillMarksman", "icons\\k\\stealth_marksman.dds" }, - { "sSkillMercantile", "icons\\k\\stealth_mercantile.dds" }, - { "sSkillSpeechcraft", "icons\\k\\stealth_speechcraft.dds" }, - { "sSkillHandtohand", "icons\\k\\stealth_handtohand.dds" }, + constexpr std::string_view skillValues[ESM::Skill::Length][3] = { + { "sSkillBlock", "icons\\k\\combat_block.dds", "fWerewolfBlock" }, + { "sSkillArmorer", "icons\\k\\combat_armor.dds", "fWerewolfArmorer" }, + { "sSkillMediumarmor", "icons\\k\\combat_mediumarmor.dds", "fWerewolfMediumarmor" }, + { "sSkillHeavyarmor", "icons\\k\\combat_heavyarmor.dds", "fWerewolfHeavyarmor" }, + { "sSkillBluntweapon", "icons\\k\\combat_blunt.dds", "fWerewolfBluntweapon" }, + { "sSkillLongblade", "icons\\k\\combat_longblade.dds", "fWerewolfLongblade" }, + { "sSkillAxe", "icons\\k\\combat_axe.dds", "fWerewolfAxe" }, + { "sSkillSpear", "icons\\k\\combat_spear.dds", "fWerewolfSpear" }, + { "sSkillAthletics", "icons\\k\\combat_athletics.dds", "fWerewolfAthletics" }, + { "sSkillEnchant", "icons\\k\\magic_enchant.dds", "fWerewolfEnchant" }, + { "sSkillDestruction", "icons\\k\\magic_destruction.dds", "fWerewolfDestruction" }, + { "sSkillAlteration", "icons\\k\\magic_alteration.dds", "fWerewolfAlteration" }, + { "sSkillIllusion", "icons\\k\\magic_illusion.dds", "fWerewolfIllusion" }, + { "sSkillConjuration", "icons\\k\\magic_conjuration.dds", "fWerewolfConjuration" }, + { "sSkillMysticism", "icons\\k\\magic_mysticism.dds", "fWerewolfMysticism" }, + { "sSkillRestoration", "icons\\k\\magic_restoration.dds", "fWerewolfRestoration" }, + { "sSkillAlchemy", "icons\\k\\magic_alchemy.dds", "fWerewolfAlchemy" }, + { "sSkillUnarmored", "icons\\k\\magic_unarmored.dds", "fWerewolfUnarmored" }, + { "sSkillSecurity", "icons\\k\\stealth_security.dds", "fWerewolfSecurity" }, + { "sSkillSneak", "icons\\k\\stealth_sneak.dds", "fWerewolfSneak" }, + { "sSkillAcrobatics", "icons\\k\\stealth_acrobatics.dds", "fWerewolfAcrobatics" }, + { "sSkillLightarmor", "icons\\k\\stealth_lightarmor.dds", "fWerewolfLightarmor" }, + { "sSkillShortblade", "icons\\k\\stealth_shortblade.dds", "fWerewolfShortblade" }, + { "sSkillMarksman", "icons\\k\\stealth_marksman.dds", "fWerewolfMarksman" }, + // "Mercantile"! >_< + { "sSkillMercantile", "icons\\k\\stealth_mercantile.dds", "fWerewolfMerchantile" }, + { "sSkillSpeechcraft", "icons\\k\\stealth_speechcraft.dds", "fWerewolfSpeechcraft" }, + { "sSkillHandtohand", "icons\\k\\stealth_handtohand.dds", "fWerewolfHandtohand" }, }; for (int i = 0; i < ESM::Skill::Length; ++i) { @@ -954,8 +955,9 @@ namespace MWWorld if (found != mStatic.end()) { ESM::Skill& skill = found->second; - skill.mName = getGMSTString(settings, skillNameIdsAndIcons[i][0]); - skill.mIcon = skillNameIdsAndIcons[i][1]; + skill.mName = getGMSTString(settings, skillValues[i][0]); + skill.mIcon = skillValues[i][1]; + skill.mWerewolfValue = getGMSTFloat(settings, skillValues[i][2]); } } } @@ -1010,6 +1012,8 @@ namespace MWWorld } void Store::setUp(const MWWorld::Store& settings) { + // TODO remove after !3084 gets merged + mStatic.clear(); mStatic.push_back({ .mId = ESM::Attribute::Strength, .mName = std::string{ getGMSTString(settings, "sAttributeStrength") }, .mDescription = std::string{ getGMSTString(settings, "sStrDesc") }, diff --git a/components/esm3/loadskil.hpp b/components/esm3/loadskil.hpp index 827bfb2b2f..a0dc56f1d4 100644 --- a/components/esm3/loadskil.hpp +++ b/components/esm3/loadskil.hpp @@ -46,6 +46,7 @@ namespace ESM std::string mDescription; std::string mName; std::string mIcon; + float mWerewolfValue{}; enum SkillEnum {