Dialogue: Use std::set for known topics in the manager.

There were three different data structures being used for topic lists
in this code.  (map< string, true >, list< string >, and vector< string >)
Switch the local topic lists to set< string >.  This supports everything
the list and map were doing, reduces the variety of data structures, and
makes count (a more efficient search) available.

The vector has not changed, since it's tied to the ESM modules, and must
meet other requirements.
openmw-35
Jordan Ayers 10 years ago
parent 05be353fec
commit 419046e121

@ -5,6 +5,7 @@
#include <cstdlib>
#include <algorithm>
#include <iterator>
#include <list>
#include <components/esm/loaddial.hpp>
#include <components/esm/loadinfo.hpp>
@ -78,7 +79,7 @@ namespace MWDialogue
void DialogueManager::addTopic (const std::string& topic)
{
mKnownTopics[Misc::StringUtils::lowerCase(topic)] = true;
mKnownTopics.insert( Misc::StringUtils::lowerCase(topic) );
}
void DialogueManager::parseText (const std::string& text)
@ -102,8 +103,8 @@ namespace MWDialogue
if (tok->isImplicitKeyword() && mTranslationDataStorage.hasTranslation())
continue;
if (std::find(mActorKnownTopics.begin(), mActorKnownTopics.end(), topicId) != mActorKnownTopics.end())
mKnownTopics[topicId] = true;
if (mActorKnownTopics.count( topicId ))
mKnownTopics.insert( topicId );
}
updateTopics();
@ -341,10 +342,10 @@ namespace MWDialogue
if (filter.responseAvailable (*iter))
{
std::string lower = Misc::StringUtils::lowerCase(iter->mId);
mActorKnownTopics.push_back (lower);
mActorKnownTopics.insert (lower);
//does the player know the topic?
if (mKnownTopics.find (lower) != mKnownTopics.end())
if (mKnownTopics.count(lower))
{
keywordList.push_back (iter->mId);
}
@ -635,10 +636,11 @@ namespace MWDialogue
{
ESM::DialogueState state;
for (std::map<std::string, bool>::const_iterator iter (mKnownTopics.begin());
for (std::set<std::string>::const_iterator iter (mKnownTopics.begin());
iter!=mKnownTopics.end(); ++iter)
if (iter->second)
state.mKnownTopics.push_back (iter->first);
{
state.mKnownTopics.push_back (*iter);
}
state.mChangedFactionReaction = mChangedFactionReaction;
@ -659,7 +661,7 @@ namespace MWDialogue
for (std::vector<std::string>::const_iterator iter (state.mKnownTopics.begin());
iter!=state.mKnownTopics.end(); ++iter)
if (store.get<ESM::Dialogue>().search (*iter))
mKnownTopics.insert (std::make_pair (*iter, true));
mKnownTopics.insert (*iter);
mChangedFactionReaction = state.mChangedFactionReaction;
}

@ -4,7 +4,7 @@
#include "../mwbase/dialoguemanager.hpp"
#include <map>
#include <list>
#include <set>
#include <components/compiler/streamerrorhandler.hpp>
#include <components/translation/translation.hpp>
@ -23,13 +23,13 @@ namespace MWDialogue
class DialogueManager : public MWBase::DialogueManager
{
std::map<std::string, ESM::Dialogue> mDialogueMap;
std::map<std::string, bool> mKnownTopics;// Those are the topics the player knows.
std::set<std::string> mKnownTopics;// Those are the topics the player knows.
// Modified faction reactions. <Faction1, <Faction2, Difference> >
typedef std::map<std::string, std::map<std::string, int> > ModFactionReactionMap;
ModFactionReactionMap mChangedFactionReaction;
std::list<std::string> mActorKnownTopics;
std::set<std::string> mActorKnownTopics;
Translation::Storage& mTranslationDataStorage;
MWScript::CompilerContext mCompilerContext;

Loading…
Cancel
Save