1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-21 06:09:42 +00:00

Unify the creation of RefId tables

This commit is contained in:
Evil Eye 2024-02-28 17:20:46 +01:00
parent f346295975
commit 0519e1215f
5 changed files with 41 additions and 57 deletions

View file

@ -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);
}

View file

@ -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 {

View file

@ -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 {

View file

@ -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

View file

@ -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)