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:
parent
f346295975
commit
0519e1215f
5 changed files with 41 additions and 57 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
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/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)
|
||||
|
|
Loading…
Reference in a new issue