1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-04-01 11:06:41 +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,41 +140,32 @@ 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 (info->mResponse);
parseText(text); win->addText (info->mResponse);
win->addText(iter->mResponse); executeScript (info->mResultScript);
executeScript(iter->mResultScript);
greetingFound = true;
mLastTopic = it->mId; mLastTopic = it->mId;
mLastDialogue = *iter; mLastDialogue = *info;
break; break;
} }
} }
} }
} }
}
bool DialogueManager::compile (const std::string& cmd,std::vector<Interpreter::Type_Code>& code) bool DialogueManager::compile (const std::string& cmd,std::vector<Interpreter::Type_Code>& code)
{ {
@ -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));
{
mActorKnownTopics.push_back(toLower(it->mId));
//does the player know the topic? //does the player know the topic?
if(mKnownTopics.find(toLower(it->mId)) != mKnownTopics.end()) if (mKnownTopics.find (toLower (iter->mId)) != mKnownTopics.end())
{ {
keywordList.push_back(it->mId); keywordList.push_back (iter->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;
}
} }
} }
} }
@ -376,34 +358,27 @@ namespace MWDialogue
{ {
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(); mChoiceMap.clear();
mChoice = -1; mChoice = -1;
mIsInChoice = false; mIsInChoice = false;
MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow(); std::string text = info->mResponse;
std::string text = iter->mResponse;
parseText (text); parseText (text);
win->addText(text); MWBase::Environment::get().getWindowManager()->getDialogueWindow()->addText (text);
executeScript(iter->mResultScript); executeScript (info->mResultScript);
mLastTopic = mLastTopic; mLastTopic = mLastTopic;
mLastDialogue = *iter; mLastDialogue = *info;
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;
}; };
} }