From f8fcca64b682c321e6144aac2990bd3471ac249b Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 10 Nov 2012 13:31:10 +0100 Subject: [PATCH] Issue #219: Proper implementation of talked to PC filter --- apps/openmw/mwdialogue/dialoguemanagerimp.cpp | 13 +++++++++---- apps/openmw/mwdialogue/dialoguemanagerimp.hpp | 1 + apps/openmw/mwdialogue/filter.cpp | 6 ++++-- apps/openmw/mwdialogue/filter.hpp | 3 ++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index ff5ad40c28..005997a941 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -38,6 +38,7 @@ #include "../mwclass/npc.hpp" #include "../mwmechanics/npcstats.hpp" +#include "../mwmechanics/creaturestats.hpp" #include "filter.hpp" @@ -224,6 +225,10 @@ namespace MWDialogue mIsInChoice = false; mActor = actor; + + MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get (actor).getCreatureStats (actor); + mTalkedTo = creatureStats.hasTalkedToPlayer(); + creatureStats.talkedToPlayer(); mActorKnownTopics.clear(); @@ -240,7 +245,7 @@ namespace MWDialogue const MWWorld::Store &dialogs = MWBase::Environment::get().getWorld()->getStore().get(); - Filter filter (actor, mChoice); + Filter filter (actor, mChoice, mTalkedTo); MWWorld::Store::iterator it = dialogs.begin(); for (; it != dialogs.end(); ++it) @@ -344,7 +349,7 @@ namespace MWDialogue const MWWorld::Store &dialogs = MWBase::Environment::get().getWorld()->getStore().get(); - Filter filter (mActor, mChoice); + Filter filter (mActor, mChoice, mTalkedTo); MWWorld::Store::iterator it = dialogs.begin(); for (; it != dialogs.end(); ++it) @@ -431,7 +436,7 @@ namespace MWDialogue ESM::Dialogue ndialogue = mDialogueMap[keyword]; if(ndialogue.mType == ESM::Dialogue::Topic) { - Filter filter (mActor, mChoice); + Filter filter (mActor, mChoice, mTalkedTo); for (std::vector::const_iterator iter = ndialogue.mInfo.begin(); iter!=ndialogue.mInfo.end(); ++iter) @@ -478,7 +483,7 @@ namespace MWDialogue ESM::Dialogue ndialogue = mDialogueMap[mLastTopic]; if(ndialogue.mType == ESM::Dialogue::Topic) { - Filter filter (mActor, mChoice); + Filter filter (mActor, mChoice, mTalkedTo); for (std::vector::const_iterator iter = ndialogue.mInfo.begin(); iter!=ndialogue.mInfo.end(); ++iter) diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp index e3e9fd7529..d6f8250fc0 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp @@ -40,6 +40,7 @@ namespace MWDialogue bool compile (const std::string& cmd,std::vector& code); void executeScript(std::string script); MWWorld::Ptr mActor; + bool mTalkedTo; void printError(std::string error); diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index 3dac9a07a0..9be8f41506 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -321,7 +321,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co case SelectWrapper::Function_TalkedToPc: - return MWWorld::Class::get (mActor).getCreatureStats (mActor).hasTalkedToPlayer(); + return mTalkedToPlayer; default: @@ -329,7 +329,9 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co } } -MWDialogue::Filter::Filter (const MWWorld::Ptr& actor, int choice) : mActor (actor), mChoice (choice) {} +MWDialogue::Filter::Filter (const MWWorld::Ptr& actor, int choice, bool talkedToPlayer) +: mActor (actor), mChoice (choice), mTalkedToPlayer (talkedToPlayer) +{} bool MWDialogue::Filter::operator() (const ESM::DialInfo& info) const { diff --git a/apps/openmw/mwdialogue/filter.hpp b/apps/openmw/mwdialogue/filter.hpp index a849dc0167..6e0b96a0f1 100644 --- a/apps/openmw/mwdialogue/filter.hpp +++ b/apps/openmw/mwdialogue/filter.hpp @@ -16,6 +16,7 @@ namespace MWDialogue { MWWorld::Ptr mActor; int mChoice; + bool mTalkedToPlayer; bool testActor (const ESM::DialInfo& info) const; ///< Is this the right actor for this \a info? @@ -36,7 +37,7 @@ namespace MWDialogue public: - Filter (const MWWorld::Ptr& actor, int choice); + Filter (const MWWorld::Ptr& actor, int choice, bool talkedToPlayer); bool operator() (const ESM::DialInfo& info) const; ///< \return does the dialogue match?