From aa5bd51206a85b1ab6784d3b47041396c919f0e7 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 31 May 2026 21:04:51 +0300 Subject: [PATCH] add project args & add vc.get_project_args --- res/scripts/stdmin.lua | 4 ++++ src/engine/CoreParameters.hpp | 2 ++ src/logic/scripting/lua/lua_engine.cpp | 17 ++++++++++++++--- src/util/ArgsReader.hpp | 7 +++++++ src/util/command_line.cpp | 21 +++++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 98d937b1a..904ca6081 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -1,5 +1,7 @@ local _vc_headless = __VC_HEADLESS +local _vc_project_args = __VC_PROJECT_ARGS __VC_HEADLESS = nil +__VC_PROJECT_ARGS = nil vc = { is_headless = function() @@ -300,6 +302,8 @@ require "core:internal/extensions/file" require "core:internal/extensions/table" require "core:internal/extensions/string" +vc.get_project_args = table.copy(_vc_project_args) + local bytearray = require "core:internal/bytearray" Bytearray = bytearray.FFIBytearray Bytearray_as_string = bytearray.FFIBytearray_as_string diff --git a/src/engine/CoreParameters.hpp b/src/engine/CoreParameters.hpp index b482f2bb5..b9f585f47 100644 --- a/src/engine/CoreParameters.hpp +++ b/src/engine/CoreParameters.hpp @@ -2,6 +2,7 @@ #include #include +#include struct CoreParameters { bool headless = false; @@ -13,4 +14,5 @@ struct CoreParameters { std::filesystem::path projectFolder; std::string debugServerString; int tps = 20; + std::unordered_map projectArgs; }; diff --git a/src/logic/scripting/lua/lua_engine.cpp b/src/logic/scripting/lua/lua_engine.cpp index 1f459e98e..afb2f42eb 100644 --- a/src/logic/scripting/lua/lua_engine.cpp +++ b/src/logic/scripting/lua/lua_engine.cpp @@ -15,9 +15,12 @@ #include "usertypes/lua_type_pcmstream.hpp" #include "engine/Engine.hpp" -static debug::Logger logger("lua-state"); -static lua::State* main_thread = nullptr; -static bool headless_mode = false; +namespace { + debug::Logger logger("lua-state"); + lua::State* main_thread = nullptr; + bool headless_mode = false; + const std::unordered_map* project_args; +} using namespace lua; @@ -151,6 +154,13 @@ void lua::init_state(State* L, StateType stateType) { pushboolean(L, headless_mode); setglobal(L, "__VC_HEADLESS"); + createtable(L, 0, project_args->size()); + for (const auto& [key, value] : *project_args) { + pushstring(L, value); + setfield(L, key); + } + setglobal(L, "__VC_PROJECT_ARGS"); + auto file = "res:scripts/stdmin.lua"; auto src = io::read_string(file); lua::pop(L, lua::execute(L, 0, src, "core:scripts/stdmin.lua")); @@ -181,6 +191,7 @@ void lua::initialize(const EnginePaths& paths, const CoreParameters& params) { logger.info() << LUAJIT_VERSION; headless_mode = params.headless; + project_args = ¶ms.projectArgs; main_thread = create_state( paths, params.headless ? StateType::SCRIPT : StateType::BASE ); diff --git a/src/util/ArgsReader.hpp b/src/util/ArgsReader.hpp index 4c8453766..c13c1dd3e 100644 --- a/src/util/ArgsReader.hpp +++ b/src/util/ArgsReader.hpp @@ -26,6 +26,13 @@ namespace util { return last[0] == '-'; } + bool isNextKeywordArg() const { + if (pos >= argc) { + throw std::runtime_error("unexpected end"); + } + return argv[pos][0] == '-'; + } + std::string next() { if (pos >= argc) { throw std::runtime_error("unexpected end"); diff --git a/src/util/command_line.cpp b/src/util/command_line.cpp index e41a0ea57..7f34bcea4 100644 --- a/src/util/command_line.cpp +++ b/src/util/command_line.cpp @@ -97,11 +97,32 @@ static bool perform_keyword( throw std::runtime_error("unknown argument " + keyword); } +static void parse_project_args(util::ArgsReader& reader, CoreParameters& params) { + while (reader.hasNext()) { + std::string key = reader.next(); + if (!reader.isKeywordArg()) { + std::cerr << "-- argument expected" << std::endl; + return; + } + key = key.substr(2); + if (!reader.hasNext() || reader.isNextKeywordArg()) { + params.projectArgs[std::move(key)] = ""; + continue; + } + std::string value = reader.next(); + params.projectArgs[std::move(key)] = std::move(value); + } +} + bool parse_cmdline(int argc, char** argv, CoreParameters& params) { util::ArgsReader reader(argc, argv); reader.skip(); while (reader.hasNext()) { std::string token = reader.next(); + if (token == "--") { + parse_project_args(reader, params); + return true; + } if (reader.isKeywordArg()) { if (!perform_keyword(reader, token, params)) { return false;