From 20d40c4368769b06a3fb4f453c6681e2783951c9 Mon Sep 17 00:00:00 2001 From: Emanuel Guevel Date: Mon, 5 Aug 2013 23:23:39 +0200 Subject: [PATCH] Implement MWWorld::World::setWerewolf() --- apps/openmw/mwbase/world.hpp | 3 +++ apps/openmw/mwmechanics/npcstats.cpp | 2 ++ apps/openmw/mwworld/worldimp.cpp | 35 ++++++++++++++++++++++++++++ apps/openmw/mwworld/worldimp.hpp | 2 ++ 4 files changed, 42 insertions(+) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 480bcf9cf..c24215e77 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -384,6 +384,9 @@ namespace MWBase /// Returns true if teleport spell effects are allowed. virtual bool isTeleportingEnabled() const = 0; + + /// Turn actor into werewolf or normal form. + virtual void setWerewolf(const MWWorld::Ptr& actor, bool werewolf) = 0; }; } diff --git a/apps/openmw/mwmechanics/npcstats.cpp b/apps/openmw/mwmechanics/npcstats.cpp index 50c127856..366e6704c 100644 --- a/apps/openmw/mwmechanics/npcstats.cpp +++ b/apps/openmw/mwmechanics/npcstats.cpp @@ -13,7 +13,9 @@ #include #include +#include "../mwworld/class.hpp" #include "../mwworld/esmstore.hpp" +#include "../mwworld/player.hpp" #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index f396157a4..ca38393f0 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -16,6 +16,7 @@ #include "../mwmechanics/creaturestats.hpp" #include "../mwmechanics/movement.hpp" +#include "../mwmechanics/npcstats.hpp" #include "../mwrender/sky.hpp" #include "../mwrender/animation.hpp" @@ -1848,4 +1849,38 @@ namespace MWWorld return mTeleportEnabled; } + void World::setWerewolf(const MWWorld::Ptr& actor, bool werewolf) + { + MWMechanics::NpcStats& npcStats = Class::get(actor).getNpcStats(actor); + + // The actor does not have to change state + if (npcStats.isWerewolf() == werewolf) + return; + + npcStats.setWerewolf(werewolf); + + MWWorld::InventoryStore& invStore = MWWorld::Class::get(actor).getInventoryStore(actor); + if (werewolf) + invStore.unequipAll(); + else + invStore.autoEquip(actor); + + if (actor.getRefData().getHandle() == "player") + { + // Update the GUI only when called on the player + MWBase::WindowManager* windowManager = MWBase::Environment::get().getWindowManager(); + if (werewolf) + { + windowManager->forceHide(MWGui::GW_Inventory); + windowManager->forceHide(MWGui::GW_Magic); + windowManager->unsetSelectedWeapon(); + } + else + { + windowManager->unsetForceHide(MWGui::GW_Inventory); + windowManager->unsetForceHide(MWGui::GW_Magic); + } + } + } + } diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 6d8caad21..1cdf1f5ca 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -428,6 +428,8 @@ namespace MWWorld /// Returns true if teleport spell effects are allowed. virtual bool isTeleportingEnabled() const; + + virtual void setWerewolf(const MWWorld::Ptr& actor, bool werewolf); }; }