|
|
|
@ -25,7 +25,7 @@ bool MWDialogue::Filter::testActor (const ESM::DialInfo& info) const
|
|
|
|
|
// actor id
|
|
|
|
|
if (!info.mActor.empty())
|
|
|
|
|
{
|
|
|
|
|
if ( !Misc::StringUtils::ciEqual(info.mActor, MWWorld::Class::get (mActor).getId (mActor)))
|
|
|
|
|
if ( !Misc::StringUtils::ciEqual(info.mActor, mActor.getClass().getId (mActor)))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else if (isCreature)
|
|
|
|
@ -64,7 +64,7 @@ bool MWDialogue::Filter::testActor (const ESM::DialInfo& info) const
|
|
|
|
|
if (isCreature)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
MWMechanics::NpcStats& stats = MWWorld::Class::get (mActor).getNpcStats (mActor);
|
|
|
|
|
MWMechanics::NpcStats& stats = mActor.getClass().getNpcStats (mActor);
|
|
|
|
|
std::map<std::string, int>::iterator iter = stats.getFactionRanks().find ( Misc::StringUtils::lowerCase (info.mFaction));
|
|
|
|
|
|
|
|
|
|
if (iter==stats.getFactionRanks().end())
|
|
|
|
@ -98,7 +98,7 @@ bool MWDialogue::Filter::testPlayer (const ESM::DialInfo& info) const
|
|
|
|
|
// check player faction
|
|
|
|
|
if (!info.mPcFaction.empty())
|
|
|
|
|
{
|
|
|
|
|
MWMechanics::NpcStats& stats = MWWorld::Class::get (player).getNpcStats (player);
|
|
|
|
|
MWMechanics::NpcStats& stats = player.getClass().getNpcStats (player);
|
|
|
|
|
std::map<std::string,int>::iterator iter = stats.getFactionRanks().find (Misc::StringUtils::lowerCase (info.mPcFaction));
|
|
|
|
|
|
|
|
|
|
if(iter==stats.getFactionRanks().end())
|
|
|
|
@ -182,7 +182,7 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Local:
|
|
|
|
|
{
|
|
|
|
|
std::string scriptName = MWWorld::Class::get (mActor).getScript (mActor);
|
|
|
|
|
std::string scriptName = mActor.getClass().getScript (mActor);
|
|
|
|
|
|
|
|
|
|
if (scriptName.empty())
|
|
|
|
|
return false; // no script
|
|
|
|
@ -220,8 +220,8 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c
|
|
|
|
|
{
|
|
|
|
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
|
|
|
|
|
|
|
|
|
float ratio = MWWorld::Class::get (player).getCreatureStats (player).getHealth().getCurrent() /
|
|
|
|
|
MWWorld::Class::get (player).getCreatureStats (player).getHealth().getModified();
|
|
|
|
|
float ratio = player.getClass().getCreatureStats (player).getHealth().getCurrent() /
|
|
|
|
|
player.getClass().getCreatureStats (player).getHealth().getModified();
|
|
|
|
|
|
|
|
|
|
return select.selectCompare (static_cast<int>(ratio*100));
|
|
|
|
|
}
|
|
|
|
@ -230,7 +230,7 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c
|
|
|
|
|
{
|
|
|
|
|
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr();
|
|
|
|
|
|
|
|
|
|
float value = MWWorld::Class::get (player).getCreatureStats (player).
|
|
|
|
|
float value = player.getClass().getCreatureStats (player).
|
|
|
|
|
getDynamic (select.getArgument()).getCurrent();
|
|
|
|
|
|
|
|
|
|
return select.selectCompare (value);
|
|
|
|
@ -238,8 +238,8 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_HealthPercent:
|
|
|
|
|
{
|
|
|
|
|
float ratio = MWWorld::Class::get (mActor).getCreatureStats (mActor).getHealth().getCurrent() /
|
|
|
|
|
MWWorld::Class::get (mActor).getCreatureStats (mActor).getHealth().getModified();
|
|
|
|
|
float ratio = mActor.getClass().getCreatureStats (mActor).getHealth().getCurrent() /
|
|
|
|
|
mActor.getClass().getCreatureStats (mActor).getHealth().getModified();
|
|
|
|
|
|
|
|
|
|
return select.selectCompare (ratio);
|
|
|
|
|
}
|
|
|
|
@ -262,17 +262,9 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Item:
|
|
|
|
|
{
|
|
|
|
|
MWWorld::ContainerStore& store = MWWorld::Class::get (player).getContainerStore (player);
|
|
|
|
|
MWWorld::ContainerStore& store = player.getClass().getContainerStore (player);
|
|
|
|
|
|
|
|
|
|
int sum = 0;
|
|
|
|
|
|
|
|
|
|
std::string name = select.getName();
|
|
|
|
|
|
|
|
|
|
for (MWWorld::ContainerStoreIterator iter (store.begin()); iter!=store.end(); ++iter)
|
|
|
|
|
if (Misc::StringUtils::ciEqual(iter->getCellRef().mRefID, name))
|
|
|
|
|
sum += iter->getRefData().getCount();
|
|
|
|
|
|
|
|
|
|
return sum;
|
|
|
|
|
return store.count(select.getName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Dead:
|
|
|
|
@ -285,29 +277,29 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_AiSetting:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getCreatureStats (mActor).getAiSetting (
|
|
|
|
|
return mActor.getClass().getCreatureStats (mActor).getAiSetting (
|
|
|
|
|
(MWMechanics::CreatureStats::AiSetting)select.getArgument()).getModified();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcAttribute:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getCreatureStats (player).
|
|
|
|
|
return player.getClass().getCreatureStats (player).
|
|
|
|
|
getAttribute (select.getArgument()).getModified();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcSkill:
|
|
|
|
|
|
|
|
|
|
return static_cast<int> (MWWorld::Class::get (player).
|
|
|
|
|
return static_cast<int> (player.getClass().
|
|
|
|
|
getNpcStats (player).getSkill (select.getArgument()).getModified());
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_FriendlyHit:
|
|
|
|
|
{
|
|
|
|
|
int hits = MWWorld::Class::get (mActor).getCreatureStats (mActor).getFriendlyHits();
|
|
|
|
|
int hits = mActor.getClass().getCreatureStats (mActor).getFriendlyHits();
|
|
|
|
|
|
|
|
|
|
return hits>4 ? 4 : hits;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcLevel:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getCreatureStats (player).getLevel();
|
|
|
|
|
return player.getClass().getCreatureStats (player).getLevel();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcGender:
|
|
|
|
|
|
|
|
|
@ -315,7 +307,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcClothingModifier:
|
|
|
|
|
{
|
|
|
|
|
MWWorld::InventoryStore& store = MWWorld::Class::get (player).getInventoryStore (player);
|
|
|
|
|
MWWorld::InventoryStore& store = player.getClass().getInventoryStore (player);
|
|
|
|
|
|
|
|
|
|
int value = 0;
|
|
|
|
|
|
|
|
|
@ -324,7 +316,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
MWWorld::ContainerStoreIterator slot = store.getSlot (i);
|
|
|
|
|
|
|
|
|
|
if (slot!=store.end())
|
|
|
|
|
value += MWWorld::Class::get (*slot).getValue (*slot);
|
|
|
|
|
value += slot->getClass().getValue (*slot);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value;
|
|
|
|
@ -332,15 +324,15 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcCrimeLevel:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getNpcStats (player).getBounty();
|
|
|
|
|
return player.getClass().getNpcStats (player).getBounty();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_RankRequirement:
|
|
|
|
|
{
|
|
|
|
|
if (MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
if (mActor.getClass().getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
std::string faction =
|
|
|
|
|
MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().begin()->first;
|
|
|
|
|
mActor.getClass().getNpcStats (mActor).getFactionRanks().begin()->first;
|
|
|
|
|
|
|
|
|
|
int rank = getFactionRank (player, faction);
|
|
|
|
|
|
|
|
|
@ -360,11 +352,11 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Level:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getCreatureStats (mActor).getLevel();
|
|
|
|
|
return mActor.getClass().getCreatureStats (mActor).getLevel();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PCReputation:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getNpcStats (player).getReputation();
|
|
|
|
|
return player.getClass().getNpcStats (player).getReputation();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Weather:
|
|
|
|
|
|
|
|
|
@ -372,15 +364,15 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Reputation:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getNpcStats (mActor).getReputation();
|
|
|
|
|
return mActor.getClass().getNpcStats (mActor).getReputation();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_FactionRankDiff:
|
|
|
|
|
{
|
|
|
|
|
if (MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
if (mActor.getClass().getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
std::pair<std::string, int> faction =
|
|
|
|
|
*MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().begin();
|
|
|
|
|
*mActor.getClass().getNpcStats (mActor).getFactionRanks().begin();
|
|
|
|
|
|
|
|
|
|
int rank = getFactionRank (player, faction.first);
|
|
|
|
|
|
|
|
|
@ -389,31 +381,30 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_WerewolfKills:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getNpcStats (player).getWerewolfKills();
|
|
|
|
|
return player.getClass().getNpcStats (player).getWerewolfKills();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_RankLow:
|
|
|
|
|
case SelectWrapper::Function_RankHigh:
|
|
|
|
|
{
|
|
|
|
|
bool low = select.getFunction()==SelectWrapper::Function_RankLow;
|
|
|
|
|
|
|
|
|
|
if (MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
if (mActor.getClass().getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
std::string factionId =
|
|
|
|
|
MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().begin()->first;
|
|
|
|
|
mActor.getClass().getNpcStats (mActor).getFactionRanks().begin()->first;
|
|
|
|
|
|
|
|
|
|
int value = 0;
|
|
|
|
|
|
|
|
|
|
const ESM::Faction& faction =
|
|
|
|
|
*MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find (factionId);
|
|
|
|
|
MWMechanics::NpcStats& playerStats = player.getClass().getNpcStats (player);
|
|
|
|
|
|
|
|
|
|
MWMechanics::NpcStats& playerStats = MWWorld::Class::get (player).getNpcStats (player);
|
|
|
|
|
|
|
|
|
|
for (std::vector<ESM::Faction::Reaction>::const_iterator iter (faction.mReactions.begin());
|
|
|
|
|
iter!=faction.mReactions.end(); ++iter)
|
|
|
|
|
if (playerStats.getFactionRanks().find (iter->mFaction)!=playerStats.getFactionRanks().end())
|
|
|
|
|
if (low ? iter->mReaction<value : iter->mReaction>value)
|
|
|
|
|
value = iter->mReaction;
|
|
|
|
|
std::map<std::string, int>::const_iterator playerFactionIt = playerStats.getFactionRanks().begin();
|
|
|
|
|
for (; playerFactionIt != playerStats.getFactionRanks().end(); ++playerFactionIt)
|
|
|
|
|
{
|
|
|
|
|
int reaction = MWBase::Environment::get().getDialogueManager()->getFactionReaction(factionId, playerFactionIt->first);
|
|
|
|
|
if (low ? reaction < value : reaction > value)
|
|
|
|
|
value = reaction;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
@ -436,7 +427,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_NotId:
|
|
|
|
|
|
|
|
|
|
return !Misc::StringUtils::ciEqual(MWWorld::Class::get (mActor).getId (mActor), select.getName());
|
|
|
|
|
return !Misc::StringUtils::ciEqual(mActor.getClass().getId (mActor), select.getName());
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_NotFaction:
|
|
|
|
|
|
|
|
|
@ -456,7 +447,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_NotLocal:
|
|
|
|
|
{
|
|
|
|
|
std::string scriptName = MWWorld::Class::get (mActor).getScript (mActor);
|
|
|
|
|
std::string scriptName = mActor.getClass().getScript (mActor);
|
|
|
|
|
|
|
|
|
|
if (scriptName.empty())
|
|
|
|
|
// This actor has no attached script, so there is no local variable
|
|
|
|
@ -489,36 +480,36 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_SameFaction:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getNpcStats (mActor).isSameFaction (
|
|
|
|
|
MWWorld::Class::get (player).getNpcStats (player));
|
|
|
|
|
return mActor.getClass().getNpcStats (mActor).isSameFaction (
|
|
|
|
|
player.getClass().getNpcStats (player));
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcCommonDisease:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getCreatureStats (player).hasCommonDisease();
|
|
|
|
|
return player.getClass().getCreatureStats (player).hasCommonDisease();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcBlightDisease:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getCreatureStats (player).hasBlightDisease();
|
|
|
|
|
return player.getClass().getCreatureStats (player).hasBlightDisease();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcCorprus:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getCreatureStats (player).
|
|
|
|
|
return player.getClass().getCreatureStats (player).
|
|
|
|
|
getMagicEffects().get (ESM::MagicEffect::Corprus).mMagnitude!=0;
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcExpelled:
|
|
|
|
|
{
|
|
|
|
|
if (MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
if (mActor.getClass().getNpcStats (mActor).getFactionRanks().empty())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
std::string faction =
|
|
|
|
|
MWWorld::Class::get (mActor).getNpcStats (mActor).getFactionRanks().begin()->first;
|
|
|
|
|
mActor.getClass().getNpcStats (mActor).getFactionRanks().begin()->first;
|
|
|
|
|
|
|
|
|
|
return player.getClass().getNpcStats(player).getExpelled(faction);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_PcVampire:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (player).getCreatureStats(player).getMagicEffects().
|
|
|
|
|
return player.getClass().getCreatureStats(player).getMagicEffects().
|
|
|
|
|
get(ESM::MagicEffect::Vampirism).mMagnitude > 0;
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_TalkedToPc:
|
|
|
|
@ -527,7 +518,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Alarmed:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getCreatureStats (mActor).isAlarmed();
|
|
|
|
|
return mActor.getClass().getCreatureStats (mActor).isAlarmed();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Detected:
|
|
|
|
|
|
|
|
|
@ -535,11 +526,11 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Attacked:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getCreatureStats (mActor).getAttacked();
|
|
|
|
|
return mActor.getClass().getCreatureStats (mActor).getAttacked();
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_ShouldAttack:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getCreatureStats (mActor).isHostile();
|
|
|
|
|
return mActor.getClass().getCreatureStats(mActor).getAiSetting(MWMechanics::CreatureStats::AI_Fight).getModified() >= 80;
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_CreatureTargetted:
|
|
|
|
|
|
|
|
|
@ -547,7 +538,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
case SelectWrapper::Function_Werewolf:
|
|
|
|
|
|
|
|
|
|
return MWWorld::Class::get (mActor).getNpcStats (mActor).isWerewolf();
|
|
|
|
|
return mActor.getClass().getNpcStats (mActor).isWerewolf();
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
|
@ -557,7 +548,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|
|
|
|
|
|
|
|
|
int MWDialogue::Filter::getFactionRank (const MWWorld::Ptr& actor, const std::string& factionId) const
|
|
|
|
|
{
|
|
|
|
|
MWMechanics::NpcStats& stats = MWWorld::Class::get (actor).getNpcStats (actor);
|
|
|
|
|
MWMechanics::NpcStats& stats = actor.getClass().getNpcStats (actor);
|
|
|
|
|
|
|
|
|
|
std::map<std::string, int>::const_iterator iter = stats.getFactionRanks().find (factionId);
|
|
|
|
|
|
|
|
|
@ -573,13 +564,13 @@ bool MWDialogue::Filter::hasFactionRankSkillRequirements (const MWWorld::Ptr& ac
|
|
|
|
|
if (rank<0 || rank>=10)
|
|
|
|
|
throw std::runtime_error ("rank index out of range");
|
|
|
|
|
|
|
|
|
|
if (!MWWorld::Class::get (actor).getNpcStats (actor).hasSkillsForRank (factionId, rank))
|
|
|
|
|
if (!actor.getClass().getNpcStats (actor).hasSkillsForRank (factionId, rank))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
const ESM::Faction& faction =
|
|
|
|
|
*MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find (factionId);
|
|
|
|
|
|
|
|
|
|
MWMechanics::CreatureStats& stats = MWWorld::Class::get (actor).getCreatureStats (actor);
|
|
|
|
|
MWMechanics::CreatureStats& stats = actor.getClass().getCreatureStats (actor);
|
|
|
|
|
|
|
|
|
|
return stats.getAttribute (faction.mData.mAttribute[0]).getBase()>=faction.mData.mRankData[rank].mAttribute1 &&
|
|
|
|
|
stats.getAttribute (faction.mData.mAttribute[1]).getBase()>=faction.mData.mRankData[rank].mAttribute2;
|
|
|
|
@ -591,7 +582,7 @@ bool MWDialogue::Filter::hasFactionRankReputationRequirements (const MWWorld::Pt
|
|
|
|
|
if (rank<0 || rank>=10)
|
|
|
|
|
throw std::runtime_error ("rank index out of range");
|
|
|
|
|
|
|
|
|
|
MWMechanics::NpcStats& stats = MWWorld::Class::get (actor).getNpcStats (actor);
|
|
|
|
|
MWMechanics::NpcStats& stats = actor.getClass().getNpcStats (actor);
|
|
|
|
|
|
|
|
|
|
const ESM::Faction& faction =
|
|
|
|
|
*MWBase::Environment::get().getWorld()->getStore().get<ESM::Faction>().find (factionId);
|
|
|
|
|