#include #include "value_conversion.hpp" #include "../functions.hpp" #include "../execution.hpp" #include ".../../component/notifies.hpp" namespace scripting::lua { namespace { bool is_istring(const sol::lua_value& value) { if (!value.is()) { return false; } const auto str = value.as(); return str[0] == '&'; } script_value string_to_istring(const sol::lua_value& value) { const auto str = value.as().erase(0, 1); const auto string_value = game::SL_GetString(str.data(), 0); game::VariableValue variable{}; variable.type = game::SCRIPT_ISTRING; variable.u.uintValue = string_value; const auto _ = gsl::finally([&variable]() { game::RemoveRefToValue(variable.type, variable.u); }); return script_value(variable); } game::VariableValue convert_function(sol::lua_value value) { const auto function = value.as(); const auto index = reinterpret_cast(notifies::get_hook_count() + 1); notifies::set_lua_hook(index, function); game::VariableValue func{}; func.type = game::SCRIPT_FUNCTION; func.u.codePosValue = index; return func; } sol::lua_value convert_function(lua_State* state, const char* pos) { return [pos](const entity& entity, const sol::this_state s, sol::variadic_args va) { std::vector arguments{}; for (auto arg : va) { arguments.push_back(convert({s, arg})); } return convert(s, scripting::exec_ent_thread(entity, pos, arguments)); }; } } script_value convert(const sol::lua_value& value) { if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (is_istring(value)) { return string_to_istring(value); } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return {value.as()}; } if (value.is()) { return convert_function(value); } return {}; } sol::lua_value convert(lua_State* state, const script_value& value) { if (value.is()) { return {state, value.as()}; } if (value.is()) { return {state, value.as()}; } if (value.is()) { return {state, value.as()}; } if (value.is()) { return {state, value.as()}; } if (value.is>()) { return convert_function(state, value.get_raw().u.codePosValue); } if (value.is()) { return {state, value.as()}; } if (value.is()) { return {state, value.as()}; } if (value.is()) { return {state, value.as()}; } return {state, sol::lua_nil}; } }