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:
parent
79706bf60f
commit
6dc2214502
3 changed files with 60 additions and 71 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue