From 55285b5e57d60ecc16fb3f6cbea079f3e260e9dc Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Sat, 3 Feb 2024 10:43:38 -0600 Subject: [PATCH 01/11] Fix Global Iteration --- apps/openmw/mwlua/mwscriptbindings.cpp | 75 ++++++++++++++++++++------ 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwlua/mwscriptbindings.cpp b/apps/openmw/mwlua/mwscriptbindings.cpp index a41ef30a44..b2872ed4fc 100644 --- a/apps/openmw/mwlua/mwscriptbindings.cpp +++ b/apps/openmw/mwlua/mwscriptbindings.cpp @@ -125,21 +125,39 @@ namespace MWLua return "ESM3_GlobalStore{" + std::to_string(store.getSize()) + " globals}"; }; globalStoreT[sol::meta_function::length] = [](const GlobalStore& store) { return store.getSize(); }; - globalStoreT[sol::meta_function::index] - = sol::overload([](const GlobalStore& store, std::string_view globalId) -> sol::optional { - auto g = store.search(ESM::RefId::deserializeText(globalId)); - if (g == nullptr) - return sol::nullopt; - char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); - if (varType == 's' || varType == 'l') - { - return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); - } - else - { - return MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); - } - }); + globalStoreT[sol::meta_function::index] = sol::overload( + [](const GlobalStore& store, std::string_view globalId) -> sol::optional { + auto g = store.search(ESM::RefId::deserializeText(globalId)); + if (g == nullptr) + return sol::nullopt; + char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); + if (varType == 's' || varType == 'l') + { + return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); + } + else + { + return MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); + } + }, + [](const GlobalStore& store, int index) -> sol::optional { + if (index < 1 || index >= store.getSize()) + return sol::nullopt; + auto g = store.at(index - 1); + if (g == nullptr) + return sol::nullopt; + std::string globalId = g->mId.serializeText(); + char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); + if (varType == 's' || varType == 'l') + { + return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); + } + else + { + return MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); + } + }); + globalStoreT[sol::meta_function::new_index] = sol::overload([](const GlobalStore& store, std::string_view globalId, float val) { auto g = store.search(ESM::RefId::deserializeText(globalId)); @@ -155,7 +173,32 @@ namespace MWLua MWBase::Environment::get().getWorld()->setGlobalFloat(globalId, val); } }); - globalStoreT[sol::meta_function::pairs] = lua["ipairsForArray"].template get(); + globalStoreT[sol::meta_function::pairs] = [](const GlobalStore& store) { + int index = 0; // Start index + return sol::as_function( + [index, &store](sol::this_state ts) mutable -> sol::optional> { + if (index >= store.getSize()) + return sol::nullopt; + + const auto& global = store.at(index++); + if (!global) + return sol::nullopt; + + std::string globalId = global->mId.serializeText(); + char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); + float value; + if (varType == 's' || varType == 'l') + { + value = static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); + } + else + { + value = MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); + } + + return std::make_tuple(globalId, value); + }); + }; globalStoreT[sol::meta_function::ipairs] = lua["ipairsForArray"].template get(); api["getGlobalVariables"] = [globalStore](sol::optional player) { if (player.has_value() && player->ptr() != MWBase::Environment::get().getWorld()->getPlayerPtr()) From 9daf10c305a178cce510aac8548da65fa8305af6 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Sat, 3 Feb 2024 10:45:24 -0600 Subject: [PATCH 02/11] Remove comment --- apps/openmw/mwlua/mwscriptbindings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwlua/mwscriptbindings.cpp b/apps/openmw/mwlua/mwscriptbindings.cpp index b2872ed4fc..e234a2be8e 100644 --- a/apps/openmw/mwlua/mwscriptbindings.cpp +++ b/apps/openmw/mwlua/mwscriptbindings.cpp @@ -174,7 +174,7 @@ namespace MWLua } }); globalStoreT[sol::meta_function::pairs] = [](const GlobalStore& store) { - int index = 0; // Start index + int index = 0; return sol::as_function( [index, &store](sol::this_state ts) mutable -> sol::optional> { if (index >= store.getSize()) From 5f9acbd0f0a64030d3bc30a352d46b675bdce778 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Sat, 3 Feb 2024 13:03:23 -0600 Subject: [PATCH 03/11] Add function to replace duplicated code --- apps/openmw/mwlua/mwscriptbindings.cpp | 57 +++++++++----------------- 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/apps/openmw/mwlua/mwscriptbindings.cpp b/apps/openmw/mwlua/mwscriptbindings.cpp index e234a2be8e..ded00dc2b2 100644 --- a/apps/openmw/mwlua/mwscriptbindings.cpp +++ b/apps/openmw/mwlua/mwscriptbindings.cpp @@ -53,6 +53,20 @@ namespace sol namespace MWLua { + auto getGlobalVariableValue(const std::string_view globalId) -> float + { + char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); + if (varType == 'f') + { + return MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); + } + else if (varType == 's' || varType == 'l') + { + return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); + } + return 0; + }; + sol::table initMWScriptBindings(const Context& context) { sol::table api(context.mLua->sol(), sol::create); @@ -130,15 +144,7 @@ namespace MWLua auto g = store.search(ESM::RefId::deserializeText(globalId)); if (g == nullptr) return sol::nullopt; - char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); - if (varType == 's' || varType == 'l') - { - return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); - } - else - { - return MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); - } + return getGlobalVariableValue(globalId); }, [](const GlobalStore& store, int index) -> sol::optional { if (index < 1 || index >= store.getSize()) @@ -147,15 +153,7 @@ namespace MWLua if (g == nullptr) return sol::nullopt; std::string globalId = g->mId.serializeText(); - char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); - if (varType == 's' || varType == 'l') - { - return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); - } - else - { - return MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); - } + return getGlobalVariableValue(globalId); }); globalStoreT[sol::meta_function::new_index] @@ -163,15 +161,7 @@ namespace MWLua auto g = store.search(ESM::RefId::deserializeText(globalId)); if (g == nullptr) throw std::runtime_error("No variable \"" + std::string(globalId) + "\" in GlobalStore"); - char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); - if (varType == 's' || varType == 'l') - { - MWBase::Environment::get().getWorld()->setGlobalInt(globalId, static_cast(val)); - } - else - { - MWBase::Environment::get().getWorld()->setGlobalFloat(globalId, val); - } + return getGlobalVariableValue(globalId); }); globalStoreT[sol::meta_function::pairs] = [](const GlobalStore& store) { int index = 0; @@ -182,19 +172,10 @@ namespace MWLua const auto& global = store.at(index++); if (!global) - return sol::nullopt; + return sol::nullopt; std::string globalId = global->mId.serializeText(); - char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); - float value; - if (varType == 's' || varType == 'l') - { - value = static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); - } - else - { - value = MWBase::Environment::get().getWorld()->getGlobalFloat(globalId); - } + float value = getGlobalVariableValue(globalId); return std::make_tuple(globalId, value); }); From 86666761a3c037b399ae1b6e522863f444184d06 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Thu, 8 Feb 2024 21:51:54 -0600 Subject: [PATCH 04/11] Requested changes --- apps/openmw/mwlua/mwscriptbindings.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwlua/mwscriptbindings.cpp b/apps/openmw/mwlua/mwscriptbindings.cpp index ded00dc2b2..c04339f28a 100644 --- a/apps/openmw/mwlua/mwscriptbindings.cpp +++ b/apps/openmw/mwlua/mwscriptbindings.cpp @@ -53,7 +53,7 @@ namespace sol namespace MWLua { - auto getGlobalVariableValue(const std::string_view globalId) -> float + float getGlobalVariableValue(const std::string_view globalId) { char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); if (varType == 'f') @@ -147,7 +147,7 @@ namespace MWLua return getGlobalVariableValue(globalId); }, [](const GlobalStore& store, int index) -> sol::optional { - if (index < 1 || index >= store.getSize()) + if (index < 1 || store.getSize() < index) return sol::nullopt; auto g = store.at(index - 1); if (g == nullptr) @@ -170,7 +170,7 @@ namespace MWLua if (index >= store.getSize()) return sol::nullopt; - const auto& global = store.at(index++); + const ESM::Global* global = store.at(index++); if (!global) return sol::nullopt; From 59a25291f8a065a5525f46ba3974b43dc0fc0384 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Tue, 12 Mar 2024 07:29:48 -0500 Subject: [PATCH 05/11] Fix errors --- apps/openmw/mwlua/mwscriptbindings.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwlua/mwscriptbindings.cpp b/apps/openmw/mwlua/mwscriptbindings.cpp index c04339f28a..6ccb8c80fd 100644 --- a/apps/openmw/mwlua/mwscriptbindings.cpp +++ b/apps/openmw/mwlua/mwscriptbindings.cpp @@ -65,7 +65,7 @@ namespace MWLua return static_cast(MWBase::Environment::get().getWorld()->getGlobalInt(globalId)); } return 0; - }; + } sol::table initMWScriptBindings(const Context& context) { @@ -146,7 +146,7 @@ namespace MWLua return sol::nullopt; return getGlobalVariableValue(globalId); }, - [](const GlobalStore& store, int index) -> sol::optional { + [](const GlobalStore& store, size_t index) -> sol::optional { if (index < 1 || store.getSize() < index) return sol::nullopt; auto g = store.at(index - 1); @@ -164,7 +164,7 @@ namespace MWLua return getGlobalVariableValue(globalId); }); globalStoreT[sol::meta_function::pairs] = [](const GlobalStore& store) { - int index = 0; + size_t index = 0; return sol::as_function( [index, &store](sol::this_state ts) mutable -> sol::optional> { if (index >= store.getSize()) From d6241dd1c5956c28068c66bfbe5218aa820321fc Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 22 Mar 2024 17:41:12 -0500 Subject: [PATCH 06/11] Add back new_index --- apps/openmw/mwlua/mwscriptbindings.cpp | 37 ++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwlua/mwscriptbindings.cpp b/apps/openmw/mwlua/mwscriptbindings.cpp index 6ccb8c80fd..1f0a081fe4 100644 --- a/apps/openmw/mwlua/mwscriptbindings.cpp +++ b/apps/openmw/mwlua/mwscriptbindings.cpp @@ -67,6 +67,19 @@ namespace MWLua return 0; } + void setGlobalVariableValue(const std::string_view globalId, float value) + { + char varType = MWBase::Environment::get().getWorld()->getGlobalVariableType(globalId); + if (varType == 'f') + { + MWBase::Environment::get().getWorld()->setGlobalFloat(globalId, value); + } + else if (varType == 's' || varType == 'l') + { + MWBase::Environment::get().getWorld()->setGlobalInt(globalId, value); + } + } + sol::table initMWScriptBindings(const Context& context) { sol::table api(context.mLua->sol(), sol::create); @@ -155,14 +168,22 @@ namespace MWLua std::string globalId = g->mId.serializeText(); return getGlobalVariableValue(globalId); }); - - globalStoreT[sol::meta_function::new_index] - = sol::overload([](const GlobalStore& store, std::string_view globalId, float val) { - auto g = store.search(ESM::RefId::deserializeText(globalId)); - if (g == nullptr) - throw std::runtime_error("No variable \"" + std::string(globalId) + "\" in GlobalStore"); - return getGlobalVariableValue(globalId); - }); + globalStoreT[sol::meta_function::new_index] = sol::overload( + [](const GlobalStore& store, std::string_view globalId, float val) -> void { + auto g = store.search(ESM::RefId::deserializeText(globalId)); + if (g == nullptr) + throw std::runtime_error("No variable \"" + std::string(globalId) + "\" in GlobalStore"); + setGlobalVariableValue(globalId, val); + }, + [](const GlobalStore& store, size_t index, float val) { + if (index < 1 || store.getSize() < index) + return; + auto g = store.at(index - 1); + if (g == nullptr) + return; + std::string globalId = g->mId.serializeText(); + setGlobalVariableValue(globalId, val); + }); globalStoreT[sol::meta_function::pairs] = [](const GlobalStore& store) { size_t index = 0; return sol::as_function( From 4634c7dba95e9b0cfe2d9db38d09fb337710c53d Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 22 Mar 2024 18:56:15 -0500 Subject: [PATCH 07/11] Add iteration global tests --- example-suite | 1 + .../integration_tests/test_lua_api/test.lua | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 160000 example-suite diff --git a/example-suite b/example-suite new file mode 160000 index 0000000000..f0c62b7e46 --- /dev/null +++ b/example-suite @@ -0,0 +1 @@ +Subproject commit f0c62b7e4637badb324e782c97169560e8171032 diff --git a/scripts/data/integration_tests/test_lua_api/test.lua b/scripts/data/integration_tests/test_lua_api/test.lua index 2ec9f09b97..775f3ba499 100644 --- a/scripts/data/integration_tests/test_lua_api/test.lua +++ b/scripts/data/integration_tests/test_lua_api/test.lua @@ -2,6 +2,7 @@ local testing = require('testing_util') local core = require('openmw.core') local async = require('openmw.async') local util = require('openmw.util') +local world = require('openmw.world') local function testTimers() testing.expectAlmostEqual(core.getGameTimeScale(), 30, 'incorrect getGameTimeScale() result') @@ -64,6 +65,28 @@ local function testGetGMST() testing.expectEqual(core.getGMST('Level_Up_Level2'), 'something') end +local function testMWScript() + local variableStoreCount = 18 + local variableStore = world.mwscript.getGlobalVariables(player) + testing.expectEqual(variableStoreCount,#variableStore) + + variableStore.year = variableStoreCount + testing.expectEqual(variableStoreCount,variableStore.year) + variableStore.year = 1 + local indexCheck = 0 + for index, value in ipairs(variableStore) do + testing.expectEqual(variableStore[index],value) + indexCheck = indexCheck + 1 + end + testing.expectEqual(variableStoreCount,indexCheck) + indexCheck = 0 + for index, value in pairs(variableStore) do + testing.expectEqual(variableStore[index],value) + indexCheck = indexCheck + 1 + end + testing.expectEqual(variableStoreCount,indexCheck) +end + local function initPlayer() player:teleport('', util.vector3(4096, 4096, 867.237), util.transform.identity) coroutine.yield() @@ -101,6 +124,7 @@ tests = { end}, {'teleport', testTeleport}, {'getGMST', testGetGMST}, + {'mwscript', testMWScript}, } return { From b8c8e304319c5ea9e853f5b48b3d604cbd7aea32 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 22 Mar 2024 19:06:00 -0500 Subject: [PATCH 08/11] Revert "Add iteration global tests" This reverts commit 4634c7dba95e9b0cfe2d9db38d09fb337710c53d. --- example-suite | 1 - .../integration_tests/test_lua_api/test.lua | 24 ------------------- 2 files changed, 25 deletions(-) delete mode 160000 example-suite diff --git a/example-suite b/example-suite deleted file mode 160000 index f0c62b7e46..0000000000 --- a/example-suite +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f0c62b7e4637badb324e782c97169560e8171032 diff --git a/scripts/data/integration_tests/test_lua_api/test.lua b/scripts/data/integration_tests/test_lua_api/test.lua index 775f3ba499..2ec9f09b97 100644 --- a/scripts/data/integration_tests/test_lua_api/test.lua +++ b/scripts/data/integration_tests/test_lua_api/test.lua @@ -2,7 +2,6 @@ local testing = require('testing_util') local core = require('openmw.core') local async = require('openmw.async') local util = require('openmw.util') -local world = require('openmw.world') local function testTimers() testing.expectAlmostEqual(core.getGameTimeScale(), 30, 'incorrect getGameTimeScale() result') @@ -65,28 +64,6 @@ local function testGetGMST() testing.expectEqual(core.getGMST('Level_Up_Level2'), 'something') end -local function testMWScript() - local variableStoreCount = 18 - local variableStore = world.mwscript.getGlobalVariables(player) - testing.expectEqual(variableStoreCount,#variableStore) - - variableStore.year = variableStoreCount - testing.expectEqual(variableStoreCount,variableStore.year) - variableStore.year = 1 - local indexCheck = 0 - for index, value in ipairs(variableStore) do - testing.expectEqual(variableStore[index],value) - indexCheck = indexCheck + 1 - end - testing.expectEqual(variableStoreCount,indexCheck) - indexCheck = 0 - for index, value in pairs(variableStore) do - testing.expectEqual(variableStore[index],value) - indexCheck = indexCheck + 1 - end - testing.expectEqual(variableStoreCount,indexCheck) -end - local function initPlayer() player:teleport('', util.vector3(4096, 4096, 867.237), util.transform.identity) coroutine.yield() @@ -124,7 +101,6 @@ tests = { end}, {'teleport', testTeleport}, {'getGMST', testGetGMST}, - {'mwscript', testMWScript}, } return { From b51891cbcdd6ed639b58ea8cf65d3f30e2deca68 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 22 Mar 2024 19:13:39 -0500 Subject: [PATCH 09/11] Add lua global var test back --- .../integration_tests/test_lua_api/test.lua | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/scripts/data/integration_tests/test_lua_api/test.lua b/scripts/data/integration_tests/test_lua_api/test.lua index 2ec9f09b97..0eead01ff0 100644 --- a/scripts/data/integration_tests/test_lua_api/test.lua +++ b/scripts/data/integration_tests/test_lua_api/test.lua @@ -2,6 +2,7 @@ local testing = require('testing_util') local core = require('openmw.core') local async = require('openmw.async') local util = require('openmw.util') +local world = require('openmw.world') local function testTimers() testing.expectAlmostEqual(core.getGameTimeScale(), 30, 'incorrect getGameTimeScale() result') @@ -64,6 +65,28 @@ local function testGetGMST() testing.expectEqual(core.getGMST('Level_Up_Level2'), 'something') end +local function testMWScript() + local variableStoreCount = 18 + local variableStore = world.mwscript.getGlobalVariables(player) + testing.expectEqual(variableStoreCount,#variableStore) + + variableStore.year = variableStoreCount + testing.expectEqual(variableStoreCount,variableStore.year) + variableStore.year = 1 + local indexCheck = 0 + for index, value in ipairs(variableStore) do + testing.expectEqual(variableStore[index],value) + indexCheck = indexCheck + 1 + end + testing.expectEqual(variableStoreCount,indexCheck) + indexCheck = 0 + for index, value in pairs(variableStore) do + testing.expectEqual(variableStore[index],value) + indexCheck = indexCheck + 1 + end + testing.expectEqual(variableStoreCount,indexCheck) +end + local function initPlayer() player:teleport('', util.vector3(4096, 4096, 867.237), util.transform.identity) coroutine.yield() @@ -101,6 +124,7 @@ tests = { end}, {'teleport', testTeleport}, {'getGMST', testGetGMST}, + {'mwscript', testMWScript}, } return { @@ -109,4 +133,4 @@ return { onPlayerAdded = function(p) player = p end, }, eventHandlers = testing.eventHandlers, -} +} \ No newline at end of file From 7d1f52451f953be5842c35e90b2d9741a5c69ed7 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Fri, 22 Mar 2024 19:14:28 -0500 Subject: [PATCH 10/11] Re-add new line --- scripts/data/integration_tests/test_lua_api/test.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/data/integration_tests/test_lua_api/test.lua b/scripts/data/integration_tests/test_lua_api/test.lua index 0eead01ff0..775f3ba499 100644 --- a/scripts/data/integration_tests/test_lua_api/test.lua +++ b/scripts/data/integration_tests/test_lua_api/test.lua @@ -133,4 +133,4 @@ return { onPlayerAdded = function(p) player = p end, }, eventHandlers = testing.eventHandlers, -} \ No newline at end of file +} From c5c80936a0220ed41ca199eab881976968359d05 Mon Sep 17 00:00:00 2001 From: Zackhasacat Date: Sat, 23 Mar 2024 13:27:53 -0500 Subject: [PATCH 11/11] Space after , --- .../data/integration_tests/test_lua_api/test.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/data/integration_tests/test_lua_api/test.lua b/scripts/data/integration_tests/test_lua_api/test.lua index 775f3ba499..53262dd168 100644 --- a/scripts/data/integration_tests/test_lua_api/test.lua +++ b/scripts/data/integration_tests/test_lua_api/test.lua @@ -68,23 +68,23 @@ end local function testMWScript() local variableStoreCount = 18 local variableStore = world.mwscript.getGlobalVariables(player) - testing.expectEqual(variableStoreCount,#variableStore) + testing.expectEqual(variableStoreCount, #variableStore) - variableStore.year = variableStoreCount - testing.expectEqual(variableStoreCount,variableStore.year) + variableStore.year = 5 + testing.expectEqual(5, variableStore.year) variableStore.year = 1 local indexCheck = 0 for index, value in ipairs(variableStore) do - testing.expectEqual(variableStore[index],value) + testing.expectEqual(variableStore[index], value) indexCheck = indexCheck + 1 end - testing.expectEqual(variableStoreCount,indexCheck) + testing.expectEqual(variableStoreCount, indexCheck) indexCheck = 0 for index, value in pairs(variableStore) do - testing.expectEqual(variableStore[index],value) + testing.expectEqual(variableStore[index], value) indexCheck = indexCheck + 1 end - testing.expectEqual(variableStoreCount,indexCheck) + testing.expectEqual(variableStoreCount, indexCheck) end local function initPlayer()