1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-01 08:09:46 +00:00

Use StringRefId for skills

This commit is contained in:
Evil Eye 2023-06-15 21:38:46 +02:00
parent ac9378fa08
commit 967b5d205b
9 changed files with 379 additions and 286 deletions

View file

@ -26,8 +26,6 @@ namespace CSMWorld
{ {
switch (value.getRecordType()) switch (value.getRecordType())
{ {
case ESM::REC_SKIL:
return ESM::Skill::sSkillNames[value.getValue()];
case ESM::REC_MGEF: case ESM::REC_MGEF:
return std::string(ESM::MagicEffect::sIndexNames[value.getValue()]); return std::string(ESM::MagicEffect::sIndexNames[value.getValue()]);
default: default:
@ -335,10 +333,10 @@ namespace CSMWorld
std::optional<std::uint32_t> getSkillIndex(std::string_view value) std::optional<std::uint32_t> getSkillIndex(std::string_view value)
{ {
const auto it = std::find(std::begin(ESM::Skill::sSkillNames), std::end(ESM::Skill::sSkillNames), value); int index = ESM::Skill::refIdToIndex(ESM::RefId::stringRefId(value));
if (it == std::end(ESM::Skill::sSkillNames)) if (index < 0)
return std::nullopt; return std::nullopt;
return static_cast<std::uint32_t>(it - std::begin(ESM::Skill::sSkillNames)); return static_cast<std::uint32_t>(index);
} }
std::string getStringId(ESM::RefId value) std::string getStringId(ESM::RefId value)

View file

@ -409,7 +409,8 @@ namespace CSMWorld
QVariant get(const Record<ESXRecordT>& record) const override QVariant get(const Record<ESXRecordT>& record) const override
{ {
return QString::fromStdString(ESM::Skill::sSkillNames[record.get().mData.getSkill(mIndex, mMajor)]); return QString::fromStdString(
ESM::Skill::indexToRefId(record.get().mData.getSkill(mIndex, mMajor)).getRefIdString());
} }
void set(Record<ESXRecordT>& record, const QVariant& data) override void set(Record<ESXRecordT>& record, const QVariant& data) override

View file

@ -156,10 +156,17 @@ namespace MWLua
return sol::nil; return sol::nil;
}; };
// TODO: deprecate this and provide access to the store instead
sol::table skill(context.mLua->sol(), sol::create); sol::table skill(context.mLua->sol(), sol::create);
api["SKILL"] = LuaUtil::makeStrictReadOnly(skill); api["SKILL"] = LuaUtil::makeStrictReadOnly(skill);
for (int id = 0; id < ESM::Skill::Length; ++id) for (int i = 0; i < ESM::Skill::Length; ++i)
skill[ESM::Skill::sSkillNames[id]] = Misc::StringUtils::lowerCase(ESM::Skill::sSkillNames[id]); {
std::string id = ESM::Skill::indexToRefId(i).serializeText();
std::string key = id;
// force first character to uppercase for backwards compatability
key[0] += 'A' - 'a';
skill[key] = id;
}
sol::table attribute(context.mLua->sol(), sol::create); sol::table attribute(context.mLua->sol(), sol::create);
api["ATTRIBUTE"] = LuaUtil::makeStrictReadOnly(attribute); api["ATTRIBUTE"] = LuaUtil::makeStrictReadOnly(attribute);

View file

@ -309,10 +309,10 @@ namespace MWLua
}); });
effectParamsT["affectedSkill"] effectParamsT["affectedSkill"]
= sol::readonly_property([](const ESM::ENAMstruct& params) -> sol::optional<std::string> { = sol::readonly_property([](const ESM::ENAMstruct& params) -> sol::optional<std::string> {
if (params.mSkill >= 0 && params.mSkill < ESM::Skill::Length) ESM::RefId id = ESM::Skill::indexToRefId(params.mSkill);
return Misc::StringUtils::lowerCase(ESM::Skill::sSkillNames[params.mSkill]); if (!id.empty())
else return id.serializeText();
return sol::nullopt; return sol::nullopt;
}); });
effectParamsT["affectedAttribute"] effectParamsT["affectedAttribute"]
= sol::readonly_property([](const ESM::ENAMstruct& params) -> sol::optional<std::string> { = sol::readonly_property([](const ESM::ENAMstruct& params) -> sol::optional<std::string> {
@ -383,11 +383,12 @@ namespace MWLua
activeEffectT["affectedSkill"] activeEffectT["affectedSkill"]
= sol::readonly_property([magicEffectStore](const ActiveEffect& effect) -> sol::optional<std::string> { = sol::readonly_property([magicEffectStore](const ActiveEffect& effect) -> sol::optional<std::string> {
auto* rec = magicEffectStore->find(effect.key.mId); auto* rec = magicEffectStore->find(effect.key.mId);
if ((rec->mData.mFlags & ESM::MagicEffect::TargetSkill) && effect.key.mArg >= 0 if (rec->mData.mFlags & ESM::MagicEffect::TargetSkill)
&& effect.key.mArg < ESM::Skill::Length) {
return Misc::StringUtils::lowerCase(ESM::Skill::sSkillNames[effect.key.mArg]); ESM::RefId id = ESM::Skill::indexToRefId(effect.key.mArg);
else return id.serializeText();
return sol::nullopt; }
return sol::nullopt;
}); });
activeEffectT["affectedAttribute"] activeEffectT["affectedAttribute"]
= sol::readonly_property([magicEffectStore](const ActiveEffect& effect) -> sol::optional<std::string> { = sol::readonly_property([magicEffectStore](const ActiveEffect& effect) -> sol::optional<std::string> {
@ -620,7 +621,10 @@ namespace MWLua
key = MWMechanics::EffectKey(id, ESM::Attribute::stringToAttributeId(argStr.value())); key = MWMechanics::EffectKey(id, ESM::Attribute::stringToAttributeId(argStr.value()));
if (rec->mData.mFlags & ESM::MagicEffect::TargetSkill) if (rec->mData.mFlags & ESM::MagicEffect::TargetSkill)
key = MWMechanics::EffectKey(id, ESM::Skill::stringToSkillId(argStr.value())); {
ESM::RefId skill = ESM::RefId::stringRefId(argStr.value());
key = MWMechanics::EffectKey(id, ESM::Skill::refIdToIndex(skill));
}
} }
return key; return key;

View file

@ -392,7 +392,6 @@ namespace MWLua
sol::table skills(context.mLua->sol(), sol::create); sol::table skills(context.mLua->sol(), sol::create);
npcStats["skills"] = LuaUtil::makeReadOnly(skills); npcStats["skills"] = LuaUtil::makeReadOnly(skills);
for (const ESM::Skill& skill : MWBase::Environment::get().getESMStore()->get<ESM::Skill>()) for (const ESM::Skill& skill : MWBase::Environment::get().getESMStore()->get<ESM::Skill>())
skills[Misc::StringUtils::lowerCase(ESM::Skill::sSkillNames[ESM::Skill::refIdToIndex(skill.mId)])] skills[skill.mId.serializeText()] = addIndexedAccessor<SkillStat>(skill.mId);
= addIndexedAccessor<SkillStat>(skill.mId);
} }
} }

View file

@ -41,18 +41,14 @@ namespace
book.mData.mValue = rec["value"]; book.mData.mValue = rec["value"];
book.mData.mIsScroll = rec["isScroll"]; book.mData.mIsScroll = rec["isScroll"];
std::string_view skill = rec["skill"].get<std::string_view>(); ESM::RefId skill = ESM::RefId::stringRefId(rec["skill"].get<std::string_view>());
book.mData.mSkillId = -1; book.mData.mSkillId = -1;
if (skill.length() > 0) if (!skill.empty())
{ {
for (std::size_t i = 0; i < std::size(ESM::Skill::sSkillNames); ++i) book.mData.mSkillId = ESM::Skill::refIdToIndex(skill);
{
if (Misc::StringUtils::ciEqual(ESM::Skill::sSkillNames[i], skill))
book.mData.mSkillId = i;
}
if (book.mData.mSkillId == -1) if (book.mData.mSkillId == -1)
throw std::runtime_error("Incorrect skill: " + std::string(skill)); throw std::runtime_error("Incorrect skill: " + skill.toDebugString());
} }
return book; return book;
} }
@ -69,7 +65,7 @@ namespace MWLua
book["createRecordDraft"] = tableToBook; book["createRecordDraft"] = tableToBook;
for (int id = 0; id < ESM::Skill::Length; ++id) for (int id = 0; id < ESM::Skill::Length; ++id)
{ {
std::string skillName = Misc::StringUtils::lowerCase(ESM::Skill::sSkillNames[id]); std::string skillName = ESM::Skill::indexToRefId(id).serializeText();
skill[skillName] = skillName; skill[skillName] = skillName;
} }
@ -100,10 +96,10 @@ namespace MWLua
record["enchantCapacity"] record["enchantCapacity"]
= sol::readonly_property([](const ESM::Book& rec) -> float { return rec.mData.mEnchant * 0.1f; }); = sol::readonly_property([](const ESM::Book& rec) -> float { return rec.mData.mEnchant * 0.1f; });
record["skill"] = sol::readonly_property([](const ESM::Book& rec) -> sol::optional<std::string> { record["skill"] = sol::readonly_property([](const ESM::Book& rec) -> sol::optional<std::string> {
if (rec.mData.mSkillId >= 0) ESM::RefId skill = ESM::Skill::indexToRefId(rec.mData.mSkillId);
return Misc::StringUtils::lowerCase(ESM::Skill::sSkillNames[rec.mData.mSkillId]); if (!skill.empty())
else return skill.serializeText();
return sol::nullopt; return sol::nullopt;
}); });
} }
} }

View file

@ -18,253 +18,325 @@ namespace MWMechanics
template <> template <>
struct Weapon<ESM::Weapon::None> struct Weapon<ESM::Weapon::None>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "", inline static const ESM::WeaponType& getValue()
/* long group */ "", {
/* sound ID */ "", static const ESM::WeaponType value{ /* short group */ "",
/* attach bone */ "", /* long group */ "",
/* sheath bone */ "", /* sound ID */ "",
/* usage skill */ ESM::Skill::HandToHand, /* attach bone */ "",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::HandToHand,
/* flags */ 0 }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ 0 };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::PickProbe> struct Weapon<ESM::Weapon::PickProbe>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "1h", inline static const ESM::WeaponType& getValue()
/* long group */ "pickprobe", {
/* sound ID */ "", static const ESM::WeaponType value{ /* short group */ "1h",
/* attach bone */ "", /* long group */ "pickprobe",
/* sheath bone */ "", /* sound ID */ "",
/* usage skill */ ESM::Skill::Security, /* attach bone */ "",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Security,
/* flags */ 0 }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ 0 };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::Spell> struct Weapon<ESM::Weapon::Spell>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "spell", inline static const ESM::WeaponType& getValue()
/* long group */ "spellcast", {
/* sound ID */ "", static const ESM::WeaponType value{ /* short group */ "spell",
/* attach bone */ "", /* long group */ "spellcast",
/* sheath bone */ "", /* sound ID */ "",
/* usage skill */ ESM::Skill::HandToHand, /* attach bone */ "",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::HandToHand,
/* flags */ ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::HandToHand> struct Weapon<ESM::Weapon::HandToHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "hh", inline static const ESM::WeaponType& getValue()
/* long group */ "handtohand", {
/* sound ID */ "", static const ESM::WeaponType value{ /* short group */ "hh",
/* attach bone */ "", /* long group */ "handtohand",
/* sheath bone */ "", /* sound ID */ "",
/* usage skill */ ESM::Skill::HandToHand, /* attach bone */ "",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::HandToHand,
/* flags */ ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::ShortBladeOneHand> struct Weapon<ESM::Weapon::ShortBladeOneHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "1s", inline static const ESM::WeaponType& getValue()
/* long group */ "shortbladeonehand", {
/* sound ID */ "Item Weapon Shortblade", static const ESM::WeaponType value{ /* short group */ "1s",
/* attach bone */ "Weapon Bone", /* long group */ "shortbladeonehand",
/* sheath bone */ "Bip01 ShortBladeOneHand", /* sound ID */ "Item Weapon Shortblade",
/* usage skill */ ESM::Skill::ShortBlade, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 ShortBladeOneHand",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::ShortBlade,
/* flags */ ESM::WeaponType::HasHealth }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::LongBladeOneHand> struct Weapon<ESM::Weapon::LongBladeOneHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "1h", inline static const ESM::WeaponType& getValue()
/* long group */ "weapononehand", {
/* sound ID */ "Item Weapon Longblade", static const ESM::WeaponType value{ /* short group */ "1h",
/* attach bone */ "Weapon Bone", /* long group */ "weapononehand",
/* sheath bone */ "Bip01 LongBladeOneHand", /* sound ID */ "Item Weapon Longblade",
/* usage skill */ ESM::Skill::LongBlade, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 LongBladeOneHand",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::LongBlade,
/* flags */ ESM::WeaponType::HasHealth }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::BluntOneHand> struct Weapon<ESM::Weapon::BluntOneHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "1b", inline static const ESM::WeaponType& getValue()
/* long group */ "bluntonehand", {
/* sound ID */ "Item Weapon Blunt", static const ESM::WeaponType value{ /* short group */ "1b",
/* attach bone */ "Weapon Bone", /* long group */ "bluntonehand",
/* sheath bone */ "Bip01 BluntOneHand", /* sound ID */ "Item Weapon Blunt",
/* usage skill */ ESM::Skill::BluntWeapon, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 BluntOneHand",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::BluntWeapon,
/* flags */ ESM::WeaponType::HasHealth }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::AxeOneHand> struct Weapon<ESM::Weapon::AxeOneHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "1b", inline static const ESM::WeaponType& getValue()
/* long group */ "bluntonehand", {
/* sound ID */ "Item Weapon Blunt", static const ESM::WeaponType value{ /* short group */ "1b",
/* attach bone */ "Weapon Bone", /* long group */ "bluntonehand",
/* sheath bone */ "Bip01 LongBladeOneHand", /* sound ID */ "Item Weapon Blunt",
/* usage skill */ ESM::Skill::Axe, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 LongBladeOneHand",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Axe,
/* flags */ ESM::WeaponType::HasHealth }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::LongBladeTwoHand> struct Weapon<ESM::Weapon::LongBladeTwoHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "2c", inline static const ESM::WeaponType& getValue()
/* long group */ "weapontwohand", {
/* sound ID */ "Item Weapon Longblade", static const ESM::WeaponType value{ /* short group */ "2c",
/* attach bone */ "Weapon Bone", /* long group */ "weapontwohand",
/* sheath bone */ "Bip01 LongBladeTwoClose", /* sound ID */ "Item Weapon Longblade",
/* usage skill */ ESM::Skill::LongBlade, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 LongBladeTwoClose",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::LongBlade,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::AxeTwoHand> struct Weapon<ESM::Weapon::AxeTwoHand>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "2b", inline static const ESM::WeaponType& getValue()
/* long group */ "blunttwohand", {
/* sound ID */ "Item Weapon Blunt", static const ESM::WeaponType value{ /* short group */ "2b",
/* attach bone */ "Weapon Bone", /* long group */ "blunttwohand",
/* sheath bone */ "Bip01 AxeTwoClose", /* sound ID */ "Item Weapon Blunt",
/* usage skill */ ESM::Skill::Axe, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 AxeTwoClose",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Axe,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::BluntTwoClose> struct Weapon<ESM::Weapon::BluntTwoClose>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "2b", inline static const ESM::WeaponType& getValue()
/* long group */ "blunttwohand", {
/* sound ID */ "Item Weapon Blunt", static const ESM::WeaponType value{ /* short group */ "2b",
/* attach bone */ "Weapon Bone", /* long group */ "blunttwohand",
/* sheath bone */ "Bip01 BluntTwoClose", /* sound ID */ "Item Weapon Blunt",
/* usage skill */ ESM::Skill::BluntWeapon, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 BluntTwoClose",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::BluntWeapon,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::BluntTwoWide> struct Weapon<ESM::Weapon::BluntTwoWide>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "2w", inline static const ESM::WeaponType& getValue()
/* long group */ "weapontwowide", {
/* sound ID */ "Item Weapon Blunt", static const ESM::WeaponType value{ /* short group */ "2w",
/* attach bone */ "Weapon Bone", /* long group */ "weapontwowide",
/* sheath bone */ "Bip01 BluntTwoWide", /* sound ID */ "Item Weapon Blunt",
/* usage skill */ ESM::Skill::BluntWeapon, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 BluntTwoWide",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::BluntWeapon,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::SpearTwoWide> struct Weapon<ESM::Weapon::SpearTwoWide>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "2w", inline static const ESM::WeaponType& getValue()
/* long group */ "weapontwowide", {
/* sound ID */ "Item Weapon Spear", static const ESM::WeaponType value{ /* short group */ "2w",
/* attach bone */ "Weapon Bone", /* long group */ "weapontwowide",
/* sheath bone */ "Bip01 SpearTwoWide", /* sound ID */ "Item Weapon Spear",
/* usage skill */ ESM::Skill::Spear, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Melee, /* sheath bone */ "Bip01 SpearTwoWide",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Spear,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Melee,
/* ammo type */ ESM::Weapon::None,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::MarksmanBow> struct Weapon<ESM::Weapon::MarksmanBow>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "bow", inline static const ESM::WeaponType& getValue()
/* long group */ "bowandarrow", {
/* sound ID */ "Item Weapon Bow", static const ESM::WeaponType value{ /* short group */ "bow",
/* attach bone */ "Weapon Bone Left", /* long group */ "bowandarrow",
/* sheath bone */ "Bip01 MarksmanBow", /* sound ID */ "Item Weapon Bow",
/* usage skill */ ESM::Skill::Marksman, /* attach bone */ "Weapon Bone Left",
/* weapon class*/ ESM::WeaponType::Ranged, /* sheath bone */ "Bip01 MarksmanBow",
/* ammo type */ ESM::Weapon::Arrow, /* usage skill */ ESM::Skill::Marksman,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Ranged,
/* ammo type */ ESM::Weapon::Arrow,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::MarksmanCrossbow> struct Weapon<ESM::Weapon::MarksmanCrossbow>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "crossbow", inline static const ESM::WeaponType& getValue()
/* long group */ "crossbow", {
/* sound ID */ "Item Weapon Crossbow", static const ESM::WeaponType value{ /* short group */ "crossbow",
/* attach bone */ "Weapon Bone", /* long group */ "crossbow",
/* sheath bone */ "Bip01 MarksmanCrossbow", /* sound ID */ "Item Weapon Crossbow",
/* usage skill */ ESM::Skill::Marksman, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Ranged, /* sheath bone */ "Bip01 MarksmanCrossbow",
/* ammo type */ ESM::Weapon::Bolt, /* usage skill */ ESM::Skill::Marksman,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded }; /* weapon class*/ ESM::WeaponType::Ranged,
/* ammo type */ ESM::Weapon::Bolt,
/* flags */ ESM::WeaponType::HasHealth | ESM::WeaponType::TwoHanded };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::MarksmanThrown> struct Weapon<ESM::Weapon::MarksmanThrown>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "1t", inline static const ESM::WeaponType& getValue()
/* long group */ "throwweapon", {
/* sound ID */ "Item Weapon Blunt", static const ESM::WeaponType value{ /* short group */ "1t",
/* attach bone */ "Weapon Bone", /* long group */ "throwweapon",
/* sheath bone */ "Bip01 MarksmanThrown", /* sound ID */ "Item Weapon Blunt",
/* usage skill */ ESM::Skill::Marksman, /* attach bone */ "Weapon Bone",
/* weapon class*/ ESM::WeaponType::Thrown, /* sheath bone */ "Bip01 MarksmanThrown",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Marksman,
/* flags */ 0 }; /* weapon class*/ ESM::WeaponType::Thrown,
/* ammo type */ ESM::Weapon::None,
/* flags */ 0 };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::Arrow> struct Weapon<ESM::Weapon::Arrow>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "", inline static const ESM::WeaponType& getValue()
/* long group */ "", {
/* sound ID */ "Item Ammo", static const ESM::WeaponType value{ /* short group */ "",
/* attach bone */ "Bip01 Arrow", /* long group */ "",
/* sheath bone */ "", /* sound ID */ "Item Ammo",
/* usage skill */ ESM::Skill::Marksman, /* attach bone */ "Bip01 Arrow",
/* weapon class*/ ESM::WeaponType::Ammo, /* sheath bone */ "",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Marksman,
/* flags */ 0 }; /* weapon class*/ ESM::WeaponType::Ammo,
/* ammo type */ ESM::Weapon::None,
/* flags */ 0 };
return value;
}
}; };
template <> template <>
struct Weapon<ESM::Weapon::Bolt> struct Weapon<ESM::Weapon::Bolt>
{ {
inline static const ESM::WeaponType sValue{ /* short group */ "", inline static const ESM::WeaponType& getValue()
/* long group */ "", {
/* sound ID */ "Item Ammo", static const ESM::WeaponType value{ /* short group */ "",
/* attach bone */ "ArrowBone", /* long group */ "",
/* sheath bone */ "", /* sound ID */ "Item Ammo",
/* usage skill */ ESM::Skill::Marksman, /* attach bone */ "ArrowBone",
/* weapon class*/ ESM::WeaponType::Ammo, /* sheath bone */ "",
/* ammo type */ ESM::Weapon::None, /* usage skill */ ESM::Skill::Marksman,
/* flags */ 0 }; /* weapon class*/ ESM::WeaponType::Ammo,
/* ammo type */ ESM::Weapon::None,
/* flags */ 0 };
return value;
}
}; };
MWWorld::ContainerStoreIterator getActiveWeapon(const MWWorld::Ptr& actor, int* weaptype) MWWorld::ContainerStoreIterator getActiveWeapon(const MWWorld::Ptr& actor, int* weaptype)
@ -305,43 +377,43 @@ namespace MWMechanics
switch (static_cast<ESM::Weapon::Type>(weaponType)) switch (static_cast<ESM::Weapon::Type>(weaponType))
{ {
case ESM::Weapon::PickProbe: case ESM::Weapon::PickProbe:
return &Weapon<ESM::Weapon::PickProbe>::sValue; return &Weapon<ESM::Weapon::PickProbe>::getValue();
case ESM::Weapon::HandToHand: case ESM::Weapon::HandToHand:
return &Weapon<ESM::Weapon::HandToHand>::sValue; return &Weapon<ESM::Weapon::HandToHand>::getValue();
case ESM::Weapon::Spell: case ESM::Weapon::Spell:
return &Weapon<ESM::Weapon::Spell>::sValue; return &Weapon<ESM::Weapon::Spell>::getValue();
case ESM::Weapon::None: case ESM::Weapon::None:
return &Weapon<ESM::Weapon::None>::sValue; return &Weapon<ESM::Weapon::None>::getValue();
case ESM::Weapon::ShortBladeOneHand: case ESM::Weapon::ShortBladeOneHand:
return &Weapon<ESM::Weapon::ShortBladeOneHand>::sValue; return &Weapon<ESM::Weapon::ShortBladeOneHand>::getValue();
case ESM::Weapon::LongBladeOneHand: case ESM::Weapon::LongBladeOneHand:
return &Weapon<ESM::Weapon::LongBladeOneHand>::sValue; return &Weapon<ESM::Weapon::LongBladeOneHand>::getValue();
case ESM::Weapon::LongBladeTwoHand: case ESM::Weapon::LongBladeTwoHand:
return &Weapon<ESM::Weapon::LongBladeTwoHand>::sValue; return &Weapon<ESM::Weapon::LongBladeTwoHand>::getValue();
case ESM::Weapon::BluntOneHand: case ESM::Weapon::BluntOneHand:
return &Weapon<ESM::Weapon::BluntOneHand>::sValue; return &Weapon<ESM::Weapon::BluntOneHand>::getValue();
case ESM::Weapon::BluntTwoClose: case ESM::Weapon::BluntTwoClose:
return &Weapon<ESM::Weapon::BluntTwoClose>::sValue; return &Weapon<ESM::Weapon::BluntTwoClose>::getValue();
case ESM::Weapon::BluntTwoWide: case ESM::Weapon::BluntTwoWide:
return &Weapon<ESM::Weapon::BluntTwoWide>::sValue; return &Weapon<ESM::Weapon::BluntTwoWide>::getValue();
case ESM::Weapon::SpearTwoWide: case ESM::Weapon::SpearTwoWide:
return &Weapon<ESM::Weapon::SpearTwoWide>::sValue; return &Weapon<ESM::Weapon::SpearTwoWide>::getValue();
case ESM::Weapon::AxeOneHand: case ESM::Weapon::AxeOneHand:
return &Weapon<ESM::Weapon::AxeOneHand>::sValue; return &Weapon<ESM::Weapon::AxeOneHand>::getValue();
case ESM::Weapon::AxeTwoHand: case ESM::Weapon::AxeTwoHand:
return &Weapon<ESM::Weapon::AxeTwoHand>::sValue; return &Weapon<ESM::Weapon::AxeTwoHand>::getValue();
case ESM::Weapon::MarksmanBow: case ESM::Weapon::MarksmanBow:
return &Weapon<ESM::Weapon::MarksmanBow>::sValue; return &Weapon<ESM::Weapon::MarksmanBow>::getValue();
case ESM::Weapon::MarksmanCrossbow: case ESM::Weapon::MarksmanCrossbow:
return &Weapon<ESM::Weapon::MarksmanCrossbow>::sValue; return &Weapon<ESM::Weapon::MarksmanCrossbow>::getValue();
case ESM::Weapon::MarksmanThrown: case ESM::Weapon::MarksmanThrown:
return &Weapon<ESM::Weapon::MarksmanThrown>::sValue; return &Weapon<ESM::Weapon::MarksmanThrown>::getValue();
case ESM::Weapon::Arrow: case ESM::Weapon::Arrow:
return &Weapon<ESM::Weapon::Arrow>::sValue; return &Weapon<ESM::Weapon::Arrow>::getValue();
case ESM::Weapon::Bolt: case ESM::Weapon::Bolt:
return &Weapon<ESM::Weapon::Bolt>::sValue; return &Weapon<ESM::Weapon::Bolt>::getValue();
} }
return &Weapon<ESM::Weapon::ShortBladeOneHand>::sValue; return &Weapon<ESM::Weapon::ShortBladeOneHand>::getValue();
} }
} }

View file

@ -7,44 +7,33 @@
namespace ESM namespace ESM
{ {
const std::string Skill::sSkillNames[Length] = { const RefId Skill::Block = RefId::stringRefId("Block");
"Block", const RefId Skill::Armorer = RefId::stringRefId("Armorer");
"Armorer", const RefId Skill::MediumArmor = RefId::stringRefId("MediumArmor");
"Mediumarmor", const RefId Skill::HeavyArmor = RefId::stringRefId("HeavyArmor");
"Heavyarmor", const RefId Skill::BluntWeapon = RefId::stringRefId("BluntWeapon");
"Bluntweapon", const RefId Skill::LongBlade = RefId::stringRefId("LongBlade");
"Longblade", const RefId Skill::Axe = RefId::stringRefId("Axe");
"Axe", const RefId Skill::Spear = RefId::stringRefId("Spear");
"Spear", const RefId Skill::Athletics = RefId::stringRefId("Athletics");
"Athletics", const RefId Skill::Enchant = RefId::stringRefId("Enchant");
"Enchant", const RefId Skill::Destruction = RefId::stringRefId("Destruction");
"Destruction", const RefId Skill::Alteration = RefId::stringRefId("Alteration");
"Alteration", const RefId Skill::Illusion = RefId::stringRefId("Illusion");
"Illusion", const RefId Skill::Conjuration = RefId::stringRefId("Conjuration");
"Conjuration", const RefId Skill::Mysticism = RefId::stringRefId("Mysticism");
"Mysticism", const RefId Skill::Restoration = RefId::stringRefId("Restoration");
"Restoration", const RefId Skill::Alchemy = RefId::stringRefId("Alchemy");
"Alchemy", const RefId Skill::Unarmored = RefId::stringRefId("Unarmored");
"Unarmored", const RefId Skill::Security = RefId::stringRefId("Security");
"Security", const RefId Skill::Sneak = RefId::stringRefId("Sneak");
"Sneak", const RefId Skill::Acrobatics = RefId::stringRefId("Acrobatics");
"Acrobatics", const RefId Skill::LightArmor = RefId::stringRefId("LightArmor");
"Lightarmor", const RefId Skill::ShortBlade = RefId::stringRefId("ShortBlade");
"Shortblade", const RefId Skill::Marksman = RefId::stringRefId("Marksman");
"Marksman", const RefId Skill::Mercantile = RefId::stringRefId("Mercantile");
"Mercantile", const RefId Skill::Speechcraft = RefId::stringRefId("Speechcraft");
"Speechcraft", const RefId Skill::HandToHand = RefId::stringRefId("HandToHand");
"Handtohand",
};
int Skill::stringToSkillId(std::string_view skill)
{
for (int id = 0; id < Skill::Length; ++id)
if (Misc::StringUtils::ciEqual(sSkillNames[id], skill))
return id;
throw std::logic_error("No such skill: " + std::string(skill));
}
void Skill::load(ESMReader& esm, bool& isDeleted) void Skill::load(ESMReader& esm, bool& isDeleted)
{ {
@ -102,19 +91,49 @@ namespace ESM
mDescription.clear(); mDescription.clear();
} }
static const RefId sSkills[] = {
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) RefId Skill::indexToRefId(int index)
{ {
if (index < 0 || index >= Length) if (index < 0 || index >= Length)
return RefId(); return RefId();
return RefId::index(sRecordId, static_cast<std::uint32_t>(index)); return sSkills[index];
} }
int Skill::refIdToIndex(RefId id) int Skill::refIdToIndex(RefId id)
{ {
if (const IndexRefId* index = id.getIf<IndexRefId>()) for (int i = 0; i < Length; ++i)
{ {
if (index->getRecordType() == sRecordId) if (sSkills[i] == id)
return index->getValue(); return i;
} }
return -1; return -1;
} }

View file

@ -61,37 +61,34 @@ namespace ESM
float mWerewolfValue{}; float mWerewolfValue{};
std::optional<MagicSchool> mSchool; std::optional<MagicSchool> mSchool;
static constexpr IndexRefId Block{ sRecordId, 0 }; static const RefId Block;
static constexpr IndexRefId Armorer{ sRecordId, 1 }; static const RefId Armorer;
static constexpr IndexRefId MediumArmor{ sRecordId, 2 }; static const RefId MediumArmor;
static constexpr IndexRefId HeavyArmor{ sRecordId, 3 }; static const RefId HeavyArmor;
static constexpr IndexRefId BluntWeapon{ sRecordId, 4 }; static const RefId BluntWeapon;
static constexpr IndexRefId LongBlade{ sRecordId, 5 }; static const RefId LongBlade;
static constexpr IndexRefId Axe{ sRecordId, 6 }; static const RefId Axe;
static constexpr IndexRefId Spear{ sRecordId, 7 }; static const RefId Spear;
static constexpr IndexRefId Athletics{ sRecordId, 8 }; static const RefId Athletics;
static constexpr IndexRefId Enchant{ sRecordId, 9 }; static const RefId Enchant;
static constexpr IndexRefId Destruction{ sRecordId, 10 }; static const RefId Destruction;
static constexpr IndexRefId Alteration{ sRecordId, 11 }; static const RefId Alteration;
static constexpr IndexRefId Illusion{ sRecordId, 12 }; static const RefId Illusion;
static constexpr IndexRefId Conjuration{ sRecordId, 13 }; static const RefId Conjuration;
static constexpr IndexRefId Mysticism{ sRecordId, 14 }; static const RefId Mysticism;
static constexpr IndexRefId Restoration{ sRecordId, 15 }; static const RefId Restoration;
static constexpr IndexRefId Alchemy{ sRecordId, 16 }; static const RefId Alchemy;
static constexpr IndexRefId Unarmored{ sRecordId, 17 }; static const RefId Unarmored;
static constexpr IndexRefId Security{ sRecordId, 18 }; static const RefId Security;
static constexpr IndexRefId Sneak{ sRecordId, 19 }; static const RefId Sneak;
static constexpr IndexRefId Acrobatics{ sRecordId, 20 }; static const RefId Acrobatics;
static constexpr IndexRefId LightArmor{ sRecordId, 21 }; static const RefId LightArmor;
static constexpr IndexRefId ShortBlade{ sRecordId, 22 }; static const RefId ShortBlade;
static constexpr IndexRefId Marksman{ sRecordId, 23 }; static const RefId Marksman;
static constexpr IndexRefId Mercantile{ sRecordId, 24 }; static const RefId Mercantile;
static constexpr IndexRefId Speechcraft{ sRecordId, 25 }; static const RefId Speechcraft;
static constexpr IndexRefId HandToHand{ sRecordId, 26 }; static const RefId HandToHand;
static constexpr int Length = 27; static constexpr int Length = 27;
static const std::string sSkillNames[Length];
static int stringToSkillId(std::string_view skill);
void load(ESMReader& esm, bool& isDeleted); void load(ESMReader& esm, bool& isDeleted);
void save(ESMWriter& esm, bool isDeleted = false) const; void save(ESMWriter& esm, bool isDeleted = false) const;