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} };