mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2024-12-28 18:18:52 +00:00
302 lines
12 KiB
C++
302 lines
12 KiB
C++
#include "selectwrapper.hpp"
|
|
|
|
#include <iterator>
|
|
#include <sstream>
|
|
#include <stdexcept>
|
|
|
|
#include <components/misc/strings/conversion.hpp>
|
|
#include <components/misc/strings/lower.hpp>
|
|
|
|
namespace
|
|
{
|
|
template <typename T1, typename T2>
|
|
bool selectCompareImp(ESM::DialogueCondition::Comparison comp, T1 value1, T2 value2)
|
|
{
|
|
switch (comp)
|
|
{
|
|
case ESM::DialogueCondition::Comp_Eq:
|
|
return value1 == value2;
|
|
case ESM::DialogueCondition::Comp_Ne:
|
|
return value1 != value2;
|
|
case ESM::DialogueCondition::Comp_Gt:
|
|
return value1 > value2;
|
|
case ESM::DialogueCondition::Comp_Ge:
|
|
return value1 >= value2;
|
|
case ESM::DialogueCondition::Comp_Ls:
|
|
return value1 < value2;
|
|
case ESM::DialogueCondition::Comp_Le:
|
|
return value1 <= value2;
|
|
default:
|
|
throw std::runtime_error("unknown compare type in dialogue info select");
|
|
}
|
|
}
|
|
|
|
template <typename T>
|
|
bool selectCompareImp(const ESM::DialogueCondition& select, T value1)
|
|
{
|
|
return std::visit(
|
|
[&](auto value) { return selectCompareImp(select.mComparison, value1, value); }, select.mValue);
|
|
}
|
|
}
|
|
|
|
MWDialogue::SelectWrapper::SelectWrapper(const ESM::DialogueCondition& select)
|
|
: mSelect(select)
|
|
{
|
|
}
|
|
|
|
ESM::DialogueCondition::Function MWDialogue::SelectWrapper::getFunction() const
|
|
{
|
|
return mSelect.mFunction;
|
|
}
|
|
|
|
int MWDialogue::SelectWrapper::getArgument() const
|
|
{
|
|
switch (mSelect.mFunction)
|
|
{
|
|
// AI settings
|
|
case ESM::DialogueCondition::Function_Fight:
|
|
return 1;
|
|
case ESM::DialogueCondition::Function_Hello:
|
|
return 0;
|
|
case ESM::DialogueCondition::Function_Alarm:
|
|
return 3;
|
|
case ESM::DialogueCondition::Function_Flee:
|
|
return 2;
|
|
|
|
// attributes
|
|
case ESM::DialogueCondition::Function_PcStrength:
|
|
return 0;
|
|
case ESM::DialogueCondition::Function_PcIntelligence:
|
|
return 1;
|
|
case ESM::DialogueCondition::Function_PcWillpower:
|
|
return 2;
|
|
case ESM::DialogueCondition::Function_PcAgility:
|
|
return 3;
|
|
case ESM::DialogueCondition::Function_PcSpeed:
|
|
return 4;
|
|
case ESM::DialogueCondition::Function_PcEndurance:
|
|
return 5;
|
|
case ESM::DialogueCondition::Function_PcPersonality:
|
|
return 6;
|
|
case ESM::DialogueCondition::Function_PcLuck:
|
|
return 7;
|
|
|
|
// skills
|
|
case ESM::DialogueCondition::Function_PcBlock:
|
|
return 0;
|
|
case ESM::DialogueCondition::Function_PcArmorer:
|
|
return 1;
|
|
case ESM::DialogueCondition::Function_PcMediumArmor:
|
|
return 2;
|
|
case ESM::DialogueCondition::Function_PcHeavyArmor:
|
|
return 3;
|
|
case ESM::DialogueCondition::Function_PcBluntWeapon:
|
|
return 4;
|
|
case ESM::DialogueCondition::Function_PcLongBlade:
|
|
return 5;
|
|
case ESM::DialogueCondition::Function_PcAxe:
|
|
return 6;
|
|
case ESM::DialogueCondition::Function_PcSpear:
|
|
return 7;
|
|
case ESM::DialogueCondition::Function_PcAthletics:
|
|
return 8;
|
|
case ESM::DialogueCondition::Function_PcEnchant:
|
|
return 9;
|
|
case ESM::DialogueCondition::Function_PcDestruction:
|
|
return 10;
|
|
case ESM::DialogueCondition::Function_PcAlteration:
|
|
return 11;
|
|
case ESM::DialogueCondition::Function_PcIllusion:
|
|
return 12;
|
|
case ESM::DialogueCondition::Function_PcConjuration:
|
|
return 13;
|
|
case ESM::DialogueCondition::Function_PcMysticism:
|
|
return 14;
|
|
case ESM::DialogueCondition::Function_PcRestoration:
|
|
return 15;
|
|
case ESM::DialogueCondition::Function_PcAlchemy:
|
|
return 16;
|
|
case ESM::DialogueCondition::Function_PcUnarmored:
|
|
return 17;
|
|
case ESM::DialogueCondition::Function_PcSecurity:
|
|
return 18;
|
|
case ESM::DialogueCondition::Function_PcSneak:
|
|
return 19;
|
|
case ESM::DialogueCondition::Function_PcAcrobatics:
|
|
return 20;
|
|
case ESM::DialogueCondition::Function_PcLightArmor:
|
|
return 21;
|
|
case ESM::DialogueCondition::Function_PcShortBlade:
|
|
return 22;
|
|
case ESM::DialogueCondition::Function_PcMarksman:
|
|
return 23;
|
|
case ESM::DialogueCondition::Function_PcMerchantile:
|
|
return 24;
|
|
case ESM::DialogueCondition::Function_PcSpeechcraft:
|
|
return 25;
|
|
case ESM::DialogueCondition::Function_PcHandToHand:
|
|
return 26;
|
|
|
|
// dynamic stats
|
|
case ESM::DialogueCondition::Function_PcMagicka:
|
|
return 1;
|
|
case ESM::DialogueCondition::Function_PcFatigue:
|
|
return 2;
|
|
case ESM::DialogueCondition::Function_PcHealth:
|
|
return 0;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const
|
|
{
|
|
switch (mSelect.mFunction)
|
|
{
|
|
case ESM::DialogueCondition::Function_Journal:
|
|
case ESM::DialogueCondition::Function_Item:
|
|
case ESM::DialogueCondition::Function_Dead:
|
|
case ESM::DialogueCondition::Function_Choice:
|
|
case ESM::DialogueCondition::Function_Fight:
|
|
case ESM::DialogueCondition::Function_Hello:
|
|
case ESM::DialogueCondition::Function_Alarm:
|
|
case ESM::DialogueCondition::Function_Flee:
|
|
case ESM::DialogueCondition::Function_PcStrength:
|
|
case ESM::DialogueCondition::Function_PcIntelligence:
|
|
case ESM::DialogueCondition::Function_PcWillpower:
|
|
case ESM::DialogueCondition::Function_PcAgility:
|
|
case ESM::DialogueCondition::Function_PcSpeed:
|
|
case ESM::DialogueCondition::Function_PcEndurance:
|
|
case ESM::DialogueCondition::Function_PcPersonality:
|
|
case ESM::DialogueCondition::Function_PcLuck:
|
|
case ESM::DialogueCondition::Function_PcBlock:
|
|
case ESM::DialogueCondition::Function_PcArmorer:
|
|
case ESM::DialogueCondition::Function_PcMediumArmor:
|
|
case ESM::DialogueCondition::Function_PcHeavyArmor:
|
|
case ESM::DialogueCondition::Function_PcBluntWeapon:
|
|
case ESM::DialogueCondition::Function_PcLongBlade:
|
|
case ESM::DialogueCondition::Function_PcAxe:
|
|
case ESM::DialogueCondition::Function_PcSpear:
|
|
case ESM::DialogueCondition::Function_PcAthletics:
|
|
case ESM::DialogueCondition::Function_PcEnchant:
|
|
case ESM::DialogueCondition::Function_PcDestruction:
|
|
case ESM::DialogueCondition::Function_PcAlteration:
|
|
case ESM::DialogueCondition::Function_PcIllusion:
|
|
case ESM::DialogueCondition::Function_PcConjuration:
|
|
case ESM::DialogueCondition::Function_PcMysticism:
|
|
case ESM::DialogueCondition::Function_PcRestoration:
|
|
case ESM::DialogueCondition::Function_PcAlchemy:
|
|
case ESM::DialogueCondition::Function_PcUnarmored:
|
|
case ESM::DialogueCondition::Function_PcSecurity:
|
|
case ESM::DialogueCondition::Function_PcSneak:
|
|
case ESM::DialogueCondition::Function_PcAcrobatics:
|
|
case ESM::DialogueCondition::Function_PcLightArmor:
|
|
case ESM::DialogueCondition::Function_PcShortBlade:
|
|
case ESM::DialogueCondition::Function_PcMarksman:
|
|
case ESM::DialogueCondition::Function_PcMerchantile:
|
|
case ESM::DialogueCondition::Function_PcSpeechcraft:
|
|
case ESM::DialogueCondition::Function_PcHandToHand:
|
|
case ESM::DialogueCondition::Function_FriendHit:
|
|
case ESM::DialogueCondition::Function_PcLevel:
|
|
case ESM::DialogueCondition::Function_PcGender:
|
|
case ESM::DialogueCondition::Function_PcClothingModifier:
|
|
case ESM::DialogueCondition::Function_PcCrimeLevel:
|
|
case ESM::DialogueCondition::Function_RankRequirement:
|
|
case ESM::DialogueCondition::Function_Level:
|
|
case ESM::DialogueCondition::Function_PcReputation:
|
|
case ESM::DialogueCondition::Function_Weather:
|
|
case ESM::DialogueCondition::Function_Reputation:
|
|
case ESM::DialogueCondition::Function_FactionRankDifference:
|
|
case ESM::DialogueCondition::Function_PcWerewolfKills:
|
|
case ESM::DialogueCondition::Function_FacReactionLowest:
|
|
case ESM::DialogueCondition::Function_FacReactionHighest:
|
|
case ESM::DialogueCondition::Function_CreatureTarget:
|
|
return Type_Integer;
|
|
case ESM::DialogueCondition::Function_Global:
|
|
case ESM::DialogueCondition::Function_Local:
|
|
case ESM::DialogueCondition::Function_NotLocal:
|
|
case ESM::DialogueCondition::Function_PcHealth:
|
|
case ESM::DialogueCondition::Function_PcMagicka:
|
|
case ESM::DialogueCondition::Function_PcFatigue:
|
|
case ESM::DialogueCondition::Function_PcHealthPercent:
|
|
case ESM::DialogueCondition::Function_Health_Percent:
|
|
return Type_Numeric;
|
|
case ESM::DialogueCondition::Function_SameSex:
|
|
case ESM::DialogueCondition::Function_SameRace:
|
|
case ESM::DialogueCondition::Function_SameFaction:
|
|
case ESM::DialogueCondition::Function_PcCommonDisease:
|
|
case ESM::DialogueCondition::Function_PcBlightDisease:
|
|
case ESM::DialogueCondition::Function_PcCorprus:
|
|
case ESM::DialogueCondition::Function_PcExpelled:
|
|
case ESM::DialogueCondition::Function_PcVampire:
|
|
case ESM::DialogueCondition::Function_TalkedToPc:
|
|
case ESM::DialogueCondition::Function_Alarmed:
|
|
case ESM::DialogueCondition::Function_Detected:
|
|
case ESM::DialogueCondition::Function_Attacked:
|
|
case ESM::DialogueCondition::Function_ShouldAttack:
|
|
case ESM::DialogueCondition::Function_Werewolf:
|
|
return Type_Boolean;
|
|
case ESM::DialogueCondition::Function_NotId:
|
|
case ESM::DialogueCondition::Function_NotFaction:
|
|
case ESM::DialogueCondition::Function_NotClass:
|
|
case ESM::DialogueCondition::Function_NotRace:
|
|
case ESM::DialogueCondition::Function_NotCell:
|
|
return Type_Inverted;
|
|
default:
|
|
return Type_None;
|
|
};
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
bool MWDialogue::SelectWrapper::selectCompare(float value) const
|
|
{
|
|
return selectCompareImp(mSelect, value);
|
|
}
|
|
|
|
bool MWDialogue::SelectWrapper::selectCompare(bool value) const
|
|
{
|
|
return selectCompareImp(mSelect, static_cast<int>(value));
|
|
}
|
|
|
|
std::string MWDialogue::SelectWrapper::getName() const
|
|
{
|
|
return Misc::StringUtils::lowerCase(mSelect.mVariable);
|
|
}
|
|
|
|
std::string_view MWDialogue::SelectWrapper::getCellName() const
|
|
{
|
|
return mSelect.mVariable;
|
|
}
|
|
|
|
ESM::RefId MWDialogue::SelectWrapper::getId() const
|
|
{
|
|
return ESM::RefId::stringRefId(mSelect.mVariable);
|
|
}
|