mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-01 14:45:33 +00:00
Implemented service refusal
This commit is contained in:
parent
485b6c855a
commit
cebcbe11f8
6 changed files with 76 additions and 38 deletions
|
@ -41,6 +41,8 @@ namespace MWBase
|
|||
virtual void goodbyeSelected() = 0;
|
||||
virtual void questionAnswered (const std::string& answer) = 0;
|
||||
|
||||
virtual bool checkServiceRefused () = 0;
|
||||
|
||||
virtual void persuade (int type) = 0;
|
||||
virtual int getTemporaryDispositionChange () const = 0;
|
||||
virtual void applyTemporaryDispositionChange (int delta) = 0;
|
||||
|
|
|
@ -518,6 +518,37 @@ namespace MWDialogue
|
|||
mTemporaryDispositionChange += delta;
|
||||
}
|
||||
|
||||
bool DialogueManager::checkServiceRefused()
|
||||
{
|
||||
Filter filter (mActor, mChoice, mTalkedTo);
|
||||
|
||||
const MWWorld::Store<ESM::Dialogue> &dialogues =
|
||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::Dialogue>();
|
||||
|
||||
const ESM::Dialogue& dialogue = *dialogues.find ("Service Refusal");
|
||||
MWGui::DialogueWindow* win = MWBase::Environment::get().getWindowManager()->getDialogueWindow();
|
||||
|
||||
std::vector<const ESM::DialInfo *> infos = filter.list (dialogue, false, false, true);
|
||||
if (!infos.empty())
|
||||
{
|
||||
const ESM::DialInfo* info = infos[0];
|
||||
|
||||
parseText (info->mResponse);
|
||||
|
||||
const MWWorld::Store<ESM::GameSetting>& gmsts =
|
||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
||||
|
||||
win->addTitle (gmsts.find ("sServiceRefusal")->getString());
|
||||
|
||||
MWScript::InterpreterContext interpreterContext(&mActor.getRefData().getLocals(),mActor);
|
||||
win->addText (Interpreter::fixDefinesDialog(info->mResponse, interpreterContext));
|
||||
|
||||
executeScript (info->mResultScript);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<HyperTextToken> ParseHyperText(const std::string& text)
|
||||
{
|
||||
std::vector<HyperTextToken> result;
|
||||
|
|
|
@ -65,6 +65,8 @@ namespace MWDialogue
|
|||
virtual MWWorld::Ptr getActor() const;
|
||||
///< Return the actor the player is currently talking to.
|
||||
|
||||
virtual bool checkServiceRefused ();
|
||||
|
||||
//calbacks for the GUI
|
||||
virtual void keywordSelected (const std::string& keyword);
|
||||
virtual void goodbyeSelected();
|
||||
|
|
|
@ -121,7 +121,7 @@ bool MWDialogue::Filter::testSelectStructs (const ESM::DialInfo& info) const
|
|||
return true;
|
||||
}
|
||||
|
||||
bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info) const
|
||||
bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info, bool invert) const
|
||||
{
|
||||
bool isCreature = (mActor.getTypeName() != typeid (ESM::NPC).name());
|
||||
|
||||
|
@ -129,8 +129,9 @@ bool MWDialogue::Filter::testDisposition (const ESM::DialInfo& info) const
|
|||
return true;
|
||||
|
||||
int actorDisposition = MWBase::Environment::get().getMechanicsManager()->getDerivedDisposition(mActor);
|
||||
|
||||
return actorDisposition >= info.mData.mDisposition;
|
||||
// For service refusal, the disposition check is inverted. However, a value of 0 still means "always succeed".
|
||||
return invert ? (info.mData.mDisposition == 0 || actorDisposition < info.mData.mDisposition)
|
||||
: (actorDisposition >= info.mData.mDisposition);
|
||||
}
|
||||
|
||||
bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const
|
||||
|
@ -570,7 +571,7 @@ const ESM::DialInfo* MWDialogue::Filter::search (const ESM::Dialogue& dialogue,
|
|||
}
|
||||
|
||||
std::vector<const ESM::DialInfo *> MWDialogue::Filter::list (const ESM::Dialogue& dialogue,
|
||||
bool fallbackToInfoRefusal, bool searchAll) const
|
||||
bool fallbackToInfoRefusal, bool searchAll, bool invertDisposition) const
|
||||
{
|
||||
std::vector<const ESM::DialInfo *> infos;
|
||||
|
||||
|
@ -582,7 +583,7 @@ std::vector<const ESM::DialInfo *> MWDialogue::Filter::list (const ESM::Dialogue
|
|||
{
|
||||
if (testActor (*iter) && testPlayer (*iter) && testSelectStructs (*iter))
|
||||
{
|
||||
if (testDisposition (*iter)) {
|
||||
if (testDisposition (*iter, invertDisposition)) {
|
||||
infos.push_back(&*iter);
|
||||
if (!searchAll)
|
||||
break;
|
||||
|
@ -604,7 +605,7 @@ std::vector<const ESM::DialInfo *> MWDialogue::Filter::list (const ESM::Dialogue
|
|||
|
||||
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)) {
|
||||
if (testActor (*iter) && testPlayer (*iter) && testSelectStructs (*iter) && testDisposition(*iter, invertDisposition)) {
|
||||
infos.push_back(&*iter);
|
||||
if (!searchAll)
|
||||
break;
|
||||
|
|
|
@ -30,8 +30,8 @@ namespace MWDialogue
|
|||
bool testSelectStructs (const ESM::DialInfo& info) const;
|
||||
///< Are all select structs matching?
|
||||
|
||||
bool testDisposition (const ESM::DialInfo& info) const;
|
||||
///< Is the actor disposition toward the player high enough?
|
||||
bool testDisposition (const ESM::DialInfo& info, bool invert=false) const;
|
||||
///< Is the actor disposition toward the player high enough (or low enough, if \a invert is true)?
|
||||
|
||||
bool testSelectStruct (const SelectWrapper& select) const;
|
||||
|
||||
|
@ -54,7 +54,7 @@ namespace MWDialogue
|
|||
Filter (const MWWorld::Ptr& actor, int choice, bool talkedToPlayer);
|
||||
|
||||
std::vector<const ESM::DialInfo *> list (const ESM::Dialogue& dialogue,
|
||||
bool fallbackToInfoRefusal, bool searchAll) const;
|
||||
bool fallbackToInfoRefusal, bool searchAll, bool invertDisposition=false) const;
|
||||
|
||||
const ESM::DialInfo* search (const ESM::Dialogue& dialogue, const bool fallbackToInfoRefusal) const;
|
||||
///< Get a matching response for the requested dialogue.
|
||||
|
|
|
@ -241,16 +241,17 @@ void DialogueWindow::onSelectTopic(const std::string& topic, int id)
|
|||
const MWWorld::Store<ESM::GameSetting> &gmst =
|
||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
|
||||
|
||||
if (topic == gmst.find("sBarter")->getString())
|
||||
{
|
||||
/// \todo check if the player is allowed to trade with this actor (e.g. faction rank high enough)?
|
||||
mWindowManager.pushGuiMode(GM_Barter);
|
||||
mWindowManager.getTradeWindow()->startTrade(mPtr);
|
||||
}
|
||||
if (topic == gmst.find("sPersuasion")->getString())
|
||||
{
|
||||
mPersuasionDialog.setVisible(true);
|
||||
}
|
||||
else if (!MWBase::Environment::get().getDialogueManager()->checkServiceRefused())
|
||||
{
|
||||
if (topic == gmst.find("sBarter")->getString())
|
||||
{
|
||||
mWindowManager.pushGuiMode(GM_Barter);
|
||||
mWindowManager.getTradeWindow()->startTrade(mPtr);
|
||||
}
|
||||
else if (topic == gmst.find("sSpells")->getString())
|
||||
{
|
||||
mWindowManager.pushGuiMode(GM_SpellBuying);
|
||||
|
@ -277,6 +278,7 @@ void DialogueWindow::onSelectTopic(const std::string& topic, int id)
|
|||
mWindowManager.startTraining (mPtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DialogueWindow::startDialogue(MWWorld::Ptr actor, std::string npcName)
|
||||
|
|
Loading…
Reference in a new issue