summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvil Eye <malusluminis@hotmail.com>2024-02-28 17:20:46 +0100
committerEvil Eye <malusluminis@hotmail.com>2024-02-28 17:20:46 +0100
commit0519e1215f608fa82374a220ebefa182f25f05db (patch)
tree66162963cbe1684e781600001e04cb410a040a10
parentf346295975e29c2c6640878e4a048ad4158e385c (diff)
Unify the creation of RefId tables
-rw-r--r--apps/openmw/mwlua/birthsignbindings.cpp17
-rw-r--r--apps/openmw/mwlua/classbindings.cpp30
-rw-r--r--apps/openmw/mwlua/factionbindings.cpp21
-rw-r--r--apps/openmw/mwlua/idcollectionbindings.hpp25
-rw-r--r--apps/openmw/mwlua/racebindings.cpp5
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)