From a645ec0910579c15fbba3c8872dabcdf7ea043b1 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Tue, 21 Jan 2025 20:25:13 +0100 Subject: [PATCH 1/2] Allow filters to apply to creatures --- apps/openmw/mwdialogue/filter.cpp | 19 +++++++++---------- apps/openmw/mwdialogue/selectwrapper.cpp | 23 ----------------------- apps/openmw/mwdialogue/selectwrapper.hpp | 3 --- 3 files changed, 9 insertions(+), 36 deletions(-) diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index 295d690ce5..e21a57aad9 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -265,10 +265,6 @@ bool MWDialogue::Filter::testFunctionLocal(const MWDialogue::SelectWrapper& sele bool MWDialogue::Filter::testSelectStruct(const SelectWrapper& select) const { - if (select.isNpcOnly() && (mActor.getType() != ESM::NPC::sRecordId)) - // If the actor is a creature, we pass all conditions only applicable to NPCs. - return true; - if (select.getFunction() == ESM::DialogueCondition::Function_Choice && mChoice == -1) // If not currently in a choice, we reject all conditions that test against choices. return false; @@ -504,7 +500,8 @@ int MWDialogue::Filter::getSelectStructInteger(const SelectWrapper& select) cons return MWBase::Environment::get().getWorld()->getCurrentWeather(); case ESM::DialogueCondition::Function_Reputation: - + if (!mActor.getClass().isNpc()) + return 0; return mActor.getClass().getNpcStats(mActor).getReputation(); case ESM::DialogueCondition::Function_FactionRankDifference: @@ -586,11 +583,11 @@ bool MWDialogue::Filter::getSelectStructBoolean(const SelectWrapper& select) con case ESM::DialogueCondition::Function_NotClass: - return mActor.get()->mBase->mClass != select.getId(); + return !mActor.getClass().isNpc() || mActor.get()->mBase->mClass != select.getId(); case ESM::DialogueCondition::Function_NotRace: - return mActor.get()->mBase->mRace != select.getId(); + return !mActor.getClass().isNpc() || mActor.get()->mBase->mRace != select.getId(); case ESM::DialogueCondition::Function_NotCell: { @@ -598,12 +595,14 @@ bool MWDialogue::Filter::getSelectStructBoolean(const SelectWrapper& select) con return !Misc::StringUtils::ciStartsWith(actorCell, select.getCellName()); } case ESM::DialogueCondition::Function_SameSex: - + if (!mActor.getClass().isNpc()) + return false; return (player.get()->mBase->mFlags & ESM::NPC::Female) == (mActor.get()->mBase->mFlags & ESM::NPC::Female); case ESM::DialogueCondition::Function_SameRace: - + if (!mActor.getClass().isNpc()) + return false; return mActor.get()->mBase->mRace == player.get()->mBase->mRace; case ESM::DialogueCondition::Function_SameFaction: @@ -668,7 +667,7 @@ bool MWDialogue::Filter::getSelectStructBoolean(const SelectWrapper& select) con case ESM::DialogueCondition::Function_Werewolf: - return mActor.getClass().getNpcStats(mActor).isWerewolf(); + return mActor.getClass().isNpc() && mActor.getClass().getNpcStats(mActor).isWerewolf(); default: diff --git a/apps/openmw/mwdialogue/selectwrapper.cpp b/apps/openmw/mwdialogue/selectwrapper.cpp index 02c9d29b59..f9469bf9a9 100644 --- a/apps/openmw/mwdialogue/selectwrapper.cpp +++ b/apps/openmw/mwdialogue/selectwrapper.cpp @@ -247,29 +247,6 @@ MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const }; } -bool MWDialogue::SelectWrapper::isNpcOnly() const -{ - switch (mSelect.mFunction) - { - case ESM::DialogueCondition::Function_NotFaction: - case ESM::DialogueCondition::Function_NotClass: - case ESM::DialogueCondition::Function_NotRace: - case ESM::DialogueCondition::Function_SameSex: - case ESM::DialogueCondition::Function_SameRace: - case ESM::DialogueCondition::Function_SameFaction: - case ESM::DialogueCondition::Function_RankRequirement: - case ESM::DialogueCondition::Function_Reputation: - case ESM::DialogueCondition::Function_FactionRankDifference: - case ESM::DialogueCondition::Function_Werewolf: - case ESM::DialogueCondition::Function_PcWerewolfKills: - case ESM::DialogueCondition::Function_FacReactionLowest: - case ESM::DialogueCondition::Function_FacReactionHighest: - return true; - default: - return false; - } -} - bool MWDialogue::SelectWrapper::selectCompare(int value) const { return selectCompareImp(mSelect, value); diff --git a/apps/openmw/mwdialogue/selectwrapper.hpp b/apps/openmw/mwdialogue/selectwrapper.hpp index d831b6cea0..d15334cbe1 100644 --- a/apps/openmw/mwdialogue/selectwrapper.hpp +++ b/apps/openmw/mwdialogue/selectwrapper.hpp @@ -28,9 +28,6 @@ namespace MWDialogue Type getType() const; - bool isNpcOnly() const; - ///< \attention Do not call any of the select functions for this select struct! - bool selectCompare(int value) const; bool selectCompare(float value) const; From 7d2dd3422dc552564321c3267267f705cb18798a Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Tue, 21 Jan 2025 20:31:12 +0100 Subject: [PATCH 2/2] Ignore missing global variables when filtering dialogue --- apps/openmw/mwdialogue/filter.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index e21a57aad9..b7d4a1361c 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -301,9 +301,13 @@ bool MWDialogue::Filter::testSelectStructNumeric(const SelectWrapper& select) co switch (select.getFunction()) { case ESM::DialogueCondition::Function_Global: - + { + const auto& world = MWBase::Environment::get().getWorld(); + if (world->getGlobalVariableType(select.getName()) == ' ') + return true; // ignore this filter if the global doesn't exist // internally all globals are float :( - return select.selectCompare(MWBase::Environment::get().getWorld()->getGlobalFloat(select.getName())); + return select.selectCompare(world->getGlobalFloat(select.getName())); + } case ESM::DialogueCondition::Function_Local: {