mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 07:56:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			161 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			161 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;
 | 
						|
    }
 | 
						|
 | 
						|
}
 |