diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index b409b4c84..697b75579 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -60,15 +60,7 @@ namespace MWClass boost::shared_ptr Apparatus::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action( - new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Apparatus::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index 27b3870cb..a511207c4 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -65,14 +65,7 @@ namespace MWClass boost::shared_ptr Armor::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } bool Armor::hasItemHealth (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index 05d0ac69f..e85e742c8 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -9,6 +9,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actionread.hpp" +#include "../mwworld/failedaction.hpp" #include "../mwworld/cellstore.hpp" #include "../mwworld/physicssystem.hpp" @@ -17,6 +18,8 @@ #include "../mwgui/tooltips.hpp" +#include "../mwmechanics/npcstats.hpp" + namespace MWClass { void Book::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const @@ -58,8 +61,15 @@ namespace MWClass boost::shared_ptr Book::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - return boost::shared_ptr ( - new MWWorld::ActionRead (ptr)); + if(get(actor).isNpc() && get(actor).getNpcStats(actor).isWerewolf()) + { + boost::shared_ptr action(new MWWorld::FailedAction("#{sWerewolfRefusal}")); + // FIXME: Randomize using all WolfItem* sound records + action->setSound("WolfItem1"); + return action; + } + + return boost::shared_ptr(new MWWorld::ActionRead(ptr)); } std::string Book::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index 2485728b1..2dbb7ee6f 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -60,16 +60,9 @@ namespace MWClass } boost::shared_ptr Clothing::activate (const MWWorld::Ptr& ptr, - const MWWorld::Ptr& actor) const + const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Clothing::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 6aad8422e..32f061202 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -23,6 +23,8 @@ #include "../mwrender/objects.hpp" #include "../mwrender/renderinginterface.hpp" +#include "../mwmechanics/npcstats.hpp" + namespace { struct CustomData : public MWWorld::CustomData @@ -91,6 +93,14 @@ namespace MWClass if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) return boost::shared_ptr (new MWWorld::NullAction ()); + if(get(actor).isNpc() && get(actor).getNpcStats(actor).isWerewolf()) + { + boost::shared_ptr action(new MWWorld::FailedAction("#{sWerewolfRefusal}")); + // FIXME: Randomize using all WolfContainer* sound records + action->setSound("WolfContainer1"); + return action; + } + const std::string lockedSound = "LockedChest"; const std::string trapActivationSound = "Disarm Trap Fail"; diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 281d7fa98..9d7aacd23 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -16,6 +16,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontalk.hpp" #include "../mwworld/actionopen.hpp" +#include "../mwworld/failedaction.hpp" #include "../mwworld/customdata.hpp" #include "../mwworld/containerstore.hpp" #include "../mwworld/physicssystem.hpp" @@ -25,6 +26,8 @@ #include "../mwgui/tooltips.hpp" +#include "../mwmechanics/npcstats.hpp" + namespace { struct CustomData : public MWWorld::CustomData @@ -222,10 +225,17 @@ namespace MWClass boost::shared_ptr Creature::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (MWWorld::Class::get (ptr).getCreatureStats (ptr).isDead()) - return boost::shared_ptr (new MWWorld::ActionOpen(ptr, true)); - else - return boost::shared_ptr (new MWWorld::ActionTalk (ptr)); + if(get(actor).isNpc() && get(actor).getNpcStats(actor).isWerewolf()) + { + boost::shared_ptr action(new MWWorld::FailedAction("#{sWerewolfRefusal}")); + // FIXME: Randomize using all WolfCreature* sound records + action->setSound("WolfCreature1"); + return action; + } + + if(getCreatureStats(ptr).isDead()) + return boost::shared_ptr(new MWWorld::ActionOpen(ptr, true)); + return boost::shared_ptr(new MWWorld::ActionTalk(ptr)); } MWWorld::ContainerStore& Creature::getContainerStore (const MWWorld::Ptr& ptr) diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index a53fc5a28..f629cc15d 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -71,14 +71,7 @@ namespace MWClass boost::shared_ptr Ingredient::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Ingredient::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index cdd41751f..7eefc6167 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -76,20 +76,14 @@ namespace MWClass boost::shared_ptr Light::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); + if(!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) + return boost::shared_ptr(new MWWorld::NullAction()); - MWWorld::LiveCellRef *ref = - ptr.get(); + MWWorld::LiveCellRef *ref = ptr.get(); + if(!(ref->mBase->mData.mFlags&ESM::Light::Carry)) + return boost::shared_ptr(new MWWorld::FailedAction()); - if (!(ref->mBase->mData.mFlags & ESM::Light::Carry)) - return boost::shared_ptr (new MWWorld::FailedAction); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Light::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 65af5b52b..5931a0102 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -61,14 +61,7 @@ namespace MWClass boost::shared_ptr Lockpick::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Lockpick::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index 9345ed9ae..6247191a9 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -77,14 +77,7 @@ namespace MWClass boost::shared_ptr Miscellaneous::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Miscellaneous::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 4771e9e39..d7516cb1b 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -23,6 +23,7 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontalk.hpp" #include "../mwworld/actionopen.hpp" +#include "../mwworld/failedaction.hpp" #include "../mwworld/inventorystore.hpp" #include "../mwworld/customdata.hpp" #include "../mwworld/physicssystem.hpp" @@ -562,12 +563,18 @@ namespace MWClass boost::shared_ptr Npc::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (MWWorld::Class::get (ptr).getCreatureStats (ptr).isDead()) - return boost::shared_ptr (new MWWorld::ActionOpen(ptr, true)); - else if (MWWorld::Class::get(actor).getStance(actor, MWWorld::Class::Sneak)) - return boost::shared_ptr (new MWWorld::ActionOpen(ptr)); // stealing - else - return boost::shared_ptr (new MWWorld::ActionTalk (ptr)); + if(get(actor).isNpc() && get(actor).getNpcStats(actor).isWerewolf()) + { + boost::shared_ptr action(new MWWorld::FailedAction("#{sWerewolfRefusal}")); + // FIXME: Randomize using all WolfNPC* sound records + action->setSound("WolfNPC1"); + return action; + } + if(getCreatureStats(ptr).isDead()) + return boost::shared_ptr(new MWWorld::ActionOpen(ptr, true)); + if(get(actor).getStance(actor, MWWorld::Class::Sneak)) + return boost::shared_ptr(new MWWorld::ActionOpen(ptr)); // stealing + return boost::shared_ptr(new MWWorld::ActionTalk(ptr)); } MWWorld::ContainerStore& Npc::getContainerStore (const MWWorld::Ptr& ptr) diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index 3d429c982..3591d7c68 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -144,8 +144,11 @@ namespace MWClass virtual std::string getModel(const MWWorld::Ptr &ptr) const; - virtual bool - isActor() const { + virtual bool isActor() const { + return true; + } + + virtual bool isNpc() const { return true; } }; diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index 51fcd1c13..08683a668 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -63,15 +63,7 @@ namespace MWClass boost::shared_ptr Potion::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action( - new MWWorld::ActionTake (ptr)); - - action->setSound (getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Potion::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index c140d9471..951265f40 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -60,14 +60,7 @@ namespace MWClass boost::shared_ptr Probe::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Probe::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index b5af02eff..38c15ac92 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -60,14 +60,7 @@ namespace MWClass boost::shared_ptr Repair::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } std::string Repair::getScript (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index dce1f288a..4cb090328 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -68,14 +68,7 @@ namespace MWClass boost::shared_ptr Weapon::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor) const { - if (!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) - return boost::shared_ptr (new MWWorld::NullAction ()); - - boost::shared_ptr action(new MWWorld::ActionTake (ptr)); - - action->setSound(getUpSoundId(ptr)); - - return action; + return defaultItemActivate(ptr, actor); } bool Weapon::hasItemHealth (const MWWorld::Ptr& ptr) const diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index 296008578..c6575f858 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -7,13 +7,20 @@ #include +#include "../mwbase/environment.hpp" +#include "../mwbase/windowmanager.hpp" + #include "ptr.hpp" #include "refdata.hpp" #include "nullaction.hpp" +#include "failedaction.hpp" +#include "actiontake.hpp" #include "containerstore.hpp" #include "../mwgui/tooltips.hpp" + #include "../mwmechanics/creaturestats.hpp" +#include "../mwmechanics/npcstats.hpp" #include "../mwmechanics/magiceffects.hpp" namespace MWWorld @@ -304,6 +311,25 @@ namespace MWWorld { } + boost::shared_ptr Class::defaultItemActivate(const Ptr &ptr, const Ptr &actor) const + { + if(!MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory)) + return boost::shared_ptr(new NullAction()); + + if(get(actor).isNpc() && get(actor).getNpcStats(actor).isWerewolf()) + { + boost::shared_ptr action(new MWWorld::FailedAction("#{sWerewolfRefusal}")); + // FIXME: Randomize using all WolfItem* sound records + action->setSound("WolfItem1"); + return action; + } + + boost::shared_ptr action(new ActionTake(ptr)); + action->setSound(getUpSoundId(ptr)); + + return action; + } + MWWorld::Ptr Class::copyToCellImpl(const Ptr &ptr, CellStore &cell) const { diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 2751a4130..ebe7375a1 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -57,6 +57,9 @@ namespace MWWorld Class(); + boost::shared_ptr defaultItemActivate(const Ptr &ptr, const Ptr &actor) const; + ///< Generate default action for activating inventory items + virtual Ptr copyToCellImpl(const Ptr &ptr, CellStore &cell) const; public: @@ -285,9 +288,12 @@ namespace MWWorld virtual Ptr copyToCell(const Ptr &ptr, CellStore &cell, const ESM::Position &pos) const; - - virtual bool - isActor() const { + + virtual bool isActor() const { + return false; + } + + virtual bool isNpc() const { return false; } }; diff --git a/apps/openmw/mwworld/failedaction.cpp b/apps/openmw/mwworld/failedaction.cpp index 1db00ad06..7c8ef8c7b 100644 --- a/apps/openmw/mwworld/failedaction.cpp +++ b/apps/openmw/mwworld/failedaction.cpp @@ -7,15 +7,13 @@ namespace MWWorld { - FailedAction::FailedAction (const std::string& msg) : Action (false), message(msg) + FailedAction::FailedAction(const std::string &msg) + : Action(false), mMessage(msg) { } - - void FailedAction::executeImp (const Ptr& actor) + void FailedAction::executeImp(const Ptr &actor) { - if ( actor.getRefData().getHandle()=="player" && !(message.empty())) - { - MWBase::Environment::get().getWindowManager() ->messageBox(message); - } + if(actor.getRefData().getHandle() == "player" && !mMessage.empty()) + MWBase::Environment::get().getWindowManager()->messageBox(mMessage); } } diff --git a/apps/openmw/mwworld/failedaction.hpp b/apps/openmw/mwworld/failedaction.hpp index e736bfb63..c69d62023 100644 --- a/apps/openmw/mwworld/failedaction.hpp +++ b/apps/openmw/mwworld/failedaction.hpp @@ -8,12 +8,12 @@ namespace MWWorld { class FailedAction : public Action { - std::string message; - - virtual void executeImp (const Ptr& actor); + std::string mMessage; - public: - FailedAction (const std::string& message = std::string()); + virtual void executeImp(const Ptr &actor); + + public: + FailedAction(const std::string &message = std::string()); }; }