mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-29 22:20:33 +00:00
Unify the creation of RefId tables
This commit is contained in:
parent
f346295975
commit
0519e1215f
@ -8,6 +8,7 @@
|
|||||||
#include "../mwworld/esmstore.hpp"
|
#include "../mwworld/esmstore.hpp"
|
||||||
|
|
||||||
#include "birthsignbindings.hpp"
|
#include "birthsignbindings.hpp"
|
||||||
|
#include "idcollectionbindings.hpp"
|
||||||
#include "luamanagerimp.hpp"
|
#include "luamanagerimp.hpp"
|
||||||
#include "types/types.hpp"
|
#include "types/types.hpp"
|
||||||
|
|
||||||
@ -47,19 +48,9 @@ namespace MWLua
|
|||||||
signT["texture"] = sol::readonly_property([vfs](const ESM::BirthSign& rec) -> std::string {
|
signT["texture"] = sol::readonly_property([vfs](const ESM::BirthSign& rec) -> std::string {
|
||||||
return Misc::ResourceHelpers::correctTexturePath(rec.mTexture, vfs);
|
return Misc::ResourceHelpers::correctTexturePath(rec.mTexture, vfs);
|
||||||
});
|
});
|
||||||
signT["spells"]
|
signT["spells"] = sol::readonly_property([lua](const ESM::BirthSign& rec) -> sol::table {
|
||||||
= sol::readonly_property([](const ESM::BirthSign& rec) -> const ESM::SpellList* { return &rec.mPowers; });
|
return createReadOnlyRefIdTable(lua, rec.mPowers.mList);
|
||||||
|
});
|
||||||
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>();
|
|
||||||
|
|
||||||
return LuaUtil::makeReadOnly(birthSigns);
|
return LuaUtil::makeReadOnly(birthSigns);
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "../mwworld/esmstore.hpp"
|
#include "../mwworld/esmstore.hpp"
|
||||||
|
|
||||||
#include "classbindings.hpp"
|
#include "classbindings.hpp"
|
||||||
|
#include "idcollectionbindings.hpp"
|
||||||
#include "luamanagerimp.hpp"
|
#include "luamanagerimp.hpp"
|
||||||
#include "stats.hpp"
|
#include "stats.hpp"
|
||||||
#include "types/types.hpp"
|
#include "types/types.hpp"
|
||||||
@ -40,34 +41,15 @@ namespace MWLua
|
|||||||
= sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mDescription; });
|
= 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 {
|
classT["attributes"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table {
|
||||||
sol::table res(lua, sol::create);
|
return createReadOnlyRefIdTable(lua, rec.mData.mAttribute, ESM::Attribute::indexToRefId);
|
||||||
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;
|
|
||||||
});
|
});
|
||||||
classT["majorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table {
|
classT["majorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table {
|
||||||
sol::table res(lua, sol::create);
|
return createReadOnlyRefIdTable(
|
||||||
auto skills = rec.mData.mSkills;
|
lua, rec.mData.mSkills, [](const auto& pair) { return ESM::Skill::indexToRefId(pair[1]); });
|
||||||
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;
|
|
||||||
});
|
});
|
||||||
classT["minorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table {
|
classT["minorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table {
|
||||||
sol::table res(lua, sol::create);
|
return createReadOnlyRefIdTable(
|
||||||
auto skills = rec.mData.mSkills;
|
lua, rec.mData.mSkills, [](const auto& pair) { return ESM::Skill::indexToRefId(pair[0]); });
|
||||||
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;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view {
|
classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view {
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "../mwmechanics/npcstats.hpp"
|
#include "../mwmechanics/npcstats.hpp"
|
||||||
|
|
||||||
|
#include "idcollectionbindings.hpp"
|
||||||
#include "luamanagerimp.hpp"
|
#include "luamanagerimp.hpp"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -96,26 +97,10 @@ namespace MWLua
|
|||||||
return res;
|
return res;
|
||||||
});
|
});
|
||||||
factionT["attributes"] = sol::readonly_property([&lua](const ESM::Faction& rec) {
|
factionT["attributes"] = sol::readonly_property([&lua](const ESM::Faction& rec) {
|
||||||
sol::table res(lua, sol::create);
|
return createReadOnlyRefIdTable(lua, rec.mData.mAttribute, ESM::Attribute::indexToRefId);
|
||||||
for (auto attributeIndex : rec.mData.mAttribute)
|
|
||||||
{
|
|
||||||
ESM::RefId id = ESM::Attribute::indexToRefId(attributeIndex);
|
|
||||||
if (!id.empty())
|
|
||||||
res.add(id.serializeText());
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
});
|
});
|
||||||
factionT["skills"] = sol::readonly_property([&lua](const ESM::Faction& rec) {
|
factionT["skills"] = sol::readonly_property([&lua](const ESM::Faction& rec) {
|
||||||
sol::table res(lua, sol::create);
|
return createReadOnlyRefIdTable(lua, rec.mData.mSkills, ESM::Skill::indexToRefId);
|
||||||
for (auto skillIndex : rec.mData.mSkills)
|
|
||||||
{
|
|
||||||
ESM::RefId id = ESM::Skill::indexToRefId(skillIndex);
|
|
||||||
if (!id.empty())
|
|
||||||
res.add(id.serializeText());
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
});
|
});
|
||||||
auto rankT = lua.new_usertype<FactionRank>("ESM3_FactionRank");
|
auto rankT = lua.new_usertype<FactionRank>("ESM3_FactionRank");
|
||||||
rankT[sol::meta_function::to_string] = [](const FactionRank& rec) -> std::string {
|
rankT[sol::meta_function::to_string] = [](const FactionRank& rec) -> std::string {
|
||||||
|
25
apps/openmw/mwlua/idcollectionbindings.hpp
Normal file
25
apps/openmw/mwlua/idcollectionbindings.hpp
Normal 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
|
@ -6,6 +6,7 @@
|
|||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
#include "../mwworld/esmstore.hpp"
|
#include "../mwworld/esmstore.hpp"
|
||||||
|
|
||||||
|
#include "idcollectionbindings.hpp"
|
||||||
#include "luamanagerimp.hpp"
|
#include "luamanagerimp.hpp"
|
||||||
#include "racebindings.hpp"
|
#include "racebindings.hpp"
|
||||||
#include "types/types.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["name"] = sol::readonly_property([](const ESM::Race& rec) -> std::string_view { return rec.mName; });
|
||||||
raceT["description"]
|
raceT["description"]
|
||||||
= sol::readonly_property([](const ESM::Race& rec) -> std::string_view { return rec.mDescription; });
|
= sol::readonly_property([](const ESM::Race& rec) -> std::string_view { return rec.mDescription; });
|
||||||
raceT["spells"]
|
raceT["spells"] = sol::readonly_property(
|
||||||
= sol::readonly_property([lua](const ESM::Race& rec) -> const ESM::SpellList* { return &rec.mPowers; });
|
[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 {
|
raceT["skills"] = sol::readonly_property([lua](const ESM::Race& rec) -> sol::table {
|
||||||
sol::table res(lua, sol::create);
|
sol::table res(lua, sol::create);
|
||||||
for (const auto& skillBonus : rec.mData.mBonus)
|
for (const auto& skillBonus : rec.mData.mBonus)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user