#ifndef OPENMW_ESM_FACT_H #define OPENMW_ESM_FACT_H #include #include #include #include "components/esm/defs.hpp" #include "components/esm/refid.hpp" namespace ESM { class ESMReader; class ESMWriter; /* * Faction definitions */ // Requirements for each rank struct RankData { int32_t mAttribute1, mAttribute2; // Attribute level // Skill level (faction skills given in // skillID below.) You need one skill at // level 'mPrimarySkill' and two skills at level // 'mFavouredSkill' to advance to this rank. int32_t mPrimarySkill, mFavouredSkill; int32_t mFactReaction; // Reaction from faction members void load(ESMReader& esm); void save(ESMWriter& esm) const; }; struct Faction { constexpr static RecNameInts sRecordId = REC_FACT; /// Return a string descriptor for this record type. Currently used for debugging / error logs only. static std::string_view getRecordType() { return "Faction"; } uint32_t mRecordFlags; std::string mName; RefId mId; struct FADTstruct { // Which attributes we like std::array mAttribute; std::array mRankData; std::array mSkills; // IDs of skills this faction require // Each element will either contain an Skill index, or -1. int32_t mIsHidden; // 1 - hidden from player int32_t& getSkill(size_t index, bool ignored = false); ///< Throws an exception for invalid values of \a index. int32_t getSkill(size_t index, bool ignored = false) const; ///< Throws an exception for invalid values of \a index. void load(ESMReader& esm); void save(ESMWriter& esm) const; }; // 240 bytes FADTstruct mData; // std::map mReactions; // Name of faction ranks (may be empty for NPC factions) std::array mRanks; void load(ESMReader& esm, bool& isDeleted); void save(ESMWriter& esm, bool isDeleted = false) const; void blank(); ///< Set record to default state (does not touch the ID/index). }; } #endif