diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index ffaffb6610..4b4ffd0d3c 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -389,6 +389,10 @@ namespace MWBase /// Turn actor into werewolf or normal form. virtual void setWerewolf(const MWWorld::Ptr& actor, bool werewolf) = 0; + + /// Sets the NPC's Acrobatics skill to match the fWerewolfAcrobatics GMST. + /// It only applies to the current form the NPC is in. + virtual void applyWerewolfAcrobatics(const MWWorld::Ptr& actor) = 0; }; } diff --git a/apps/openmw/mwmechanics/npcstats.cpp b/apps/openmw/mwmechanics/npcstats.cpp index 69542b86c2..6a5e5a98f4 100644 --- a/apps/openmw/mwmechanics/npcstats.cpp +++ b/apps/openmw/mwmechanics/npcstats.cpp @@ -393,6 +393,11 @@ void MWMechanics::NpcStats::setWerewolf (bool set) for(size_t i = 0;i < ESM::Skill::Length;i++) { mWerewolfSkill[i] = getSkill(i); + + // Acrobatics is set separately for some reason. + if(i == ESM::Skill::Acrobatics) + continue; + // "Mercantile"! >_< std::string name = "fWerewolf"+((i==ESM::Skill::Mercantile) ? std::string("Merchantile") : ESM::Skill::sSkillNames[i]); diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index 0ae5bc74fc..eca9d279b2 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -1076,8 +1076,8 @@ namespace MWScript virtual void execute (Interpreter::Runtime& runtime) { - // What to do? Stats (attributes, skills) are already set and unset with - // BecomeWerewolf and UndoWerewolf. + MWWorld::Ptr ptr = R()(runtime); + MWBase::Environment::get().getWorld()->applyWerewolfAcrobatics(ptr); } }; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index e0e7e1093a..3b02886108 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1925,4 +1925,12 @@ namespace MWWorld mRendering->rebuildPtr(actor); } + void World::applyWerewolfAcrobatics(const Ptr &actor) + { + const Store &gmst = getStore().get(); + MWMechanics::NpcStats &stats = Class::get(actor).getNpcStats(actor); + + stats.getSkill(ESM::Skill::Acrobatics).setModified(gmst.find("fWerewolfAcrobatics")->getFloat(), 0); + } + } diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 43b57f3796..b2f6418a3e 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -432,6 +432,8 @@ namespace MWWorld virtual bool isTeleportingEnabled() const; virtual void setWerewolf(const MWWorld::Ptr& actor, bool werewolf); + + virtual void applyWerewolfAcrobatics(const MWWorld::Ptr& actor); }; }