mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 04:26:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			166 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "loadskil.hpp"
 | 
						|
 | 
						|
#include "esmreader.hpp"
 | 
						|
#include "esmwriter.hpp"
 | 
						|
 | 
						|
#include <components/misc/strings/algorithm.hpp>
 | 
						|
 | 
						|
#include <cstdint>
 | 
						|
 | 
						|
namespace ESM
 | 
						|
{
 | 
						|
    const SkillId Skill::Block("Block");
 | 
						|
    const SkillId Skill::Armorer("Armorer");
 | 
						|
    const SkillId Skill::MediumArmor("MediumArmor");
 | 
						|
    const SkillId Skill::HeavyArmor("HeavyArmor");
 | 
						|
    const SkillId Skill::BluntWeapon("BluntWeapon");
 | 
						|
    const SkillId Skill::LongBlade("LongBlade");
 | 
						|
    const SkillId Skill::Axe("Axe");
 | 
						|
    const SkillId Skill::Spear("Spear");
 | 
						|
    const SkillId Skill::Athletics("Athletics");
 | 
						|
    const SkillId Skill::Enchant("Enchant");
 | 
						|
    const SkillId Skill::Destruction("Destruction");
 | 
						|
    const SkillId Skill::Alteration("Alteration");
 | 
						|
    const SkillId Skill::Illusion("Illusion");
 | 
						|
    const SkillId Skill::Conjuration("Conjuration");
 | 
						|
    const SkillId Skill::Mysticism("Mysticism");
 | 
						|
    const SkillId Skill::Restoration("Restoration");
 | 
						|
    const SkillId Skill::Alchemy("Alchemy");
 | 
						|
    const SkillId Skill::Unarmored("Unarmored");
 | 
						|
    const SkillId Skill::Security("Security");
 | 
						|
    const SkillId Skill::Sneak("Sneak");
 | 
						|
    const SkillId Skill::Acrobatics("Acrobatics");
 | 
						|
    const SkillId Skill::LightArmor("LightArmor");
 | 
						|
    const SkillId Skill::ShortBlade("ShortBlade");
 | 
						|
    const SkillId Skill::Marksman("Marksman");
 | 
						|
    const SkillId Skill::Mercantile("Mercantile");
 | 
						|
    const SkillId Skill::Speechcraft("Speechcraft");
 | 
						|
    const SkillId Skill::HandToHand("HandToHand");
 | 
						|
 | 
						|
    void Skill::load(ESMReader& esm, bool& isDeleted)
 | 
						|
    {
 | 
						|
        isDeleted = false; // Skill record can't be deleted now (may be changed in the future)
 | 
						|
        mRecordFlags = esm.getRecordFlags();
 | 
						|
 | 
						|
        bool hasIndex = false;
 | 
						|
        bool hasData = false;
 | 
						|
        int32_t index = -1;
 | 
						|
        while (esm.hasMoreSubs())
 | 
						|
        {
 | 
						|
            esm.getSubName();
 | 
						|
            switch (esm.retSubName().toInt())
 | 
						|
            {
 | 
						|
                case fourCC("INDX"):
 | 
						|
                    esm.getHT(index);
 | 
						|
                    hasIndex = true;
 | 
						|
                    break;
 | 
						|
                case fourCC("SKDT"):
 | 
						|
                    esm.getHTSized<24>(mData);
 | 
						|
                    hasData = true;
 | 
						|
                    break;
 | 
						|
                case fourCC("DESC"):
 | 
						|
                    mDescription = esm.getHString();
 | 
						|
                    break;
 | 
						|
                default:
 | 
						|
                    esm.fail("Unknown subrecord");
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (!hasIndex)
 | 
						|
            esm.fail("Missing INDX");
 | 
						|
        else if (index < 0 || index >= Length)
 | 
						|
            esm.fail("Invalid INDX");
 | 
						|
        if (!hasData)
 | 
						|
            esm.fail("Missing SKDT");
 | 
						|
 | 
						|
        mId = *indexToRefId(index).getIf<SkillId>();
 | 
						|
    }
 | 
						|
 | 
						|
    void Skill::save(ESMWriter& esm, bool /*isDeleted*/) const
 | 
						|
    {
 | 
						|
        esm.writeHNT("INDX", refIdToIndex(mId));
 | 
						|
        esm.writeHNT("SKDT", mData, 24);
 | 
						|
        esm.writeHNOString("DESC", mDescription);
 | 
						|
    }
 | 
						|
 | 
						|
    void Skill::blank()
 | 
						|
    {
 | 
						|
        mRecordFlags = 0;
 | 
						|
        mData.mAttribute = 0;
 | 
						|
        mData.mSpecialization = 0;
 | 
						|
        mData.mUseValue[0] = mData.mUseValue[1] = mData.mUseValue[2] = mData.mUseValue[3] = 1.0;
 | 
						|
        mDescription.clear();
 | 
						|
    }
 | 
						|
 | 
						|
    static const RefId sSkills[Skill::Length] = {
 | 
						|
        Skill::Block,
 | 
						|
        Skill::Armorer,
 | 
						|
        Skill::MediumArmor,
 | 
						|
        Skill::HeavyArmor,
 | 
						|
        Skill::BluntWeapon,
 | 
						|
        Skill::LongBlade,
 | 
						|
        Skill::Axe,
 | 
						|
        Skill::Spear,
 | 
						|
        Skill::Athletics,
 | 
						|
        Skill::Enchant,
 | 
						|
        Skill::Destruction,
 | 
						|
        Skill::Alteration,
 | 
						|
        Skill::Illusion,
 | 
						|
        Skill::Conjuration,
 | 
						|
        Skill::Mysticism,
 | 
						|
        Skill::Restoration,
 | 
						|
        Skill::Alchemy,
 | 
						|
        Skill::Unarmored,
 | 
						|
        Skill::Security,
 | 
						|
        Skill::Sneak,
 | 
						|
        Skill::Acrobatics,
 | 
						|
        Skill::LightArmor,
 | 
						|
        Skill::ShortBlade,
 | 
						|
        Skill::Marksman,
 | 
						|
        Skill::Mercantile,
 | 
						|
        Skill::Speechcraft,
 | 
						|
        Skill::HandToHand,
 | 
						|
    };
 | 
						|
 | 
						|
    RefId Skill::indexToRefId(int index)
 | 
						|
    {
 | 
						|
        if (index < 0 || index >= Length)
 | 
						|
            return RefId();
 | 
						|
        return sSkills[index];
 | 
						|
    }
 | 
						|
 | 
						|
    int Skill::refIdToIndex(RefId id)
 | 
						|
    {
 | 
						|
        for (int i = 0; i < Length; ++i)
 | 
						|
        {
 | 
						|
            if (sSkills[i] == id)
 | 
						|
                return i;
 | 
						|
        }
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    const std::array<RefId, MagicSchool::Length> sMagicSchools = {
 | 
						|
        Skill::Alteration,
 | 
						|
        Skill::Conjuration,
 | 
						|
        Skill::Destruction,
 | 
						|
        Skill::Illusion,
 | 
						|
        Skill::Mysticism,
 | 
						|
        Skill::Restoration,
 | 
						|
    };
 | 
						|
 | 
						|
    RefId MagicSchool::indexToSkillRefId(int index)
 | 
						|
    {
 | 
						|
        if (index < 0 || index >= Length)
 | 
						|
            return {};
 | 
						|
        return sMagicSchools[index];
 | 
						|
    }
 | 
						|
 | 
						|
    int MagicSchool::skillRefIdToIndex(RefId id)
 | 
						|
    {
 | 
						|
        for (size_t i = 0; i < sMagicSchools.size(); ++i)
 | 
						|
        {
 | 
						|
            if (id == sMagicSchools[i])
 | 
						|
                return static_cast<int>(i);
 | 
						|
        }
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
}
 |