You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw/components/esm3/npcstats.cpp

162 lines
3.9 KiB
C++

#include "npcstats.hpp"
#include "esmreader.hpp"
#include "esmwriter.hpp"
namespace ESM
{
NpcStats::Faction::Faction()
: mExpelled(false)
, mRank(-1)
, mReputation(0)
{
}
void NpcStats::load(ESMReader& esm)
{
while (esm.isNextSub("FACT"))
{
ESM::RefId id = esm.getRefId();
Faction faction;
int32_t expelled = 0;
esm.getHNOT(expelled, "FAEX");
if (expelled)
faction.mExpelled = true;
esm.getHNOT(faction.mRank, "FARA");
esm.getHNOT(faction.mReputation, "FARE");
mFactions.emplace(id, faction);
}
mDisposition = 0;
esm.getHNOT(mDisposition, "DISP");
mCrimeDispositionModifier = 0;
esm.getHNOT(mCrimeDispositionModifier, "DISM");
const bool intFallback = esm.getFormatVersion() <= MaxIntFallbackFormatVersion;
for (auto& skill : mSkills)
skill.load(esm, intFallback);
mIsWerewolf = false;
esm.getHNOT(mIsWerewolf, "WOLF");
mBounty = 0;
esm.getHNOT(mBounty, "BOUN");
mReputation = 0;
esm.getHNOT(mReputation, "REPU");
mWerewolfKills = 0;
esm.getHNOT(mWerewolfKills, "WKIL");
mLevelProgress = 0;
esm.getHNOT(mLevelProgress, "LPRO");
mSkillIncrease.fill(0);
esm.getHNOT(mSkillIncrease, "INCR");
mSpecIncreases.fill(0);
esm.getHNOT(mSpecIncreases, "SPEC");
while (esm.isNextSub("USED"))
mUsedIds.push_back(esm.getRefId());
mTimeToStartDrowning = 0;
esm.getHNOT(mTimeToStartDrowning, "DRTI");
mCrimeId = -1;
esm.getHNOT(mCrimeId, "CRID");
}
void NpcStats::save(ESMWriter& esm) const
{
for (const auto& [id, faction] : mFactions)
{
esm.writeHNRefId("FACT", id);
if (faction.mExpelled)
{
int32_t expelled = 1;
esm.writeHNT("FAEX", expelled);
}
if (faction.mRank >= 0)
esm.writeHNT("FARA", faction.mRank);
if (faction.mReputation)
esm.writeHNT("FARE", faction.mReputation);
}
if (mDisposition)
esm.writeHNT("DISP", mDisposition);
if (mCrimeDispositionModifier)
esm.writeHNT("DISM", mCrimeDispositionModifier);
for (const auto& skill : mSkills)
skill.save(esm);
if (mIsWerewolf)
esm.writeHNT("WOLF", mIsWerewolf);
if (mBounty)
esm.writeHNT("BOUN", mBounty);
if (mReputation)
esm.writeHNT("REPU", mReputation);
if (mWerewolfKills)
esm.writeHNT("WKIL", mWerewolfKills);
if (mLevelProgress)
esm.writeHNT("LPRO", mLevelProgress);
bool saveSkillIncreases = false;
for (int32_t increase : mSkillIncrease)
{
if (increase != 0)
{
saveSkillIncreases = true;
break;
}
}
if (saveSkillIncreases)
esm.writeHNT("INCR", mSkillIncrease);
if (mSpecIncreases[0] != 0 || mSpecIncreases[1] != 0 || mSpecIncreases[2] != 0)
esm.writeHNT("SPEC", mSpecIncreases);
for (const RefId& id : mUsedIds)
esm.writeHNRefId("USED", id);
if (mTimeToStartDrowning)
esm.writeHNT("DRTI", mTimeToStartDrowning);
if (mCrimeId != -1)
esm.writeHNT("CRID", mCrimeId);
}
void NpcStats::blank()
{
mIsWerewolf = false;
mDisposition = 0;
mCrimeDispositionModifier = 0;
mBounty = 0;
mReputation = 0;
mWerewolfKills = 0;
mLevelProgress = 0;
mSkillIncrease.fill(0);
mSpecIncreases.fill(0);
mTimeToStartDrowning = 20;
mCrimeId = -1;
}
}