mirror of https://github.com/OpenMW/openmw.git
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.
138 lines
4.1 KiB
C++
138 lines
4.1 KiB
C++
#ifndef OPENMW_ESM_SKIL_H
|
|
#define OPENMW_ESM_SKIL_H
|
|
|
|
#include <array>
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
#include "components/esm/defs.hpp"
|
|
#include "components/esm/refid.hpp"
|
|
|
|
namespace ESM
|
|
{
|
|
|
|
class ESMReader;
|
|
class ESMWriter;
|
|
|
|
using SkillId = StringRefId;
|
|
|
|
struct MagicSchool
|
|
{
|
|
ESM::RefId mAreaSound;
|
|
ESM::RefId mBoltSound;
|
|
ESM::RefId mCastSound;
|
|
ESM::RefId mFailureSound;
|
|
ESM::RefId mHitSound;
|
|
std::string mName;
|
|
int32_t mAutoCalcMax;
|
|
|
|
static constexpr int Length = 6;
|
|
|
|
static RefId indexToSkillRefId(int index);
|
|
static int skillRefIdToIndex(RefId id);
|
|
};
|
|
|
|
/*
|
|
* Skill information
|
|
*
|
|
*/
|
|
|
|
struct Skill
|
|
{
|
|
|
|
constexpr static RecNameInts sRecordId = REC_SKIL;
|
|
/// Return a string descriptor for this record type. Currently used for debugging / error logs only.
|
|
static std::string_view getRecordType() { return "Skill"; }
|
|
|
|
uint32_t mRecordFlags;
|
|
SkillId mId;
|
|
|
|
//! Enum that defines the index into SKDTstruct::mUseValue for all vanilla skill uses
|
|
enum UseType
|
|
{
|
|
// These are shared by multiple skills
|
|
Armor_HitByOpponent = 0,
|
|
Block_Success = 0,
|
|
Spellcast_Success = 0,
|
|
Weapon_SuccessfulHit = 0,
|
|
|
|
// Skill-specific use types
|
|
Alchemy_CreatePotion = 0,
|
|
Alchemy_UseIngredient = 1,
|
|
Enchant_Recharge = 0,
|
|
Enchant_UseMagicItem = 1,
|
|
Enchant_CreateMagicItem = 2,
|
|
Enchant_CastOnStrike = 3,
|
|
Acrobatics_Jump = 0,
|
|
Acrobatics_Fall = 1,
|
|
Mercantile_Success = 0,
|
|
Mercantile_Bribe = 1, //!< \Note This is bugged in vanilla and is not actually in use.
|
|
Security_DisarmTrap = 0,
|
|
Security_PickLock = 1,
|
|
Sneak_AvoidNotice = 0,
|
|
Sneak_PickPocket = 1,
|
|
Speechcraft_Success = 0,
|
|
Speechcraft_Fail = 1,
|
|
Armorer_Repair = 0,
|
|
Athletics_RunOneSecond = 0,
|
|
Athletics_SwimOneSecond = 1,
|
|
|
|
};
|
|
|
|
struct SKDTstruct
|
|
{
|
|
int32_t mAttribute; // see defs.hpp
|
|
int32_t mSpecialization; // 0 - Combat, 1 - Magic, 2 - Stealth
|
|
float mUseValue[4]; // How much skill improves through use. Meaning
|
|
// of each field depends on what skill this
|
|
// is. See UseType above
|
|
}; // Total size: 24 bytes
|
|
SKDTstruct mData;
|
|
|
|
std::string mDescription;
|
|
std::string mName;
|
|
std::string mIcon;
|
|
float mWerewolfValue{};
|
|
std::optional<MagicSchool> mSchool;
|
|
|
|
static const SkillId Block;
|
|
static const SkillId Armorer;
|
|
static const SkillId MediumArmor;
|
|
static const SkillId HeavyArmor;
|
|
static const SkillId BluntWeapon;
|
|
static const SkillId LongBlade;
|
|
static const SkillId Axe;
|
|
static const SkillId Spear;
|
|
static const SkillId Athletics;
|
|
static const SkillId Enchant;
|
|
static const SkillId Destruction;
|
|
static const SkillId Alteration;
|
|
static const SkillId Illusion;
|
|
static const SkillId Conjuration;
|
|
static const SkillId Mysticism;
|
|
static const SkillId Restoration;
|
|
static const SkillId Alchemy;
|
|
static const SkillId Unarmored;
|
|
static const SkillId Security;
|
|
static const SkillId Sneak;
|
|
static const SkillId Acrobatics;
|
|
static const SkillId LightArmor;
|
|
static const SkillId ShortBlade;
|
|
static const SkillId Marksman;
|
|
static const SkillId Mercantile;
|
|
static const SkillId Speechcraft;
|
|
static const SkillId HandToHand;
|
|
static constexpr int Length = 27;
|
|
|
|
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).
|
|
|
|
static RefId indexToRefId(int index);
|
|
static int refIdToIndex(RefId id);
|
|
};
|
|
}
|
|
#endif
|