From 7e8da3dc9cf1425b678bd61d209c11e19fb6773f Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 17 Oct 2022 09:35:43 +0200 Subject: [PATCH 1/3] Don't use potentially invalid cache entry --- apps/openmw/mwdialogue/dialoguemanagerimp.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index a8ea3fdf02..1e4f8b0c5e 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -290,9 +290,7 @@ namespace MWDialogue const ESM::Dialogue& dialogue = *dialogues.find (topic); - const ESM::DialInfo* info = - mChoice == -1 && mActorKnownTopics.count(topic) ? - mActorKnownTopics[topic].mInfo : filter.search(dialogue, true); + const ESM::DialInfo* info = filter.search(dialogue, true); if (info) { From 53c03b65cf94588bb6a809cdd5df77ef1d1c2135 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 17 Oct 2022 09:37:56 +0200 Subject: [PATCH 2/3] Prevent potentially returning garbage flags --- apps/openmw/mwbase/dialoguemanager.hpp | 2 +- apps/openmw/mwdialogue/dialoguemanagerimp.cpp | 7 +++++-- apps/openmw/mwdialogue/dialoguemanagerimp.hpp | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwbase/dialoguemanager.hpp b/apps/openmw/mwbase/dialoguemanager.hpp index 94543ed955..2e58403248 100644 --- a/apps/openmw/mwbase/dialoguemanager.hpp +++ b/apps/openmw/mwbase/dialoguemanager.hpp @@ -90,7 +90,7 @@ namespace MWBase }; virtual std::list getAvailableTopics() = 0; - virtual int getTopicFlag(const std::string&) = 0; + virtual int getTopicFlag(const std::string&) const = 0; virtual bool checkServiceRefused (ResponseCallback* callback, ServiceType service = ServiceType::Any) = 0; diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index 1e4f8b0c5e..d06fbbfd40 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -422,9 +422,12 @@ namespace MWDialogue return keywordList; } - int DialogueManager::getTopicFlag(const std::string& topicId) + int DialogueManager::getTopicFlag(const std::string& topicId) const { - return mActorKnownTopics[topicId].mFlags; + auto known = mActorKnownTopics.find(topicId); + if (known != mActorKnownTopics.end()) + return known->second.mFlags; + return 0; } void DialogueManager::keywordSelected (const std::string& keyword, ResponseCallback* callback) diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp index 5d0c5279d2..e611e52315 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp @@ -83,7 +83,7 @@ namespace MWDialogue bool startDialogue (const MWWorld::Ptr& actor, ResponseCallback* callback) override; std::list getAvailableTopics() override; - int getTopicFlag(const std::string& topicId) override; + int getTopicFlag(const std::string& topicId) const override; bool inJournal (const std::string& topicId, const std::string& infoId) override; From d6fcf544382d665d51036b6d6b9b5463772bed59 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Mon, 17 Oct 2022 09:43:20 +0200 Subject: [PATCH 3/3] Mark constant methods const --- apps/openmw/mwbase/dialoguemanager.hpp | 6 +++--- apps/openmw/mwdialogue/dialoguemanagerimp.cpp | 6 +++--- apps/openmw/mwdialogue/dialoguemanagerimp.hpp | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwbase/dialoguemanager.hpp b/apps/openmw/mwbase/dialoguemanager.hpp index 2e58403248..6228fd238e 100644 --- a/apps/openmw/mwbase/dialoguemanager.hpp +++ b/apps/openmw/mwbase/dialoguemanager.hpp @@ -54,14 +54,14 @@ namespace MWBase virtual bool startDialogue (const MWWorld::Ptr& actor, ResponseCallback* callback) = 0; - virtual bool inJournal (const std::string& topicId, const std::string& infoId) = 0; + virtual bool inJournal (const std::string& topicId, const std::string& infoId) const = 0; virtual void addTopic(std::string_view topic) = 0; virtual void addChoice(std::string_view text,int choice) = 0; - virtual const std::vector >& getChoices() = 0; + virtual const std::vector >& getChoices() const = 0; - virtual bool isGoodbye() = 0; + virtual bool isGoodbye() const = 0; virtual void goodbye() = 0; diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp index d06fbbfd40..6908cc5fd1 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.cpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.cpp @@ -257,7 +257,7 @@ namespace MWDialogue } } - bool DialogueManager::inJournal (const std::string& topicId, const std::string& infoId) + bool DialogueManager::inJournal(const std::string& topicId, const std::string& infoId) const { const MWDialogue::Topic *topicHistory = nullptr; MWBase::Journal *journal = MWBase::Environment::get().getJournal(); @@ -524,12 +524,12 @@ namespace MWDialogue mChoices.emplace_back(text, choice); } - const std::vector >& DialogueManager::getChoices() + const std::vector>& DialogueManager::getChoices() const { return mChoices; } - bool DialogueManager::isGoodbye() + bool DialogueManager::isGoodbye() const { return mGoodbye; } diff --git a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp index e611e52315..df6cc4893f 100644 --- a/apps/openmw/mwdialogue/dialoguemanagerimp.hpp +++ b/apps/openmw/mwdialogue/dialoguemanagerimp.hpp @@ -85,14 +85,14 @@ namespace MWDialogue std::list getAvailableTopics() override; int getTopicFlag(const std::string& topicId) const override; - bool inJournal (const std::string& topicId, const std::string& infoId) override; + bool inJournal (const std::string& topicId, const std::string& infoId) const override; void addTopic(std::string_view topic) override; void addChoice(std::string_view text,int choice) override; - const std::vector >& getChoices() override; + const std::vector >& getChoices() const override; - bool isGoodbye() override; + bool isGoodbye() const override; void goodbye() override;