mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-21 10:53:51 +00:00
Dialogue: return a response from "Info Refusal" when disposition is not satisfied
This commit is contained in:
parent
bbac63bff7
commit
951eb1b236
2 changed files with 51 additions and 23 deletions
|
@ -121,6 +121,13 @@ bool MWDialogue::Filter::testSelectStructs (const ESM::DialInfo& info) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info) const
|
||||||
|
{
|
||||||
|
int actorDisposition = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor);
|
||||||
|
|
||||||
|
return actorDisposition >= info.mData.mDisposition;
|
||||||
|
}
|
||||||
|
|
||||||
bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const
|
bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const
|
||||||
{
|
{
|
||||||
if (select.isNpcOnly() && mActor.getTypeName()!=typeid (ESM::NPC).name())
|
if (select.isNpcOnly() && mActor.getTypeName()!=typeid (ESM::NPC).name())
|
||||||
|
@ -547,17 +554,38 @@ MWDialogue::Filter::Filter (const MWWorld::Ptr& actor, int choice, bool talkedTo
|
||||||
: mActor (actor), mChoice (choice), mTalkedToPlayer (talkedToPlayer)
|
: mActor (actor), mChoice (choice), mTalkedToPlayer (talkedToPlayer)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
bool MWDialogue::Filter::operator() (const ESM::DialInfo& info) const
|
|
||||||
{
|
|
||||||
return testActor (info) && testPlayer (info) && testSelectStructs (info);
|
|
||||||
}
|
|
||||||
|
|
||||||
const ESM::DialInfo *MWDialogue::Filter::search (const ESM::Dialogue& dialogue) const
|
const ESM::DialInfo *MWDialogue::Filter::search (const ESM::Dialogue& dialogue) const
|
||||||
{
|
{
|
||||||
|
bool infoRefusal = false;
|
||||||
|
|
||||||
|
// Iterate over topic responses to find a matching one
|
||||||
for (std::vector<ESM::DialInfo>::const_iterator iter = dialogue.mInfo.begin();
|
for (std::vector<ESM::DialInfo>::const_iterator iter = dialogue.mInfo.begin();
|
||||||
iter!=dialogue.mInfo.end(); ++iter)
|
iter!=dialogue.mInfo.end(); ++iter)
|
||||||
if ((*this) (*iter))
|
{
|
||||||
|
if (testActor (*iter) && testPlayer (*iter) && testSelectStructs (*iter))
|
||||||
|
{
|
||||||
|
if (testDisposition (*iter))
|
||||||
return &*iter;
|
return &*iter;
|
||||||
|
else
|
||||||
|
infoRefusal = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (infoRefusal)
|
||||||
|
{
|
||||||
|
// No response is valid because of low NPC disposition,
|
||||||
|
// search a response in the topic "Info Refusal"
|
||||||
|
|
||||||
|
const MWWorld::Store<ESM::Dialogue> &dialogues =
|
||||||
|
MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>();
|
||||||
|
|
||||||
|
const ESM::Dialogue& infoRefusalDialogue = *dialogues.find ("Info Refusal");
|
||||||
|
|
||||||
|
for (std::vector<ESM::DialInfo>::const_iterator iter = infoRefusalDialogue.mInfo.begin();
|
||||||
|
iter!=infoRefusalDialogue.mInfo.end(); ++iter)
|
||||||
|
if (testActor (*iter) && testPlayer (*iter) && testSelectStructs (*iter) && testDisposition(*iter))
|
||||||
|
return &*iter;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,9 @@ namespace MWDialogue
|
||||||
bool testSelectStructs (const ESM::DialInfo& info) const;
|
bool testSelectStructs (const ESM::DialInfo& info) const;
|
||||||
///< Are all select structs matching?
|
///< Are all select structs matching?
|
||||||
|
|
||||||
|
bool testDisposition (const ESM::DialInfo& info) const;
|
||||||
|
///< Is the actor disposition toward the player high enough?
|
||||||
|
|
||||||
bool testSelectStruct (const SelectWrapper& select) const;
|
bool testSelectStruct (const SelectWrapper& select) const;
|
||||||
|
|
||||||
bool testSelectStructNumeric (const SelectWrapper& select) const;
|
bool testSelectStructNumeric (const SelectWrapper& select) const;
|
||||||
|
@ -48,9 +51,6 @@ namespace MWDialogue
|
||||||
|
|
||||||
Filter (const MWWorld::Ptr& actor, int choice, bool talkedToPlayer);
|
Filter (const MWWorld::Ptr& actor, int choice, bool talkedToPlayer);
|
||||||
|
|
||||||
bool operator() (const ESM::DialInfo& info) const;
|
|
||||||
///< \return does the dialogue match?
|
|
||||||
|
|
||||||
const ESM::DialInfo *search (const ESM::Dialogue& dialogue) const;
|
const ESM::DialInfo *search (const ESM::Dialogue& dialogue) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue