diff --git a/res/layouts/console.xml b/res/layouts/console.xml
index 6991d3f8..ec728c68 100644
--- a/res/layouts/console.xml
+++ b/res/layouts/console.xml
@@ -1,3 +1,5 @@
-
+
+
+
diff --git a/res/layouts/console.xml.lua b/res/layouts/console.xml.lua
index ebef4b35..9d2cd876 100644
--- a/res/layouts/console.xml.lua
+++ b/res/layouts/console.xml.lua
@@ -1,3 +1,15 @@
+function submit(text)
+ local x,y,z = player.get_pos(0)
+ console.set('pos.x', x)
+ console.set('pos.y', y)
+ console.set('pos.z', z)
+ local status, result = pcall(function() return console.execute(text) end)
+ if result ~= nil then
+ document.log.text = document.log.text..tostring(result)..'\n'
+ end
+ document.prompt.text = ""
+end
+
function on_open()
document.prompt.focused = true
end
diff --git a/src/logic/CommandsInterpreter.cpp b/src/logic/CommandsInterpreter.cpp
index d8238bc3..0e6d9d90 100644
--- a/src/logic/CommandsInterpreter.cpp
+++ b/src/logic/CommandsInterpreter.cpp
@@ -229,7 +229,10 @@ public:
case ArgType::integer:
return typeCheck(arg, value, "integer");
case ArgType::string:
- return typeCheck(arg, value, "string");
+ if (!std::holds_alternative(value)) {
+ return !arg->optional;
+ }
+ break;
}
return true;
}
@@ -316,6 +319,11 @@ public:
if (hasNext() && peekNoJump() != ' ') {
value = parseValue();
+ if (auto string = std::get_if(&value)) {
+ if ((*string)[0] == '$') {
+ value = (*interpreter)[string->substr(1)];
+ }
+ }
// keyword argument
if (!relative && hasNext() && peek() == '=') {
@@ -328,10 +336,9 @@ public:
Argument* arg = nullptr;
do {
if (arg) {
- std::cout << "skipped arg " << arg->name << std::endl;
if (auto string = std::get_if(&arg->def)) {
if ((*string)[0] == '$') {
- args->put((*interpreter)[*string]);
+ args->put((*interpreter)[string->substr(1)]);
} else {
args->put(arg->def);
}
diff --git a/src/logic/CommandsInterpreter.hpp b/src/logic/CommandsInterpreter.hpp
index 88b62e8f..c5686e0c 100644
--- a/src/logic/CommandsInterpreter.hpp
+++ b/src/logic/CommandsInterpreter.hpp
@@ -93,6 +93,8 @@ namespace cmd {
public:
CommandsInterpreter() : repository(std::make_unique()) {}
+ CommandsInterpreter(const CommandsInterpreter&) = delete;
+
CommandsInterpreter(std::unique_ptr repository)
: repository(std::move(repository)){}
diff --git a/src/logic/scripting/lua/LuaState.cpp b/src/logic/scripting/lua/LuaState.cpp
index b39d02d5..e5ff51fc 100644
--- a/src/logic/scripting/lua/LuaState.cpp
+++ b/src/logic/scripting/lua/LuaState.cpp
@@ -154,8 +154,8 @@ void lua::LuaState::loadbuffer(int env, const std::string& src, const std::strin
}
}
-int lua::LuaState::call(int argc) {
- if (lua_pcall(L, argc, LUA_MULTRET, 0)) {
+int lua::LuaState::call(int argc, int nresults) {
+ if (lua_pcall(L, argc, nresults, 0)) {
throw lua::luaerror(lua_tostring(L, -1));
}
return 1;
@@ -416,7 +416,7 @@ scripting::common_func lua::LuaState::createLambda() {
for (const auto& arg : args) {
pushvalue(arg);
}
- if (call(args.size())) {
+ if (call(args.size(), 1)) {
auto result = tovalue(-1);
pop(1);
return result;
diff --git a/src/logic/scripting/lua/LuaState.hpp b/src/logic/scripting/lua/LuaState.hpp
index 7fbafed7..8b786562 100644
--- a/src/logic/scripting/lua/LuaState.hpp
+++ b/src/logic/scripting/lua/LuaState.hpp
@@ -59,7 +59,7 @@ namespace lua {
const char* tostring(int idx);
bool isstring(int idx);
bool isfunction(int idx);
- int call(int argc);
+ int call(int argc, int nresults=-1);
int callNoThrow(int argc);
int execute(int env, const std::string& src, const std::string& file="");
int eval(int env, const std::string& src, const std::string& file="");
diff --git a/src/logic/scripting/lua/libconsole.cpp b/src/logic/scripting/lua/libconsole.cpp
index 49a0719d..5fd9a498 100644
--- a/src/logic/scripting/lua/libconsole.cpp
+++ b/src/logic/scripting/lua/libconsole.cpp
@@ -36,8 +36,16 @@ static int l_execute(lua_State* L) {
return 1;
}
+static int l_set(lua_State* L) {
+ auto name = lua_tostring(L, 1);
+ auto value = state->tovalue(2);
+ (*engine->getCommandsInterpreter())[name] = value;
+ return 0;
+}
+
const luaL_Reg consolelib [] = {
{"add_command", lua_wrap_errors},
{"execute", lua_wrap_errors},
+ {"set", lua_wrap_errors},
{NULL, NULL}
};