diff options
author | Evil Eye <malusluminis@hotmail.com> | 2024-02-28 17:20:46 +0100 |
---|---|---|
committer | Evil Eye <malusluminis@hotmail.com> | 2024-02-28 17:20:46 +0100 |
commit | 0519e1215f608fa82374a220ebefa182f25f05db (patch) | |
tree | 66162963cbe1684e781600001e04cb410a040a10 | |
parent | f346295975e29c2c6640878e4a048ad4158e385c (diff) |
Unify the creation of RefId tables
-rw-r--r-- | apps/openmw/mwlua/birthsignbindings.cpp | 17 | ||||
-rw-r--r-- | apps/openmw/mwlua/classbindings.cpp | 30 | ||||
-rw-r--r-- | apps/openmw/mwlua/factionbindings.cpp | 21 | ||||
-rw-r--r-- | apps/openmw/mwlua/idcollectionbindings.hpp | 25 | ||||
-rw-r--r-- | apps/openmw/mwlua/racebindings.cpp | 5 |
5 files changed, 41 insertions, 57 deletions
diff --git a/apps/openmw/mwlua/birthsignbindings.cpp b/apps/openmw/mwlua/birthsignbindings.cpp index 95b427eaa4..f9266991ae 100644 --- a/apps/openmw/mwlua/birthsignbindings.cpp +++ b/apps/openmw/mwlua/birthsignbindings.cpp @@ -8,6 +8,7 @@ #include "../mwworld/esmstore.hpp" #include "birthsignbindings.hpp" +#include "idcollectionbindings.hpp" #include "luamanagerimp.hpp" #include "types/types.hpp" @@ -47,19 +48,9 @@ namespace MWLua signT["texture"] = sol::readonly_property([vfs](const ESM::BirthSign& rec) -> std::string { return Misc::ResourceHelpers::correctTexturePath(rec.mTexture, vfs); }); - signT["spells"] - = sol::readonly_property([](const ESM::BirthSign& rec) -> const ESM::SpellList* { return &rec.mPowers; }); - - auto spellListT = lua.new_usertype<ESM::SpellList>("ESM3_SpellList"); - spellListT[sol::meta_function::length] = [](const ESM::SpellList& list) { return list.mList.size(); }; - spellListT[sol::meta_function::index] - = [](const ESM::SpellList& list, size_t index) -> sol::optional<std::string> { - if (index == 0 || index > list.mList.size()) - return sol::nullopt; - return list.mList[index - 1].serializeText(); // Translate from Lua's 1-based indexing. - }; - spellListT[sol::meta_function::pairs] = lua["ipairsForArray"].template get<sol::function>(); - spellListT[sol::meta_function::ipairs] = lua["ipairsForArray"].template get<sol::function>(); + signT["spells"] = sol::readonly_property([lua](const ESM::BirthSign& rec) -> sol::table { + return createReadOnlyRefIdTable(lua, rec.mPowers.mList); + }); return LuaUtil::makeReadOnly(birthSigns); } diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index ea1ea8e7ef..a272a5b407 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -6,6 +6,7 @@ #include "../mwworld/esmstore.hpp" #include "classbindings.hpp" +#include "idcollectionbindings.hpp" #include "luamanagerimp.hpp" #include "stats.hpp" #include "types/types.hpp" @@ -40,34 +41,15 @@ namespace MWLua = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mDescription; }); classT["attributes"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table { - sol::table res(lua, sol::create); - auto attribute = rec.mData.mAttribute; - for (size_t i = 0; i < attribute.size(); ++i) - { - ESM::RefId attributeId = ESM::Attribute::indexToRefId(attribute[i]); - res[i + 1] = attributeId.serializeText(); - } - return res; + return createReadOnlyRefIdTable(lua, rec.mData.mAttribute, ESM::Attribute::indexToRefId); }); classT["majorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table { - sol::table res(lua, sol::create); - auto skills = rec.mData.mSkills; - for (size_t i = 0; i < skills.size(); ++i) - { - ESM::RefId skillId = ESM::Skill::indexToRefId(skills[i][1]); - res[i + 1] = skillId.serializeText(); - } - return res; + return createReadOnlyRefIdTable( + lua, rec.mData.mSkills, [](const auto& pair) { return ESM::Skill::indexToRefId(pair[1]); }); }); classT["minorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table { - sol::table res(lua, sol::create); - auto skills = rec.mData.mSkills; - for (size_t i = 0; i < skills.size(); ++i) - { - ESM::RefId skillId = ESM::Skill::indexToRefId(skills[i][0]); - res[i + 1] = skillId.serializeText(); - } - return res; + return createReadOnlyRefIdTable( + lua, rec.mData.mSkills, [](const auto& pair) { return ESM::Skill::indexToRefId(pair[0]); }); }); classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { diff --git a/apps/openmw/mwlua/factionbindings.cpp b/apps/openmw/mwlua/factionbindings.cpp index 87ce6ced39..e4c65386bf 100644 --- a/apps/openmw/mwlua/factionbindings.cpp +++ b/apps/openmw/mwlua/factionbindings.cpp @@ -9,6 +9,7 @@ #include "../mwmechanics/npcstats.hpp" +#include "idcollectionbindings.hpp" #include "luamanagerimp.hpp" namespace @@ -96,26 +97,10 @@ namespace MWLua return res; }); factionT["attributes"] = sol::readonly_property([&lua](const ESM::Faction& rec) { - sol::table res(lua, sol::create); - for (auto attributeIndex : rec.mData.mAttribute) - { - ESM::RefId id = ESM::Attribute::indexToRefId(attributeIndex); - if (!id.empty()) - res.add(id.serializeText()); - } - - return res; + return createReadOnlyRefIdTable(lua, rec.mData.mAttribute, ESM::Attribute::indexToRefId); }); factionT["skills"] = sol::readonly_property([&lua](const ESM::Faction& rec) { - sol::table res(lua, sol::create); - for (auto skillIndex : rec.mData.mSkills) - { - ESM::RefId id = ESM::Skill::indexToRefId(skillIndex); - if (!id.empty()) - res.add(id.serializeText()); - } - - return res; + return createReadOnlyRefIdTable(lua, rec.mData.mSkills, ESM::Skill::indexToRefId); }); auto rankT = lua.new_usertype<FactionRank>("ESM3_FactionRank"); rankT[sol::meta_function::to_string] = [](const FactionRank& rec) -> std::string { diff --git a/apps/openmw/mwlua/idcollectionbindings.hpp b/apps/openmw/mwlua/idcollectionbindings.hpp new file mode 100644 index 0000000000..15e2b14fb9 --- /dev/null +++ b/apps/openmw/mwlua/idcollectionbindings.hpp @@ -0,0 +1,25 @@ +#ifndef MWLUA_IDCOLLECTIONBINDINGS_H
+#define MWLUA_IDCOLLECTIONBINDINGS_H
+
+#include <functional>
+
+#include <components/esm/refid.hpp>
+#include <components/lua/luastate.hpp>
+
+namespace MWLua
+{
+ template <class C, class P = std::identity>
+ sol::table createReadOnlyRefIdTable(const sol::state_view& lua, const C& container, P projection = {})
+ {
+ sol::table res(lua, sol::create);
+ for (const auto& element : container)
+ {
+ ESM::RefId id = projection(element);
+ if (!id.empty())
+ res.add(id.serializeText());
+ }
+ return LuaUtil::makeReadOnly(res);
+ }
+}
+
+#endif
diff --git a/apps/openmw/mwlua/racebindings.cpp b/apps/openmw/mwlua/racebindings.cpp index b5ea3c12bf..4ee2f7b5f7 100644 --- a/apps/openmw/mwlua/racebindings.cpp +++ b/apps/openmw/mwlua/racebindings.cpp @@ -6,6 +6,7 @@ #include "../mwworld/class.hpp" #include "../mwworld/esmstore.hpp" +#include "idcollectionbindings.hpp" #include "luamanagerimp.hpp" #include "racebindings.hpp" #include "types/types.hpp" @@ -58,8 +59,8 @@ namespace MWLua raceT["name"] = sol::readonly_property([](const ESM::Race& rec) -> std::string_view { return rec.mName; }); raceT["description"] = sol::readonly_property([](const ESM::Race& rec) -> std::string_view { return rec.mDescription; }); - raceT["spells"] - = sol::readonly_property([lua](const ESM::Race& rec) -> const ESM::SpellList* { return &rec.mPowers; }); + raceT["spells"] = sol::readonly_property( + [lua](const ESM::Race& rec) -> sol::table { return createReadOnlyRefIdTable(lua, rec.mPowers.mList); }); raceT["skills"] = sol::readonly_property([lua](const ESM::Race& rec) -> sol::table { sol::table res(lua, sol::create); for (const auto& skillBonus : rec.mData.mBonus) |