From 611f96ce6545bec790e633f4899c9167a6ee39bc Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Mon, 23 Oct 2023 22:19:16 -0500 Subject: [PATCH 01/26] Add class bindings --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwlua/classbindings.cpp | 106 ++++++++++++++++++++++++++++ apps/openmw/mwlua/classbindings.hpp | 13 ++++ apps/openmw/mwlua/luabindings.cpp | 5 ++ files/lua_api/openmw/core.lua | 16 +++++ 5 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 apps/openmw/mwlua/classbindings.cpp create mode 100644 apps/openmw/mwlua/classbindings.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 57e2b9d708..5394f1ac30 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -64,7 +64,7 @@ add_openmw_dir (mwlua context globalscripts localscripts playerscripts luabindings objectbindings cellbindings mwscriptbindings camerabindings vfsbindings uibindings soundbindings inputbindings nearbybindings postprocessingbindings stats debugbindings types/types types/door types/item types/actor types/container types/lockable types/weapon types/npc types/creature types/player types/activator types/book types/lockpick types/probe types/apparatus types/potion types/ingredient types/misc types/repair types/armor types/light types/static types/clothing types/levelledlist types/terminal - worker magicbindings factionbindings + worker magicbindings factionbindings classbindings ) add_openmw_dir (mwsound diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp new file mode 100644 index 0000000000..5a9b3969d2 --- /dev/null +++ b/apps/openmw/mwlua/classbindings.cpp @@ -0,0 +1,106 @@ +#include "classbindings.hpp" + +#include +#include + +#include "../mwbase/environment.hpp" +#include "../mwworld/class.hpp" +#include "../mwworld/esmstore.hpp" + +#include "luamanagerimp.hpp" + +namespace +{ +} + +namespace sol +{ + template <> + struct is_automagical : std::false_type + { + }; + template <> + struct is_automagical> : std::false_type + { + }; +} + +namespace MWLua +{ + using classStore = MWWorld::Store; + + void initCoreClassBindings(const Context& context) + { + sol::state_view& lua = context.mLua->sol(); + sol::usertype classStoreT = lua.new_usertype("ESM3_classStore"); + classStoreT[sol::meta_function::to_string] = [](const classStore& store) { + return "ESM3_classStore{" + std::to_string(store.getSize()) + " classes}"; + }; + classStoreT[sol::meta_function::length] = [](const classStore& store) { return store.getSize(); }; + classStoreT[sol::meta_function::index] = sol::overload( + [](const classStore& store, size_t index) -> const ESM::Class* { + if (index == 0 || index > store.getSize()) + return nullptr; + return store.at(index - 1); + }, + [](const classStore& store, std::string_view classId) -> const ESM::Class* { + return store.search(ESM::RefId::deserializeText(classId)); + }); + classStoreT[sol::meta_function::pairs] = lua["ipairsForArray"].template get(); + classStoreT[sol::meta_function::ipairs] = lua["ipairsForArray"].template get(); + // class record + auto classT = lua.new_usertype("ESM3_Class"); + classT[sol::meta_function::to_string] + = [](const ESM::Class& rec) -> std::string { return "ESM3_Class[" + rec.mId.toDebugString() + "]"; }; + classT["id"] = sol::readonly_property([](const ESM::Class& rec) { return rec.mId.serializeText(); }); + classT["name"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mName; }); + classT["description"] + = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mDescription; }); + 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; + }); + 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; + }); + 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; + }); + classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { + if (rec.mData.mSpecialization == ESM::Class::Stealth) + return "stealth"; + else if (rec.mData.mSpecialization == ESM::Class::Magic) + return "magic"; + else + return "combat"; + }); + classT["isPlayable"] + = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); + } +} diff --git a/apps/openmw/mwlua/classbindings.hpp b/apps/openmw/mwlua/classbindings.hpp new file mode 100644 index 0000000000..c907e5ea94 --- /dev/null +++ b/apps/openmw/mwlua/classbindings.hpp @@ -0,0 +1,13 @@ +#ifndef MWLUA_CLASSBINDINGS_H +#define MWLUA_CLASSBINDINGS_H + +#include + +#include "context.hpp" + +namespace MWLua +{ + void initCoreClassBindings(const Context& context); +} + +#endif // MWLUA_CLASSBINDINGS_H diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index a50459502b..f506ecbc80 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #include "camerabindings.hpp" #include "cellbindings.hpp" +#include "classbindings.hpp" #include "debugbindings.hpp" #include "factionbindings.hpp" #include "inputbindings.hpp" @@ -159,6 +161,9 @@ namespace MWLua initCoreFactionBindings(context); api["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); + initCoreClassBindings(context); + api["class"] = &MWBase::Environment::get().getWorld()->getStore().get(); + api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore = &MWBase::Environment::get().getESMStore()->get(); diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 2c815d6dfc..304f0642f2 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -14,6 +14,10 @@ -- A read-only list of all @{#FactionRecord}s in the world database. -- @field [parent=#core] #list<#FactionRecord> factions +--- +-- A read-only list of all @{#ClassRecord}s in the world database. +-- @field [parent=#core] #list<#ClassRecord> class + --- -- Terminates the game and quits to the OS. Should be used only for testing purposes. -- @function [parent=#core] quit @@ -868,6 +872,18 @@ -- @field #string failureSound VFS path to the failure sound -- @field #string hitSound VFS path to the hit sound +--- +-- Class data record +-- @type ClassRecord +-- @field #string id Class id +-- @field #string name Class name +-- @field #list<#string> attributes A read-only list containing the specialized attributes of the class. +-- @field #list<#string> majorSkills A read-only list containing the major skills of the class. +-- @field #list<#string> minorSkills A read-only list containing the minor skills of the class. +-- @field #string description Class description +-- @field #string specialization Class specialization. Either combat, magic, or stealth. + + --- -- Faction data record -- @type FactionRecord From 254bf7c5d8f200b841c3ed8b1f6ac8ce7149d2d5 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Mon, 23 Oct 2023 22:23:30 -0500 Subject: [PATCH 02/26] class -> classes --- apps/openmw/mwlua/luabindings.cpp | 2 +- files/lua_api/openmw/core.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index f506ecbc80..86ce4083df 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -162,7 +162,7 @@ namespace MWLua api["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); initCoreClassBindings(context); - api["class"] = &MWBase::Environment::get().getWorld()->getStore().get(); + api["classes"] = &MWBase::Environment::get().getWorld()->getStore().get(); api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 304f0642f2..68e614d864 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -16,7 +16,7 @@ --- -- A read-only list of all @{#ClassRecord}s in the world database. --- @field [parent=#core] #list<#ClassRecord> class +-- @field [parent=#core] #list<#ClassRecord> classes --- -- Terminates the game and quits to the OS. Should be used only for testing purposes. From bd90ac2ed87b391934cb33cfa634b40375c11806 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Mon, 23 Oct 2023 23:02:01 -0500 Subject: [PATCH 03/26] Add missing field in docs --- files/lua_api/openmw/core.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 68e614d864..19bbb2a750 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -881,6 +881,7 @@ -- @field #list<#string> majorSkills A read-only list containing the major skills of the class. -- @field #list<#string> minorSkills A read-only list containing the minor skills of the class. -- @field #string description Class description +-- @field #boolean isPlayable True if the player can play as this class -- @field #string specialization Class specialization. Either combat, magic, or stealth. From 15bee21286a852248c1ef0148c9040c379be2539 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 24 Oct 2023 09:30:00 -0500 Subject: [PATCH 04/26] Fix caps --- apps/openmw/mwlua/classbindings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 5a9b3969d2..8eb11a9056 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -32,9 +32,9 @@ namespace MWLua void initCoreClassBindings(const Context& context) { sol::state_view& lua = context.mLua->sol(); - sol::usertype classStoreT = lua.new_usertype("ESM3_classStore"); + sol::usertype classStoreT = lua.new_usertype("ESM3_ClassStore"); classStoreT[sol::meta_function::to_string] = [](const classStore& store) { - return "ESM3_classStore{" + std::to_string(store.getSize()) + " classes}"; + return "ESM3_ClassStore{" + std::to_string(store.getSize()) + " classes}"; }; classStoreT[sol::meta_function::length] = [](const classStore& store) { return store.getSize(); }; classStoreT[sol::meta_function::index] = sol::overload( From f0640da21eac87cc196af0b5dc0cda5ef2a99be2 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Wed, 25 Oct 2023 21:05:14 -0500 Subject: [PATCH 05/26] Add character to core --- apps/openmw/mwlua/luabindings.cpp | 7 ++++--- files/lua_api/openmw/core.lua | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index 86ce4083df..448a57da61 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -158,12 +158,13 @@ namespace MWLua api["magic"] = initCoreMagicBindings(context); api["stats"] = initCoreStatsBindings(context); + sol::table character(lua->sol(), sol::create); initCoreFactionBindings(context); - api["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); + character["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); initCoreClassBindings(context); - api["classes"] = &MWBase::Environment::get().getWorld()->getStore().get(); - + character["classes"] = &MWBase::Environment::get().getWorld()->getStore().get(); + api["character"] = character; api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore = &MWBase::Environment::get().getESMStore()->get(); diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 19bbb2a750..05daf424c8 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -14,9 +14,12 @@ -- A read-only list of all @{#FactionRecord}s in the world database. -- @field [parent=#core] #list<#FactionRecord> factions +--- @{#Character}: Class and Character Data +-- @field [parent=#core] #Character character + --- -- A read-only list of all @{#ClassRecord}s in the world database. --- @field [parent=#core] #list<#ClassRecord> classes +-- @field [parent=#Character] #list<#ClassRecord> classes --- -- Terminates the game and quits to the OS. Should be used only for testing purposes. From 2f16a104dce2c23a8e6b34f929e1d9bef062e34e Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Wed, 25 Oct 2023 21:38:42 -0500 Subject: [PATCH 06/26] Revise record store, add specialization function --- apps/openmw/mwlua/classbindings.cpp | 35 +++++++---------------------- apps/openmw/mwlua/classbindings.hpp | 2 +- apps/openmw/mwlua/luabindings.cpp | 3 +-- apps/openmw/mwlua/stats.cpp | 12 ++++++++++ apps/openmw/mwlua/stats.hpp | 2 +- files/lua_api/openmw/core.lua | 8 +++++-- 6 files changed, 29 insertions(+), 33 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 8eb11a9056..237aaae291 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -1,5 +1,6 @@ #include "classbindings.hpp" - +#include "stats.hpp" +#include "types/types.hpp" #include #include @@ -27,27 +28,12 @@ namespace sol namespace MWLua { - using classStore = MWWorld::Store; - void initCoreClassBindings(const Context& context) + sol::table initCoreClassBindings(const Context& context) { sol::state_view& lua = context.mLua->sol(); - sol::usertype classStoreT = lua.new_usertype("ESM3_ClassStore"); - classStoreT[sol::meta_function::to_string] = [](const classStore& store) { - return "ESM3_ClassStore{" + std::to_string(store.getSize()) + " classes}"; - }; - classStoreT[sol::meta_function::length] = [](const classStore& store) { return store.getSize(); }; - classStoreT[sol::meta_function::index] = sol::overload( - [](const classStore& store, size_t index) -> const ESM::Class* { - if (index == 0 || index > store.getSize()) - return nullptr; - return store.at(index - 1); - }, - [](const classStore& store, std::string_view classId) -> const ESM::Class* { - return store.search(ESM::RefId::deserializeText(classId)); - }); - classStoreT[sol::meta_function::pairs] = lua["ipairsForArray"].template get(); - classStoreT[sol::meta_function::ipairs] = lua["ipairsForArray"].template get(); + sol::table classes(context.mLua->sol(), sol::create); + addRecordFunctionBinding(classes, context); // class record auto classT = lua.new_usertype("ESM3_Class"); classT[sol::meta_function::to_string] @@ -92,15 +78,10 @@ namespace MWLua return res; }); - classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { - if (rec.mData.mSpecialization == ESM::Class::Stealth) - return "stealth"; - else if (rec.mData.mSpecialization == ESM::Class::Magic) - return "magic"; - else - return "combat"; - }); + classT["specialization"] = sol::readonly_property( + [](const ESM::Class& rec) -> std::string_view { return getSpecialization(rec.mData.mSpecialization); }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); + return classes; } } diff --git a/apps/openmw/mwlua/classbindings.hpp b/apps/openmw/mwlua/classbindings.hpp index c907e5ea94..9dd9befae4 100644 --- a/apps/openmw/mwlua/classbindings.hpp +++ b/apps/openmw/mwlua/classbindings.hpp @@ -7,7 +7,7 @@ namespace MWLua { - void initCoreClassBindings(const Context& context); + sol::table initCoreClassBindings(const Context& context); } #endif // MWLUA_CLASSBINDINGS_H diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index 448a57da61..b55bf3ca27 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -162,8 +162,7 @@ namespace MWLua initCoreFactionBindings(context); character["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); - initCoreClassBindings(context); - character["classes"] = &MWBase::Environment::get().getWorld()->getStore().get(); + character["classes"] = initCoreClassBindings(context); api["character"] = character; api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index 5c1e536dd6..1cc1902c49 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -60,6 +60,16 @@ namespace namespace MWLua { + std::string_view getSpecialization(const int var) + { + if (var == ESM::Class::Stealth) + return "stealth"; + else if (var == ESM::Class::Magic) + return "magic"; + else + return "combat"; + } + static void addStatUpdateAction(MWLua::LuaManager* manager, const SelfObject& obj) { if (!obj.mStatsCache.empty()) @@ -446,6 +456,8 @@ namespace MWLua skillT["name"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mName; }); skillT["description"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mDescription; }); + skillT["specialization"] = sol::readonly_property( + [](const ESM::Skill& rec) -> std::string_view { return getSpecialization(rec.mData.mSpecialization); }); skillT["icon"] = sol::readonly_property([vfs](const ESM::Skill& rec) -> std::string { return Misc::ResourceHelpers::correctIconPath(rec.mIcon, vfs); }); diff --git a/apps/openmw/mwlua/stats.hpp b/apps/openmw/mwlua/stats.hpp index 4ce2f6b5eb..6cbf486c7b 100644 --- a/apps/openmw/mwlua/stats.hpp +++ b/apps/openmw/mwlua/stats.hpp @@ -6,7 +6,7 @@ namespace MWLua { struct Context; - + std::string_view getSpecialization(const int val); void addActorStatsBindings(sol::table& actor, const Context& context); void addNpcStatsBindings(sol::table& npc, const Context& context); sol::table initCoreStatsBindings(const Context& context); diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 280d5f07bd..c1d9be3169 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -12,14 +12,18 @@ --- -- A read-only list of all @{#FactionRecord}s in the world database. --- @field [parent=#core] #list<#FactionRecord> factions +-- @field [parent=#Character] #list<#FactionRecord> factions --- @{#Character}: Class and Character Data -- @field [parent=#core] #Character character + +--- @{#Classes}: Class Data +-- @field [parent=#Character] #Classes classes + --- -- A read-only list of all @{#ClassRecord}s in the world database. --- @field [parent=#Character] #list<#ClassRecord> classes +-- @field [parent=#Classes] #list<#ClassRecord> records --- -- Terminates the game and quits to the OS. Should be used only for testing purposes. From c2943e2fd0bfbb87b38941abe966166c6969fb5b Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Wed, 25 Oct 2023 21:47:00 -0500 Subject: [PATCH 07/26] Use int32_t --- apps/openmw/mwlua/stats.cpp | 8 ++++---- apps/openmw/mwlua/stats.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index 1cc1902c49..c4440c954c 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -60,16 +60,16 @@ namespace namespace MWLua { - std::string_view getSpecialization(const int var) + std::string_view getSpecialization(const int32_t val) { - if (var == ESM::Class::Stealth) + if (val == ESM::Class::Stealth) return "stealth"; - else if (var == ESM::Class::Magic) + else if (val == ESM::Class::Magic) return "magic"; else return "combat"; } - + static void addStatUpdateAction(MWLua::LuaManager* manager, const SelfObject& obj) { if (!obj.mStatsCache.empty()) diff --git a/apps/openmw/mwlua/stats.hpp b/apps/openmw/mwlua/stats.hpp index 6cbf486c7b..35031ff95f 100644 --- a/apps/openmw/mwlua/stats.hpp +++ b/apps/openmw/mwlua/stats.hpp @@ -6,7 +6,7 @@ namespace MWLua { struct Context; - std::string_view getSpecialization(const int val); + std::string_view getSpecialization(const int32_t val); void addActorStatsBindings(sol::table& actor, const Context& context); void addNpcStatsBindings(sol::table& npc, const Context& context); sol::table initCoreStatsBindings(const Context& context); From 482d174ef288613a8380ff9f354208e5be4d18dc Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Wed, 1 Nov 2023 13:21:14 -0500 Subject: [PATCH 08/26] Read only, add skill spec to docs --- apps/openmw/mwlua/luabindings.cpp | 2 +- files/lua_api/openmw/core.lua | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index b55bf3ca27..1731b4dd70 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -163,7 +163,7 @@ namespace MWLua character["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); character["classes"] = initCoreClassBindings(context); - api["character"] = character; + api["character"] = LuaUtil::makeReadOnly(character);; api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore = &MWBase::Environment::get().getESMStore()->get(); diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index c1d9be3169..a86cd6590e 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -872,6 +872,7 @@ -- @field #string name Human-readable name -- @field #string description Human-readable description -- @field #string icon VFS path to the icon +-- @field #string specialization Skill specialization. Either combat, magic, or stealth. -- @field #MagicSchoolData school Optional magic school -- @type MagicSchoolData From 67e74936ff3ff0ac1b56df32975206dcdd0d8762 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Wed, 1 Nov 2023 13:23:32 -0500 Subject: [PATCH 09/26] Make classes Read Only --- apps/openmw/mwlua/classbindings.cpp | 2 +- apps/openmw/mwlua/luabindings.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 237aaae291..d0f5767226 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -82,6 +82,6 @@ namespace MWLua [](const ESM::Class& rec) -> std::string_view { return getSpecialization(rec.mData.mSpecialization); }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); - return classes; + return LuaUtil::makeReadOnly(classes); } } diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index 1731b4dd70..782cc07c46 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -163,7 +163,7 @@ namespace MWLua character["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); character["classes"] = initCoreClassBindings(context); - api["character"] = LuaUtil::makeReadOnly(character);; + api["character"] = LuaUtil::makeReadOnly(character); api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore = &MWBase::Environment::get().getESMStore()->get(); From dbd7d341207be95d3371fd3650cb196d851d5b42 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Wed, 1 Nov 2023 13:27:37 -0500 Subject: [PATCH 10/26] Add class Record --- files/lua_api/openmw/core.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index a86cd6590e..98046ac7c0 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -25,6 +25,12 @@ -- A read-only list of all @{#ClassRecord}s in the world database. -- @field [parent=#Classes] #list<#ClassRecord> records +--- +-- Returns a read-only @{#ClassRecord} +-- @function [parent=#Classes] record +-- @param #string recordId +-- @return #ClassRecord + --- -- Terminates the game and quits to the OS. Should be used only for testing purposes. -- @function [parent=#core] quit From e54eba70431db9231510f99e7bd62570f5ed1ab8 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 2 Nov 2023 12:08:07 -0500 Subject: [PATCH 11/26] Formatting fixes --- apps/openmw/mwlua/classbindings.cpp | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index d0f5767226..67831b859f 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -1,19 +1,15 @@ -#include "classbindings.hpp" -#include "stats.hpp" -#include "types/types.hpp" #include #include +#include "classbindings.hpp" +#include "luamanagerimp.hpp" +#include "stats.hpp" +#include "types/types.hpp" + #include "../mwbase/environment.hpp" #include "../mwworld/class.hpp" #include "../mwworld/esmstore.hpp" -#include "luamanagerimp.hpp" - -namespace -{ -} - namespace sol { template <> @@ -45,37 +41,31 @@ namespace MWLua 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; }); 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; }); 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; }); classT["specialization"] = sol::readonly_property( From 685c02bd73a5fb3dad6a47d16efd8f3c3bc5da85 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 2 Nov 2023 12:10:52 -0500 Subject: [PATCH 12/26] Re-add missing line --- apps/openmw/mwlua/stats.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/openmw/mwlua/stats.hpp b/apps/openmw/mwlua/stats.hpp index 35031ff95f..d265948113 100644 --- a/apps/openmw/mwlua/stats.hpp +++ b/apps/openmw/mwlua/stats.hpp @@ -6,6 +6,7 @@ namespace MWLua { struct Context; + std::string_view getSpecialization(const int32_t val); void addActorStatsBindings(sol::table& actor, const Context& context); void addNpcStatsBindings(sol::table& npc, const Context& context); From 3c0c699e42008514434ba7fa4069fdeb41e3fa64 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 2 Nov 2023 12:15:48 -0500 Subject: [PATCH 13/26] Do not use const --- apps/openmw/mwlua/stats.cpp | 2 +- apps/openmw/mwlua/stats.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index c4440c954c..ad8de5df10 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -60,7 +60,7 @@ namespace namespace MWLua { - std::string_view getSpecialization(const int32_t val) + std::string_view getSpecialization(int32_t val) { if (val == ESM::Class::Stealth) return "stealth"; diff --git a/apps/openmw/mwlua/stats.hpp b/apps/openmw/mwlua/stats.hpp index d265948113..adff27654d 100644 --- a/apps/openmw/mwlua/stats.hpp +++ b/apps/openmw/mwlua/stats.hpp @@ -7,7 +7,7 @@ namespace MWLua { struct Context; - std::string_view getSpecialization(const int32_t val); + std::string_view getSpecialization(int32_t val); void addActorStatsBindings(sol::table& actor, const Context& context); void addNpcStatsBindings(sol::table& npc, const Context& context); sol::table initCoreStatsBindings(const Context& context); From 25fe42de10a7c77bb48827f2f20356ff7cce8bda Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 2 Nov 2023 12:17:55 -0500 Subject: [PATCH 14/26] Spacing --- apps/openmw/mwlua/classbindings.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 67831b859f..fd17013326 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -30,6 +30,7 @@ namespace MWLua sol::state_view& lua = context.mLua->sol(); sol::table classes(context.mLua->sol(), sol::create); addRecordFunctionBinding(classes, context); + // class record auto classT = lua.new_usertype("ESM3_Class"); classT[sol::meta_function::to_string] @@ -38,6 +39,7 @@ namespace MWLua classT["name"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mName; }); classT["description"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mDescription; }); + classT["majorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table { sol::table res(lua, sol::create); auto skills = rec.mData.mSkills; @@ -68,6 +70,7 @@ namespace MWLua } return res; }); + classT["specialization"] = sol::readonly_property( [](const ESM::Class& rec) -> std::string_view { return getSpecialization(rec.mData.mSpecialization); }); classT["isPlayable"] From 859b6c823fb27655227bce1c26b27b15a4e0ae12 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 2 Nov 2023 12:21:59 -0500 Subject: [PATCH 15/26] Fix includes --- apps/openmw/mwlua/classbindings.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index fd17013326..1e75bb674d 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -1,15 +1,15 @@ #include #include +#include "../mwbase/environment.hpp" +#include "../mwworld/class.hpp" +#include "../mwworld/esmstore.hpp" + #include "classbindings.hpp" #include "luamanagerimp.hpp" #include "stats.hpp" #include "types/types.hpp" -#include "../mwbase/environment.hpp" -#include "../mwworld/class.hpp" -#include "../mwworld/esmstore.hpp" - namespace sol { template <> From c311caef9ab7cfe14da7bb9a02fd5498bfa6418a Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 3 Nov 2023 17:19:53 -0500 Subject: [PATCH 16/26] Redo specialization field --- apps/openmw/mwlua/classbindings.cpp | 5 +++-- apps/openmw/mwlua/stats.cpp | 15 +++------------ components/esm3/loadclas.cpp | 1 + components/esm3/loadclas.hpp | 2 +- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 1e75bb674d..e506916337 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -71,8 +71,9 @@ namespace MWLua return res; }); - classT["specialization"] = sol::readonly_property( - [](const ESM::Class& rec) -> std::string_view { return getSpecialization(rec.mData.mSpecialization); }); + classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { + return ESM::Class::indexToLuaId[rec.mData.mSpecialization]; + }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); return LuaUtil::makeReadOnly(classes); diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index ad8de5df10..0311ccaab8 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -60,16 +60,6 @@ namespace namespace MWLua { - std::string_view getSpecialization(int32_t val) - { - if (val == ESM::Class::Stealth) - return "stealth"; - else if (val == ESM::Class::Magic) - return "magic"; - else - return "combat"; - } - static void addStatUpdateAction(MWLua::LuaManager* manager, const SelfObject& obj) { if (!obj.mStatsCache.empty()) @@ -456,8 +446,9 @@ namespace MWLua skillT["name"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mName; }); skillT["description"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mDescription; }); - skillT["specialization"] = sol::readonly_property( - [](const ESM::Skill& rec) -> std::string_view { return getSpecialization(rec.mData.mSpecialization); }); + skillT["specialization"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { + return ESM::Class::indexToLuaId[rec.mData.mSpecialization]; + }); skillT["icon"] = sol::readonly_property([vfs](const ESM::Skill& rec) -> std::string { return Misc::ResourceHelpers::correctIconPath(rec.mIcon, vfs); }); diff --git a/components/esm3/loadclas.cpp b/components/esm3/loadclas.cpp index 0c58f1d45a..2dd605c7c6 100644 --- a/components/esm3/loadclas.cpp +++ b/components/esm3/loadclas.cpp @@ -10,6 +10,7 @@ namespace ESM { const std::string_view Class::sGmstSpecializationIds[3] = { "sSpecializationCombat", "sSpecializationMagic", "sSpecializationStealth" }; + const std::string_view Class::indexToLuaId[3] = { "combat", "magic", "stealth" }; int32_t& Class::CLDTstruct::getSkill(int index, bool major) { diff --git a/components/esm3/loadclas.hpp b/components/esm3/loadclas.hpp index 47b8b73b7e..f4bf60bc11 100644 --- a/components/esm3/loadclas.hpp +++ b/components/esm3/loadclas.hpp @@ -30,8 +30,8 @@ namespace ESM Magic = 1, Stealth = 2 }; - static const std::string_view sGmstSpecializationIds[3]; + static const std::string_view indexToLuaId[3]; struct CLDTstruct { From 76f872aaa272536320f4fcb5ad90b65ba9859d7e Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 7 Nov 2023 11:40:43 -0600 Subject: [PATCH 17/26] use std:;array --- apps/openmw/mwlua/classbindings.cpp | 2 +- apps/openmw/mwlua/stats.cpp | 2 +- components/esm3/loadclas.cpp | 2 +- components/esm3/loadclas.hpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index e506916337..d62e5bca4d 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -72,7 +72,7 @@ namespace MWLua }); classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { - return ESM::Class::indexToLuaId[rec.mData.mSpecialization]; + return ESM::Class::indexToLuaId.at(rec.mData.mSpecialization + 10); }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index 0311ccaab8..e2ea04e95f 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -447,7 +447,7 @@ namespace MWLua skillT["description"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mDescription; }); skillT["specialization"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { - return ESM::Class::indexToLuaId[rec.mData.mSpecialization]; + return ESM::Class::indexToLuaId.at(rec.mData.mSpecialization); }); skillT["icon"] = sol::readonly_property([vfs](const ESM::Skill& rec) -> std::string { return Misc::ResourceHelpers::correctIconPath(rec.mIcon, vfs); diff --git a/components/esm3/loadclas.cpp b/components/esm3/loadclas.cpp index 2dd605c7c6..dcfeb958c1 100644 --- a/components/esm3/loadclas.cpp +++ b/components/esm3/loadclas.cpp @@ -10,7 +10,7 @@ namespace ESM { const std::string_view Class::sGmstSpecializationIds[3] = { "sSpecializationCombat", "sSpecializationMagic", "sSpecializationStealth" }; - const std::string_view Class::indexToLuaId[3] = { "combat", "magic", "stealth" }; + const std::array Class::indexToLuaId = { "combat", "magic", "stealth" }; int32_t& Class::CLDTstruct::getSkill(int index, bool major) { diff --git a/components/esm3/loadclas.hpp b/components/esm3/loadclas.hpp index f4bf60bc11..e1c9b851ee 100644 --- a/components/esm3/loadclas.hpp +++ b/components/esm3/loadclas.hpp @@ -31,7 +31,7 @@ namespace ESM Stealth = 2 }; static const std::string_view sGmstSpecializationIds[3]; - static const std::string_view indexToLuaId[3]; + static const std::array indexToLuaId; struct CLDTstruct { From 81da58478dedb2d7abdbcbaada49ebc6da66191c Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 7 Nov 2023 11:41:14 -0600 Subject: [PATCH 18/26] Remove test use --- apps/openmw/mwlua/classbindings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index d62e5bca4d..24a8e7e2eb 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -72,7 +72,7 @@ namespace MWLua }); classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { - return ESM::Class::indexToLuaId.at(rec.mData.mSpecialization + 10); + return ESM::Class::indexToLuaId.at(rec.mData.mSpecialization); }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); From ae4eafdfd49ee03fb1d347fab83ba19da3f48c4d Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 7 Nov 2023 11:50:09 -0600 Subject: [PATCH 19/26] Move classes to types.NPC --- apps/openmw/mwlua/luabindings.cpp | 6 +----- apps/openmw/mwlua/types/npc.cpp | 4 ++++ files/lua_api/openmw/core.lua | 32 +------------------------------ files/lua_api/openmw/types.lua | 29 ++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index 782cc07c46..db3057f982 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -37,7 +37,6 @@ #include "camerabindings.hpp" #include "cellbindings.hpp" -#include "classbindings.hpp" #include "debugbindings.hpp" #include "factionbindings.hpp" #include "inputbindings.hpp" @@ -158,12 +157,9 @@ namespace MWLua api["magic"] = initCoreMagicBindings(context); api["stats"] = initCoreStatsBindings(context); - sol::table character(lua->sol(), sol::create); initCoreFactionBindings(context); - character["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); + api["factions"] = &MWBase::Environment::get().getWorld()->getStore().get(); - character["classes"] = initCoreClassBindings(context); - api["character"] = LuaUtil::makeReadOnly(character); api["l10n"] = LuaUtil::initL10nLoader(lua->sol(), MWBase::Environment::get().getL10nManager()); const MWWorld::Store* gmstStore = &MWBase::Environment::get().getESMStore()->get(); diff --git a/apps/openmw/mwlua/types/npc.cpp b/apps/openmw/mwlua/types/npc.cpp index 25997b6468..823cf59613 100644 --- a/apps/openmw/mwlua/types/npc.cpp +++ b/apps/openmw/mwlua/types/npc.cpp @@ -12,6 +12,7 @@ #include #include +#include "../classbindings.hpp" #include "../localscripts.hpp" #include "../stats.hpp" @@ -81,6 +82,9 @@ namespace MWLua record["baseGold"] = sol::readonly_property([](const ESM::NPC& rec) -> int { return rec.mNpdt.mGold; }); addActorServicesBindings(record, context); + sol::table character(lua, sol::create); + character["classes"] = initCoreClassBindings(context); + npc["character"] = LuaUtil::makeReadOnly(character); // This function is game-specific, in future we should replace it with something more universal. npc["isWerewolf"] = [](const Object& o) { const MWWorld::Class& cls = o.ptr().getClass(); diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 98046ac7c0..441136805b 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -12,24 +12,7 @@ --- -- A read-only list of all @{#FactionRecord}s in the world database. --- @field [parent=#Character] #list<#FactionRecord> factions - ---- @{#Character}: Class and Character Data --- @field [parent=#core] #Character character - - ---- @{#Classes}: Class Data --- @field [parent=#Character] #Classes classes - ---- --- A read-only list of all @{#ClassRecord}s in the world database. --- @field [parent=#Classes] #list<#ClassRecord> records - ---- --- Returns a read-only @{#ClassRecord} --- @function [parent=#Classes] record --- @param #string recordId --- @return #ClassRecord +-- @field [parent=#core] #list<#FactionRecord> factions --- -- Terminates the game and quits to the OS. Should be used only for testing purposes. @@ -889,19 +872,6 @@ -- @field #string failureSound VFS path to the failure sound -- @field #string hitSound VFS path to the hit sound ---- --- Class data record --- @type ClassRecord --- @field #string id Class id --- @field #string name Class name --- @field #list<#string> attributes A read-only list containing the specialized attributes of the class. --- @field #list<#string> majorSkills A read-only list containing the major skills of the class. --- @field #list<#string> minorSkills A read-only list containing the minor skills of the class. --- @field #string description Class description --- @field #boolean isPlayable True if the player can play as this class --- @field #string specialization Class specialization. Either combat, magic, or stealth. - - --- -- Faction data record -- @type FactionRecord diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index 69ce5fbaf2..b300351df3 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -872,6 +872,35 @@ -- @param openmw.core#GameObject actor -- @return #number +--- @{#Character}: Class and Character Data +-- @field [parent=#NPC] #Character character + + +--- @{#Classes}: Class Data +-- @field [parent=#Character] #Classes classes + +--- +-- A read-only list of all @{#ClassRecord}s in the world database. +-- @field [parent=#Classes] #list<#ClassRecord> records + +--- +-- Returns a read-only @{#ClassRecord} +-- @function [parent=#Classes] record +-- @param #string recordId +-- @return #ClassRecord + +--- +-- Class data record +-- @type ClassRecord +-- @field #string id Class id +-- @field #string name Class name +-- @field #list<#string> attributes A read-only list containing the specialized attributes of the class. +-- @field #list<#string> majorSkills A read-only list containing the major skills of the class. +-- @field #list<#string> minorSkills A read-only list containing the minor skills of the class. +-- @field #string description Class description +-- @field #boolean isPlayable True if the player can play as this class +-- @field #string specialization Class specialization. Either combat, magic, or stealth. + --- -- Whether the NPC or player is in the werewolf form at the moment. -- @function [parent=#NPC] isWerewolf From cb705ff02a34ca46a27dd2009a8d6f460f654bbb Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 7 Nov 2023 11:52:53 -0600 Subject: [PATCH 20/26] Revert redundant changes --- apps/openmw/mwlua/luabindings.cpp | 1 - apps/openmw/mwlua/stats.hpp | 1 - components/esm3/loadclas.hpp | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index db3057f982..a50459502b 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include diff --git a/apps/openmw/mwlua/stats.hpp b/apps/openmw/mwlua/stats.hpp index adff27654d..4ce2f6b5eb 100644 --- a/apps/openmw/mwlua/stats.hpp +++ b/apps/openmw/mwlua/stats.hpp @@ -7,7 +7,6 @@ namespace MWLua { struct Context; - std::string_view getSpecialization(int32_t val); void addActorStatsBindings(sol::table& actor, const Context& context); void addNpcStatsBindings(sol::table& npc, const Context& context); sol::table initCoreStatsBindings(const Context& context); diff --git a/components/esm3/loadclas.hpp b/components/esm3/loadclas.hpp index e1c9b851ee..00bdbb9845 100644 --- a/components/esm3/loadclas.hpp +++ b/components/esm3/loadclas.hpp @@ -30,6 +30,7 @@ namespace ESM Magic = 1, Stealth = 2 }; + static const std::string_view sGmstSpecializationIds[3]; static const std::array indexToLuaId; From ec81bd7f1bd5e211e009130477efb7acd52427cd Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 7 Nov 2023 12:01:54 -0600 Subject: [PATCH 21/26] rename specilizationIndexToLuaId --- apps/openmw/mwlua/classbindings.cpp | 2 +- apps/openmw/mwlua/stats.cpp | 2 +- components/esm3/loadclas.cpp | 2 +- components/esm3/loadclas.hpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 24a8e7e2eb..8b277b41fe 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -72,7 +72,7 @@ namespace MWLua }); classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { - return ESM::Class::indexToLuaId.at(rec.mData.mSpecialization); + return ESM::Class::specilizationIndexToLuaId.at(rec.mData.mSpecialization); }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index e2ea04e95f..ac94e29f99 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -447,7 +447,7 @@ namespace MWLua skillT["description"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mDescription; }); skillT["specialization"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { - return ESM::Class::indexToLuaId.at(rec.mData.mSpecialization); + return ESM::Class::specilizationIndexToLuaId.at(rec.mData.mSpecialization); }); skillT["icon"] = sol::readonly_property([vfs](const ESM::Skill& rec) -> std::string { return Misc::ResourceHelpers::correctIconPath(rec.mIcon, vfs); diff --git a/components/esm3/loadclas.cpp b/components/esm3/loadclas.cpp index dcfeb958c1..01bf6f54f6 100644 --- a/components/esm3/loadclas.cpp +++ b/components/esm3/loadclas.cpp @@ -10,7 +10,7 @@ namespace ESM { const std::string_view Class::sGmstSpecializationIds[3] = { "sSpecializationCombat", "sSpecializationMagic", "sSpecializationStealth" }; - const std::array Class::indexToLuaId = { "combat", "magic", "stealth" }; + const std::array Class::specilizationIndexToLuaId = { "combat", "magic", "stealth" }; int32_t& Class::CLDTstruct::getSkill(int index, bool major) { diff --git a/components/esm3/loadclas.hpp b/components/esm3/loadclas.hpp index 00bdbb9845..2070f2127a 100644 --- a/components/esm3/loadclas.hpp +++ b/components/esm3/loadclas.hpp @@ -30,9 +30,9 @@ namespace ESM Magic = 1, Stealth = 2 }; - + static const std::string_view sGmstSpecializationIds[3]; - static const std::array indexToLuaId; + static const std::array specilizationIndexToLuaId; struct CLDTstruct { From a2b47f44d2062ccc307b92b39fa980eb733710e1 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 16 Nov 2023 07:36:40 -0600 Subject: [PATCH 22/26] Fix misspelling --- apps/openmw/mwlua/classbindings.cpp | 2 +- apps/openmw/mwlua/stats.cpp | 2 +- components/esm3/loadclas.cpp | 2 +- components/esm3/loadclas.hpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index 8b277b41fe..f8290a263d 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -72,7 +72,7 @@ namespace MWLua }); classT["specialization"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { - return ESM::Class::specilizationIndexToLuaId.at(rec.mData.mSpecialization); + return ESM::Class::specializationIndexToLuaId.at(rec.mData.mSpecialization); }); classT["isPlayable"] = sol::readonly_property([](const ESM::Class& rec) -> bool { return rec.mData.mIsPlayable; }); diff --git a/apps/openmw/mwlua/stats.cpp b/apps/openmw/mwlua/stats.cpp index ac94e29f99..7e8cbb1b5e 100644 --- a/apps/openmw/mwlua/stats.cpp +++ b/apps/openmw/mwlua/stats.cpp @@ -447,7 +447,7 @@ namespace MWLua skillT["description"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { return rec.mDescription; }); skillT["specialization"] = sol::readonly_property([](const ESM::Skill& rec) -> std::string_view { - return ESM::Class::specilizationIndexToLuaId.at(rec.mData.mSpecialization); + return ESM::Class::specializationIndexToLuaId.at(rec.mData.mSpecialization); }); skillT["icon"] = sol::readonly_property([vfs](const ESM::Skill& rec) -> std::string { return Misc::ResourceHelpers::correctIconPath(rec.mIcon, vfs); diff --git a/components/esm3/loadclas.cpp b/components/esm3/loadclas.cpp index 01bf6f54f6..ec4ff680fa 100644 --- a/components/esm3/loadclas.cpp +++ b/components/esm3/loadclas.cpp @@ -10,7 +10,7 @@ namespace ESM { const std::string_view Class::sGmstSpecializationIds[3] = { "sSpecializationCombat", "sSpecializationMagic", "sSpecializationStealth" }; - const std::array Class::specilizationIndexToLuaId = { "combat", "magic", "stealth" }; + const std::array Class::specializationIndexToLuaId = { "combat", "magic", "stealth" }; int32_t& Class::CLDTstruct::getSkill(int index, bool major) { diff --git a/components/esm3/loadclas.hpp b/components/esm3/loadclas.hpp index 2070f2127a..a804a8da8e 100644 --- a/components/esm3/loadclas.hpp +++ b/components/esm3/loadclas.hpp @@ -32,7 +32,7 @@ namespace ESM }; static const std::string_view sGmstSpecializationIds[3]; - static const std::array specilizationIndexToLuaId; + static const std::array specializationIndexToLuaId; struct CLDTstruct { From 16f178b80ed8b6b66c1e6f76fdd783fb98b58a98 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 16 Nov 2023 07:43:45 -0600 Subject: [PATCH 23/26] Remove character --- apps/openmw/mwlua/types/npc.cpp | 5 ++--- files/lua_api/openmw/types.lua | 6 +----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwlua/types/npc.cpp b/apps/openmw/mwlua/types/npc.cpp index 823cf59613..55bb59afc0 100644 --- a/apps/openmw/mwlua/types/npc.cpp +++ b/apps/openmw/mwlua/types/npc.cpp @@ -82,9 +82,8 @@ namespace MWLua record["baseGold"] = sol::readonly_property([](const ESM::NPC& rec) -> int { return rec.mNpdt.mGold; }); addActorServicesBindings(record, context); - sol::table character(lua, sol::create); - character["classes"] = initCoreClassBindings(context); - npc["character"] = LuaUtil::makeReadOnly(character); + npc["classes"] = initCoreClassBindings(context); + // This function is game-specific, in future we should replace it with something more universal. npc["isWerewolf"] = [](const Object& o) { const MWWorld::Class& cls = o.ptr().getClass(); diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index 73bed6799d..dbf884f737 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -878,12 +878,8 @@ -- @param openmw.core#GameObject actor -- @return #number ---- @{#Character}: Class and Character Data --- @field [parent=#NPC] #Character character - - --- @{#Classes}: Class Data --- @field [parent=#Character] #Classes classes +-- @field [parent=#NPC] #Classes classes --- -- A read-only list of all @{#ClassRecord}s in the world database. From 2ce99b0c7f57cb3e70fbcc4104478b97c726e84b Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 16 Nov 2023 11:08:57 -0600 Subject: [PATCH 24/26] Increment API_REVISION --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cad6290274..5174e6532f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ message(STATUS "Configuring OpenMW...") set(OPENMW_VERSION_MAJOR 0) set(OPENMW_VERSION_MINOR 49) set(OPENMW_VERSION_RELEASE 0) -set(OPENMW_LUA_API_REVISION 50) +set(OPENMW_LUA_API_REVISION 51) set(OPENMW_VERSION_COMMITHASH "") set(OPENMW_VERSION_TAGHASH "") From bc63737488a11d496c71f61682aa4a601535d9aa Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 16 Nov 2023 11:20:08 -0600 Subject: [PATCH 25/26] Update Formatting --- apps/openmw/mwlua/types/npc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwlua/types/npc.cpp b/apps/openmw/mwlua/types/npc.cpp index 55bb59afc0..68d13342c4 100644 --- a/apps/openmw/mwlua/types/npc.cpp +++ b/apps/openmw/mwlua/types/npc.cpp @@ -83,7 +83,7 @@ namespace MWLua addActorServicesBindings(record, context); npc["classes"] = initCoreClassBindings(context); - + // This function is game-specific, in future we should replace it with something more universal. npc["isWerewolf"] = [](const Object& o) { const MWWorld::Class& cls = o.ptr().getClass(); From 3e3a39539c3b5b90b20ca53beb4e9e0747b41ee7 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 17 Nov 2023 14:51:19 -0600 Subject: [PATCH 26/26] Reorder, remove comment --- apps/openmw/mwlua/classbindings.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/openmw/mwlua/classbindings.cpp b/apps/openmw/mwlua/classbindings.cpp index f8290a263d..339b724f19 100644 --- a/apps/openmw/mwlua/classbindings.cpp +++ b/apps/openmw/mwlua/classbindings.cpp @@ -31,7 +31,6 @@ namespace MWLua sol::table classes(context.mLua->sol(), sol::create); addRecordFunctionBinding(classes, context); - // class record auto classT = lua.new_usertype("ESM3_Class"); classT[sol::meta_function::to_string] = [](const ESM::Class& rec) -> std::string { return "ESM3_Class[" + rec.mId.toDebugString() + "]"; }; @@ -40,16 +39,6 @@ namespace MWLua classT["description"] = sol::readonly_property([](const ESM::Class& rec) -> std::string_view { return rec.mDescription; }); - 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; - }); classT["attributes"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table { sol::table res(lua, sol::create); auto attribute = rec.mData.mAttribute; @@ -60,6 +49,16 @@ namespace MWLua } return res; }); + 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; + }); classT["minorSkills"] = sol::readonly_property([lua](const ESM::Class& rec) -> sol::table { sol::table res(lua, sol::create); auto skills = rec.mData.mSkills;