1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-30 09:36:43 +00:00

Issue #219: more DialogueManager refactoring

This commit is contained in:
Marc Zinnschlag 2012-11-10 14:52:44 +01:00
parent 79706bf60f
commit 6dc2214502
3 changed files with 60 additions and 71 deletions

View file

@ -140,37 +140,28 @@ namespace MWDialogue
updateTopics(); updateTopics();
//greeting //greeting
bool greetingFound = false;
const MWWorld::Store<ESM::Dialogue> &dialogs = const MWWorld::Store<ESM::Dialogue> &dialogs =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>(); MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>();
Filter filter (actor, mChoice, mTalkedTo); Filter filter (actor, mChoice, mTalkedTo);
MWWorld::Store<ESM::Dialogue>::iterator it = dialogs.begin(); for (MWWorld::Store<ESM::Dialogue>::iterator it = dialogs.begin(); it != dialogs.end(); ++it)
for (; it != dialogs.end(); ++it)
{ {
if(it->mType == ESM::Dialogue::Greeting) if(it->mType == ESM::Dialogue::Greeting)
{ {
if (greetingFound) break; if (const ESM::DialInfo *info = filter.search (*it))
for (std::vector<ESM::DialInfo>::const_iterator iter (it->mInfo.begin());
iter!=it->mInfo.end(); ++iter)
{ {
if (filter (*iter)) if (!info->mSound.empty())
{ {
if (!iter->mSound.empty()) // TODO play sound
{
// TODO play sound
}
std::string text = iter->mResponse;
parseText(text);
win->addText(iter->mResponse);
executeScript(iter->mResultScript);
greetingFound = true;
mLastTopic = it->mId;
mLastDialogue = *iter;
break;
} }
parseText (info->mResponse);
win->addText (info->mResponse);
executeScript (info->mResultScript);
mLastTopic = it->mId;
mLastDialogue = *info;
break;
} }
} }
} }
@ -243,30 +234,24 @@ namespace MWDialogue
int choice = mChoice; int choice = mChoice;
mChoice = -1; mChoice = -1;
mActorKnownTopics.clear(); mActorKnownTopics.clear();
MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow();
const MWWorld::Store<ESM::Dialogue> &dialogs = const MWWorld::Store<ESM::Dialogue> &dialogs =
MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>(); MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>();
Filter filter (mActor, mChoice, mTalkedTo); Filter filter (mActor, mChoice, mTalkedTo);
MWWorld::Store<ESM::Dialogue>::iterator it = dialogs.begin(); for (MWWorld::Store<ESM::Dialogue>::iterator iter = dialogs.begin(); iter != dialogs.end(); ++iter)
for (; it != dialogs.end(); ++it)
{ {
if(it->mType == ESM::Dialogue::Topic) if (iter->mType == ESM::Dialogue::Topic)
{ {
for (std::vector<ESM::DialInfo>::const_iterator iter (it->mInfo.begin()); if (filter.search (*iter))
iter!=it->mInfo.end(); ++iter)
{ {
if (filter (*iter)) mActorKnownTopics.push_back (toLower (iter->mId));
//does the player know the topic?
if (mKnownTopics.find (toLower (iter->mId)) != mKnownTopics.end())
{ {
mActorKnownTopics.push_back(toLower(it->mId)); keywordList.push_back (iter->mId);
//does the player know the topic?
if(mKnownTopics.find(toLower(it->mId)) != mKnownTopics.end())
{
keywordList.push_back(it->mId);
break;
}
} }
} }
} }
@ -317,6 +302,8 @@ namespace MWDialogue
if (services & ESM::NPC::Enchanting) if (services & ESM::NPC::Enchanting)
windowServices |= MWGui::DialogueWindow::Service_Enchant; windowServices |= MWGui::DialogueWindow::Service_Enchant;
MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow();
win->setServices (windowServices); win->setServices (windowServices);
// sort again, because the previous sort was case-sensitive // sort again, because the previous sort was case-sensitive
@ -333,30 +320,25 @@ namespace MWDialogue
if(mDialogueMap.find(keyword) != mDialogueMap.end()) if(mDialogueMap.find(keyword) != mDialogueMap.end())
{ {
ESM::Dialogue ndialogue = mDialogueMap[keyword]; ESM::Dialogue ndialogue = mDialogueMap[keyword];
if(ndialogue.mType == ESM::Dialogue::Topic) if (mDialogueMap[keyword].mType == ESM::Dialogue::Topic)
{ {
Filter filter (mActor, mChoice, mTalkedTo); Filter filter (mActor, mChoice, mTalkedTo);
for (std::vector<ESM::DialInfo>::const_iterator iter = ndialogue.mInfo.begin(); if (const ESM::DialInfo *info = filter.search (mDialogueMap[keyword]))
iter!=ndialogue.mInfo.end(); ++iter)
{ {
if (filter (*iter)) std::string text = info->mResponse;
{ std::string script = info->mResultScript;
std::string text = iter->mResponse;
std::string script = iter->mResultScript;
parseText(text); parseText (text);
MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow(); MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow();
win->addTitle(keyword); win->addTitle (keyword);
win->addText(iter->mResponse); win->addText (info->mResponse);
executeScript(script); executeScript (script);
mLastTopic = keyword; mLastTopic = keyword;
mLastDialogue = *iter; mLastDialogue = *info;
break;
}
} }
} }
} }
@ -372,38 +354,31 @@ namespace MWDialogue
void DialogueManager::questionAnswered (const std::string& answer) void DialogueManager::questionAnswered (const std::string& answer)
{ {
if(mChoiceMap.find(answer) != mChoiceMap.end()) if (mChoiceMap.find(answer) != mChoiceMap.end())
{ {
mChoice = mChoiceMap[answer]; mChoice = mChoiceMap[answer];
std::vector<ESM::DialInfo>::const_iterator iter; if (mDialogueMap.find(mLastTopic) != mDialogueMap.end())
if(mDialogueMap.find(mLastTopic) != mDialogueMap.end())
{ {
ESM::Dialogue ndialogue = mDialogueMap[mLastTopic]; if (mDialogueMap[mLastTopic].mType == ESM::Dialogue::Topic)
if(ndialogue.mType == ESM::Dialogue::Topic)
{ {
Filter filter (mActor, mChoice, mTalkedTo); Filter filter (mActor, mChoice, mTalkedTo);
for (std::vector<ESM::DialInfo>::const_iterator iter = ndialogue.mInfo.begin(); if (const ESM::DialInfo *info = filter.search (mDialogueMap[mLastTopic]))
iter!=ndialogue.mInfo.end(); ++iter)
{ {
if (filter (*iter)) mChoiceMap.clear();
{ mChoice = -1;
mChoiceMap.clear(); mIsInChoice = false;
mChoice = -1; std::string text = info->mResponse;
mIsInChoice = false; parseText (text);
MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow(); MWBase::Environment::get().getWindowManager()->getDialogueWindow()->addText (text);
std::string text = iter->mResponse; executeScript (info->mResultScript);
parseText(text); mLastTopic = mLastTopic;
win->addText(text); mLastDialogue = *info;
executeScript(iter->mResultScript);
mLastTopic = mLastTopic;
mLastDialogue = *iter;
break;
}
} }
} }
} }
updateTopics(); updateTopics();
} }
} }

View file

@ -390,3 +390,14 @@ bool MWDialogue::Filter::operator() (const ESM::DialInfo& info) const
{ {
return testActor (info) && testPlayer (info) && testSelectStructs (info); return testActor (info) && testPlayer (info) && testSelectStructs (info);
} }
const ESM::DialInfo *MWDialogue::Filter::search (const ESM::Dialogue& dialogue) const
{
for (std::vector<ESM::DialInfo>::const_iterator iter = dialogue.mInfo.begin();
iter!=dialogue.mInfo.end(); ++iter)
if ((*this) (*iter))
return &*iter;
return 0;
}

View file

@ -6,6 +6,7 @@
namespace ESM namespace ESM
{ {
struct DialInfo; struct DialInfo;
struct Dialogue;
} }
namespace MWDialogue namespace MWDialogue
@ -41,6 +42,8 @@ namespace MWDialogue
bool operator() (const ESM::DialInfo& info) const; bool operator() (const ESM::DialInfo& info) const;
///< \return does the dialogue match? ///< \return does the dialogue match?
const ESM::DialInfo *search (const ESM::Dialogue& dialogue) const;
}; };
} }