67 #define DBG_LUA LOG_STREAM(debug, log_scripting_lua)
68 #define LOG_LUA LOG_STREAM(info, log_scripting_lua)
69 #define WRN_LUA LOG_STREAM(warn, log_scripting_lua)
70 #define ERR_LUA LOG_STREAM(err, log_scripting_lua)
73 static const char *
Gen =
"name generator";
76 static const char *
Interp =
"lua interpreter";
85 template<VERSION_COMP_OP vop>
91 lua_pushboolean(L, result);
101 if(lua_isinteger(L, 2)) {
102 int n = lua_tointeger(L, 2) - 1;
104 if(
n >= 0 &&
size_t(
n) < components.size()) {
111 char const *m = luaL_checkstring(L, 2);
119 }
else if(strcmp(m,
"sep") == 0) {
128 static const std::vector<std::string> fields{
"major",
"minor",
"revision",
"is_canonical",
"special",
"sep"};
139 vers->~version_info();
159 if(luaL_testudata(L, 1,
Version)) {
165 if(lua_type(L, 1) == LUA_TSTRING) {
168 int major = luaL_checkinteger(L, 1), minor = luaL_optinteger(L, 2, 0), rev = luaL_optinteger(L, 3, 0);
169 std::string sep, special;
170 if(lua_type(L, -1) == LUA_TSTRING) {
171 special = lua_tostring(L, -1);
172 if(!special.empty() && std::isalpha(special[0])) {
175 sep.push_back(special[0]);
176 special = special.substr(1);
181 new(L)
version_info(major, minor, rev, sep[0], special);
183 if(luaL_newmetatable(L,
Version)) {
184 static const luaL_Reg metafuncs[] {
188 {
"__lt", &impl_version_compare<VERSION_COMP_OP::OP_LESS> },
189 {
"__le", &impl_version_compare<VERSION_COMP_OP::OP_LESS_OR_EQUAL> },
190 {
"__eq", &impl_version_compare<VERSION_COMP_OP::OP_EQUAL> },
194 luaL_setfuncs(L, metafuncs, 0);
195 luaW_table_set<std::string>(L, -1,
"__metatable",
Version);
197 lua_setmetatable(L, -2);
217 DBG_LUA <<
"intf_print called:";
218 std::size_t nargs = lua_gettop(L);
220 lua_getglobal(L,
"tostring");
221 for (std::size_t
i = 1;
i <= nargs; ++
i) {
222 lua_pushvalue(L, -1);
225 const char * str = lua_tostring(L, -1);
227 LOG_LUA <<
"'tostring' must return a value to 'print'";
246 static const char*
const prefix =
"Warning:\n ";
247 static std::ostringstream warning(prefix);
248 warning.seekp(0, std::ios::end);
249 warning <<
msg <<
' ';
251 auto L =
reinterpret_cast<lua_State*
>(
p);
254 lua_pushinteger(L, 2);
256 auto& lk = lua_kernel_base::get_lua_kernel<lua_kernel_base>(L);
257 lk.add_log_to_console(luaL_checkstring(L, -1));
273 std::string chunk = luaL_checkstring(L, 1);
274 const char* name = luaL_optstring(L, 2, chunk.c_str());
275 std::string mode = luaL_optstring(L, 3,
"t");
276 bool override_env = !lua_isnone(L, 4);
279 return luaL_argerror(L, 3,
"binary chunks are not allowed for security reasons");
282 int result = luaL_loadbufferx(L, chunk.data(), chunk.length(), name,
"t");
283 if(result != LUA_OK) {
295 const char* upvalue_name = lua_setupvalue(L, -2, 1);
296 if(upvalue_name ==
nullptr) {
309 std::string message =
"There is already an external logger attached to this lua kernel, you cannot open the lua console right now.";
321 lua_pushstring(L, gen->
generate().c_str());
334 std::string
type = luaL_checkstring(L, 1);
337 if(
type ==
"markov" ||
type ==
"markov_chain") {
338 std::vector<std::string> input;
339 if(lua_istable(L, 2)) {
340 input = lua_check<std::vector<std::string>>(L, 2);
344 int chain_sz = luaL_optinteger(L, 3, 2);
345 int max_len = luaL_optinteger(L, 4, 12);
349 }
else if(
type ==
"context_free" ||
type ==
"cfg" ||
type ==
"CFG") {
350 if(lua_istable(L, 2)) {
351 std::map<std::string, std::vector<std::string>>
data;
352 for(lua_pushnil(L); lua_next(L, 2); lua_pop(L, 1)) {
353 if(lua_type(L, -2) != LUA_TSTRING) {
354 lua_pushstring(L,
"CFG generator: invalid nonterminal name (must be a string)");
357 if(lua_isstring(L, -1)) {
359 if(productions.size() > 1) {
360 deprecated_message(
"wesnoth.name_generator('cfg', {nonterminal = 'a|b'})",
DEP_LEVEL::INDEFINITE,
"1.17",
"Non-terminals should now be assigned an array of productions instead of a single string containing productions separated by | - but a single string is fine if it's only one production");
362 }
else if(lua_istable(L, -1)) {
363 const auto&
split = lua_check<std::vector<t_string>>(L, -1);
364 auto& productions =
data[lua_tostring(L,-2)];
367 lua_pushstring(L,
"CFG generator: invalid nonterminal value (must be a string or list of strings)");
381 return luaL_argerror(L, 1,
"should be either 'markov_chain' or 'context_free'");
385 lua_pushstring(L, ex.
what());
391 luaL_getmetatable(L,
Gen);
392 lua_setmetatable(L, -2);
403 const std::string& logger = lua_isstring(L, 2) ? luaL_checkstring(L, 1) :
"";
404 std::string
msg = lua_isstring(L, 2) ? luaL_checkstring(L, 2) : luaL_checkstring(L, 1);
405 if(
msg.empty() ||
msg.back() !=
'\n') {
409 if(logger ==
"err" || logger ==
"error") {
411 }
else if(logger ==
"warn" || logger ==
"wrn" || logger ==
"warning") {
413 }
else if((logger ==
"debug" || logger ==
"dbg")) {
429 const std::string elem = luaL_checkstring(L, 1);
432 const std::string ver_str = lua_isnoneornil(L, 3) ?
"" : luaL_checkstring(L, 3);
441 lua_warning(L,
msg.c_str(),
false);
456 if(!lua_istable(L, 1)) {
459 auto names = lua_check<std::vector<std::string>>(L, 2);
461 int len = luaL_checkinteger(L, -1);
463 for(
int i = 1; i <= std::max<int>(len,
names.size());
i++) {
474 temp.
read(luaL_checkstring(L, 1));
475 std::set<map_location> locs;
476 for(
int x = 1; x <= temp.
width(); x++) {
477 for(
int y = 1; y <= temp.
height(); y++) {
478 if(!temp.
value(x, y)) {
492 for(
const auto& loc : locs) {
493 temp.
clear(loc.wml_x(), loc.wml_y());
504 lua_pushinteger(L, SDL_GetTicks());
516 switch(luaL_getmetafield(L, -1,
"__dir")) {
521 keys = lua_check<std::vector<std::string>>(L, -1);
524 auto dir_keys = lua_check<std::vector<std::string>>(L, -1);
525 std::copy(dir_keys.begin(), dir_keys.end(), std::back_inserter(keys));
534 auto key = luaL_checkstring(L, 2);
535 auto type = lua_getfield(L, 1, key);
536 if(
type == LUA_TTABLE) {
537 lua_pushliteral(L,
"__deprecated");
538 if(lua_rawget(L, -2) == LUA_TBOOLEAN) {
540 lua_pushboolean(L, deprecated);
545 lua_pushboolean(L,
false);
552 auto key = luaL_checkstring(L, 2);
553 std::string suffix =
" ";
554 auto type = lua_getfield(L, 1, key);
555 if(
type == LUA_TTABLE) {
557 }
else if(
type == LUA_TFUNCTION) {
559 }
else if(
type == LUA_TUSERDATA) {
560 lua_getglobal(L,
"getmetatable");
561 lua_pushvalue(L, -2);
563 if(lua_type(L, -1) == LUA_TSTRING) {
564 auto meta = lua_check<std::string>(L, -1);
565 if(meta ==
"function") {
570 suffix =
" " + suffix;
571 lua_pushlstring(L, suffix.c_str(), suffix.size());
581 std::vector<std::string> keys;
582 if(lua_istable(L, idx)) {
585 int save_top = lua_gettop(L);
586 lua_pushvalue(L, idx);
588 lua_settop(L, save_top);
591 int table_idx = lua_absindex(L, -1);
592 for(lua_pushnil(L); lua_next(L, table_idx); lua_pop(L, 1)) {
593 if(lua_type(L, -2) == LUA_TSTRING) {
594 keys.push_back(lua_tostring(L,-2));
602 if(luaL_getmetafield(L, table_idx,
"__index") == LUA_TNIL)
break;
603 }
while(lua_istable(L, -1));
604 if(lua_isfunction(L, -1)) {
608 }
else if(lua_isuserdata(L, idx) && !lua_islightuserdata(L, idx)) {
609 lua_pushvalue(L, idx);
614 std::sort(keys.begin(), keys.end());
615 auto new_end = std::unique(keys.begin(), keys.end());
616 new_end = std::remove_if(keys.begin(), new_end, [L, idx](
const std::string& key) {
617 if(key.compare(0, 2,
"__") == 0) {
620 int save_top = lua_gettop(L);
622 lua_settop(L, save_top);
629 lua_pushvalue(L, idx);
631 if(lua_pcall(L, 2, 1, 0) == LUA_OK) {
636 keys.erase(new_end, keys.end());
654 if(lua_isnil(L, 1))
return luaL_argerror(L, 1,
"Can't dir() nil");
655 if(!lua_isfunction(L, 2)) {
658 int fcn_idx = lua_gettop(L);
660 size_t max_len = std::accumulate(keys.begin(), keys.end(), 0, [](
size_t max,
const std::string& next) {
661 return std::max(max, next.size());
664 static const size_t MAX_WIDTH = 80, COL_PADDING = 3, SUFFIX_PADDING = 2;
665 size_t col_width = max_len + COL_PADDING + SUFFIX_PADDING;
666 size_t n_cols = (MAX_WIDTH + COL_PADDING) / col_width;
667 size_t n_rows = ceil(keys.size() /
double(n_cols));
668 for(
size_t i = 0;
i < n_rows;
i++) {
669 std::ostringstream
line;
671 line.setf(std::ios::left);
672 for(
size_t j = 0; j < n_cols && j + (
i * n_cols) < keys.size(); j++) {
673 int save_top = lua_gettop(L);
675 lua_settop(L, save_top);
679 const auto& key = keys[j +
i * n_cols];
680 lua_pushlstring(L, key.c_str(), key.size());
681 std::string suffix =
" !";
682 if(lua_pcall(L, 2, 1, 0) == LUA_OK) {
683 suffix = luaL_checkstring(L, -1);
687 line.width(col_width - SUFFIX_PADDING + suffix.size());
691 lua_pushvalue(L, fcn_idx);
703 template <member_callback method>
705 return ((lua_kernel_base::get_lua_kernel<lua_kernel_base>(L)).*method)(L);
710 : mState(luaL_newstate())
720 cmd_log_ <<
"Adding boost function proxy...\n";
726 cmd_log_ <<
"Adding standard libs...\n";
728 static const luaL_Reg safe_libs[] {
729 {
"", luaopen_base },
730 {
"table", luaopen_table },
731 {
"string", luaopen_string },
732 {
"math", luaopen_math },
733 {
"coroutine", luaopen_coroutine },
734 {
"debug", luaopen_debug },
735 {
"os", luaopen_os },
736 {
"utf8", luaopen_utf8 },
745 for (luaL_Reg
const *lib = safe_libs; lib->func; ++lib)
747 luaL_requiref(L, lib->name, lib->func, strlen(lib->name));
752 lua_getglobal(L,
"os");
754 while(lua_next(L, -2) != 0) {
756 char const*
function = lua_tostring(L, -1);
757 if(strcmp(
function,
"clock") == 0 || strcmp(
function,
"date") == 0
758 || strcmp(
function,
"time") == 0 || strcmp(
function,
"difftime") == 0)
continue;
760 lua_setfield(L, -3,
function);
766 lua_setglobal(L,
"dofile");
768 lua_setglobal(L,
"loadfile");
771 cmd_log_ <<
"Adding error handler...\n";
778 cmd_log_ <<
"Registering basic wesnoth API...\n";
780 static luaL_Reg
const callbacks[] {
783 {
"dofile", &dispatch<&lua_kernel_base::intf_dofile> },
784 {
"require", &dispatch<&lua_kernel_base::intf_require> },
785 {
"kernel_type", &dispatch<&lua_kernel_base::intf_kernel_type> },
799 lua_getglobal(L,
"wesnoth");
800 if (!lua_istable(L,-1)) {
803 luaL_setfuncs(L, callbacks, 0);
805 lua_setglobal(L,
"wesnoth");
815 cmd_log_ <<
"Redirecting print function...\n";
817 lua_getglobal(L,
"print");
818 lua_setglobal(L,
"std_print");
822 lua_pushcfunction(L, &dispatch<&lua_kernel_base::intf_print>);
823 lua_setglobal(L,
"print");
826 lua_setglobal(L,
"load");
828 lua_setglobal(L,
"loadstring");
830 cmd_log_ <<
"Initializing package repository...\n";
832 lua_getglobal(L,
"wesnoth");
834 lua_setfield(L, -2,
"package");
837 lua_pushstring(L,
"lua/package.lua");
840 cmd_log_ <<
"Error: Failed to initialize package repository. Falling back to less flexible C++ implementation.\n";
844 cmd_log_ <<
"Adding map table...\n";
846 static luaL_Reg
const map_callbacks[] {
865 lua_getglobal(L,
"wesnoth");
867 luaL_setfuncs(L, map_callbacks, 0);
868 lua_setfield(L, -2,
"map");
872 cmd_log_ <<
"Adding game_config table...\n";
874 lua_getglobal(L,
"wesnoth");
875 lua_newuserdatauv(L, 0, 0);
876 lua_createtable(L, 0, 3);
877 lua_pushcfunction(L, &dispatch<&lua_kernel_base::impl_game_config_get>);
878 lua_setfield(L, -2,
"__index");
879 lua_pushcfunction(L, &dispatch<&lua_kernel_base::impl_game_config_set>);
880 lua_setfield(L, -2,
"__newindex");
881 lua_pushstring(L,
"game config");
882 lua_setfield(L, -2,
"__metatable");
883 lua_setmetatable(L, -2);
884 lua_setfield(L, -2,
"game_config");
888 cmd_log_ <<
"Adding rng tables...\n";
891 cmd_log_ <<
"Adding name generator metatable...\n";
892 luaL_newmetatable(L,
Gen);
906 cmd_log_ <<
"Sandboxing Lua interpreter...\nTo make variables visible outside the interpreter, assign to _G.variable.\n";
907 cmd_log_ <<
"The special variable _ holds the result of the last expression (if any).\n";
909 lua_createtable(L, 0, 1);
910 lua_getglobal(L,
"_G");
911 lua_setfield(L, -2,
"__index");
912 lua_setmetatable(L, -2);
914 lua_setfield(L, -2,
"dir");
915 lua_setfield(L, LUA_REGISTRYINDEX,
Interp);
922 lua_pushstring(L,
"lua/ilua.lua");
925 lua_pushstring(L,
"set_strict");
928 cmd_log_ <<
"Failed to activate strict mode.\n";
930 cmd_log_ <<
"Activated strict mode.\n";
933 lua_setglobal(L,
"ilua");
935 cmd_log_ <<
"Error: failed to load ilua.\n";
941 lua_getglobal(L,
"debug");
943 while(lua_next(L, -2) != 0) {
945 char const*
function = lua_tostring(L, -1);
946 if(strcmp(
function,
"traceback") == 0 || strcmp(
function,
"getinfo") == 0)
continue;
948 lua_setfield(L, -3,
function);
992 if (errcode != LUA_OK) {
993 char const *
msg = lua_tostring(L, -1);
995 std::string context =
"When executing, ";
996 if (errcode == LUA_ERRRUN) {
997 context +=
"Lua runtime error: ";
998 }
else if (errcode == LUA_ERRERR) {
999 context +=
"Lua error in attached debugger: ";
1000 }
else if (errcode == LUA_ERRMEM) {
1001 context +=
"Lua out of memory error: ";
1003 context +=
"unknown lua error: ";
1005 if(lua_isstring(L, -1)) {
1006 context +=
msg ?
msg :
"null string";
1008 context += lua_typename(L, lua_type(L, -1));
1013 e_h(context.c_str(),
"Lua Error");
1024 int errcode = luaL_loadbufferx(
mState, prog, strlen(prog), name.empty() ? prog : name.c_str(),
"t");
1025 if (errcode != LUA_OK) {
1026 char const *
msg = lua_tostring(
mState, -1);
1027 std::string message =
msg ?
msg :
"null string";
1029 std::string context =
"When parsing a string to lua, ";
1031 if (errcode == LUA_ERRSYNTAX) {
1032 context +=
" a syntax error";
1033 }
else if(errcode == LUA_ERRMEM){
1034 context +=
" a memory error";
1036 context +=
" an unknown error";
1041 e_h(message.c_str(), context.c_str());
1055 this->
run(cfg[
"code"].str().c_str(), cfg[
"name"].str(), nArgs);
1064 if(in_interpreter) {
1066 if(lua_setupvalue(
mState, -2, 1) ==
nullptr)
1069 lua_insert(
mState, -nArgs - 1);
1070 this->
protected_call(nArgs, in_interpreter ? LUA_MULTRET : 0, eh);
1086 std::string experiment =
"return ";
1088 int top = lua_gettop(
mState);
1095 this->
load_string(experiment.c_str(),
"interactive", eh);
1097 if(lua_setupvalue(
mState, -2, 1) ==
nullptr)
1101 if(lua_gettop(
mState) == top + 1) {
1111 int nRets = lua_gettop(
mState) - top - 1;
1115 int env_idx = lua_gettop(
mState);
1116 lua_pushvalue(
mState, top + 2);
1117 lua_setfield(
mState, -2,
"_");
1120 for(
int i = top + 2;
i < env_idx;
i++)
1123 lua_setfield(
mState, -2,
"_all");
1136 luaL_checkstring(L, 1);
1137 lua_rotate(L, 1, -1);
1140 lua_rotate(L, 1, 1);
1144 lua_call(L, lua_gettop(L) - 1, LUA_MULTRET);
1145 return lua_gettop(L);
1156 const char * m = luaL_checkstring(L, 1);
1158 return luaL_argerror(L, 1,
"found a null string argument to wesnoth require");
1163 lua_getglobal(L,
"wesnoth");
1164 lua_pushstring(L,
"package");
1166 lua_pushvalue(L, 1);
1172 lua_pushvalue(L, 1);
1180 DBG_LUA <<
"require: loaded a file, now calling it";
1188 lua_pushvalue(L, 1);
1189 lua_pushvalue(L, -2);
1193 lua_settable(L, -4);
1204 char const *m = luaL_checkstring(L, 2);
1222 std::string err_msg =
"unknown modifiable property of game_config: ";
1223 err_msg += luaL_checkstring(L, 2);
1224 return luaL_argerror(L, 2, err_msg.c_str());
1235 lua_pushcfunction(L, luaopen_package);
1236 lua_pushstring(L,
"package");
1246 lua_pushstring(L,
"lua/core");
1248 cmd_log_ <<
"Error: Failed to load core.\n";
1258 std::vector<std::string> ret;
1262 int idx = lua_gettop(L);
1263 lua_getglobal(L,
"_G");
1266 while (lua_next(L, idx+1) != 0) {
1267 if (lua_isstring(L, -2)) {
1268 ret.push_back(lua_tostring(L,-2));
1281 std::vector<std::string> ret;
1282 std::string base_path = input;
1283 std::size_t last_dot = base_path.find_last_of(
'.');
1284 std::string partial_name = base_path.substr(last_dot + 1);
1285 base_path.erase(last_dot);
1286 std::string
load =
"return " + base_path;
1289 int save_stack = lua_gettop(L);
1290 int result = luaL_loadstring(L,
load.c_str());
1291 if(result != LUA_OK) {
1293 LOG_LUA <<
"Error when attempting tab completion:";
1294 LOG_LUA << luaL_checkstring(L, -1);
1296 lua_settop(L, save_stack);
1301 if(lua_istable(L, -1) || lua_isuserdata(L, -1)) {
1302 int top = lua_gettop(L);
1303 int obj = lua_absindex(L, -1);
1304 if(luaL_getmetafield(L, obj,
"__tab_enum") == LUA_TFUNCTION) {
1305 lua_pushvalue(L, obj);
1306 lua_pushlstring(L, partial_name.c_str(), partial_name.size());
1308 ret = lua_check<std::vector<std::string>>(L, -1);
1309 }
else if(lua_type(L, -1) != LUA_TTABLE) {
1310 LOG_LUA <<
"Userdata missing __tab_enum meta-function for tab completion";
1311 lua_settop(L, save_stack);
1316 for(lua_pushnil(L); lua_next(L, obj); lua_pop(L, 1)) {
1317 if(lua_type(L, -2) == LUA_TSTRING) {
1318 std::string attr = lua_tostring(L, -2);
1322 if(!isalpha(attr[0]) && attr[0] !=
'_') {
1325 if(std::any_of(attr.begin(), attr.end(), [](
char c){
1326 return !isalpha(c) && !isdigit(c) && c !=
'_';
1330 if(attr.substr(0, partial_name.size()) == partial_name) {
1331 ret.push_back(base_path +
"." + attr);
1337 lua_settop(L, save_stack);
1344 #pragma GCC diagnostic push
1345 #pragma GCC diagnostic ignored "-Wold-style-cast"
1349 #pragma GCC diagnostic pop
std::vector< std::string > names
A config object defines a single node in a WML file, with access to child nodes.
optional_config_impl< config > optional_child(config_key_type key, int n=0)
Euivalent to mandatory_child, but returns an empty optional if the nth child was not found.
void load_core()
Loads the "core" library into the Lua environment.
void run(char const *prog, const std::string &name, int nArgs=0)
Runs a plain script.
virtual void log_error(char const *msg, char const *context="Lua error")
Error reporting mechanisms, used by virtual methods protected_call and load_string.
int intf_dofile(lua_State *L)
Loads and executes a Lua file.
virtual int impl_game_config_get(lua_State *L)
int intf_require(lua_State *L)
Loads and executes a Lua file, if there is no corresponding entry in wesnoth.package.
void throwing_run(char const *prog, const std::string &name, int nArgs, bool in_interpreter=false)
Runs a plain script, but reports errors by throwing lua_error.
int intf_kernel_type(lua_State *L)
virtual int impl_game_config_set(lua_State *L)
void load_package()
Loads the package library into lua environment.
bool protected_call(int nArgs, int nRets, error_handler)
void add_log_to_console(const std::string &msg)
int intf_show_lua_console(lua_State *L)
bool load_string(char const *prog, const std::string &name, error_handler)
std::vector< std::tuple< std::string, std::string > > registered_widget_definitions_
static lua_kernel_base *& get_lua_kernel_base_ptr(lua_State *L)
std::vector< std::string > get_global_var_names()
Get tab completion strings.
std::function< void(char const *, char const *)> error_handler
void run_lua_tag(const config &cfg)
Runs a [lua] tag.
virtual ~lua_kernel_base()
int intf_print(lua_State *L)
Replacement print function – instead of printing to std::cout, print to the command log.
void interactive_run(char const *prog)
Tests if a program resolves to an expression, and pretty prints it if it is, otherwise it runs it nor...
std::vector< std::string > get_attribute_names(const std::string &var_path)
Gets all attribute names of an extended variable name.
virtual uint32_t get_random_seed()
virtual void throw_exception(char const *msg, char const *context="Lua error")
virtual std::string my_name()
User-visible name of the lua kernel that they are talking to.
const char * what() const noexcept
std::string generate(const std::map< std::string, std::string > &variables) const
virtual ~name_generator()
void read(const std::string &shroud_data)
void set_enabled(bool enabled)
bool value(int x, int y) const
std::string write() const
const std::string & str() const
Represents version numbers.
std::string str() const
Serializes the version number into string form.
unsigned int revision_level() const
Retrieves the revision level (x3 in "x1.x2.x3").
char special_version_separator() const
Retrieves the special version separator (e.g.
const std::string & special_version() const
Retrieves the special version suffix (e.g.
unsigned int minor_version() const
Retrieves the minor version number (x2 in "x1.x2.x3").
unsigned int major_version() const
Retrieves the major version number (x1 in "x1.x2.x3").
const std::vector< unsigned int > & components() const
Read-only access to all numeric components.
bool is_canonical() const
Whether the version number is considered canonical for mainline Wesnoth.
std::string deprecated_message(const std::string &elem_name, DEP_LEVEL level, const version_info &version, const std::string &detail)
DEP_LEVEL
See https://wiki.wesnoth.org/CompatibilityStandards for more info.
bool do_version_check(const version_info &a, VERSION_COMP_OP op, const version_info &b)
Interfaces for manipulating version numbers of engine, add-ons, etc.
const language_def & get_language()
Standard logging facilities (interface).
#define LOG_STREAM(level, domain)
void luaW_pushconfig(lua_State *L, const config &cfg)
Converts a config object to a Lua table pushed at the top of the stack.
int luaW_pcall_internal(lua_State *L, int nArgs, int nRets)
void push_error_handler(lua_State *L)
void luaW_push_namedtuple(lua_State *L, const std::vector< std::string > &names)
Push an empty "named tuple" onto the stack.
std::set< map_location > luaW_check_locationset(lua_State *L, int idx)
Converts a table of integer pairs to a set of map location objects.
bool luaW_toboolean(lua_State *L, int n)
int luaW_type_error(lua_State *L, int narg, const char *tname)
bool luaW_pcall(lua_State *L, int nArgs, int nRets, bool allow_wml_error)
Calls a Lua function stored below its nArgs arguments at the top of the stack.
int luaW_push_locationset(lua_State *L, const std::set< map_location > &locs)
Converts a set of map locations to a Lua table pushed at the top of the stack.
bool luaW_getglobal(lua_State *L, const std::vector< std::string > &path)
Pushes the value found by following the variadic names (char *), if the value is not nil.
t_string luaW_checktstring(lua_State *L, int index)
Converts a scalar to a translatable string.
#define return_string_attrib(name, accessor)
#define return_int_attrib(name, accessor)
#define return_bool_attrib(name, accessor)
#define return_string_attrib_deprecated(name, prefix, level, version, msg, accessor)
static int intf_make_shroud_bitmap(lua_State *L)
static int impl_version_finalize(lua_State *L)
Destroy a version.
int dispatch(lua_State *L)
static int intf_name_generator(lua_State *L)
static lg::log_domain log_user("scripting/lua/user")
static int intf_current_version(lua_State *L)
Returns the current Wesnoth version.
static lg::log_domain log_scripting_lua("scripting/lua")
static int intf_parse_shroud_bitmap(lua_State *L)
static int intf_make_version(lua_State *L)
Builds a version from its component parts, or parses it from a string.
static int impl_version_dir(lua_State *L)
static int impl_version_get(lua_State *L)
Decomposes a version into its component parts.
static int impl_get_dir_suffix(lua_State *L)
static int impl_version_tostring(lua_State *L)
Convert a version to string form.
static int intf_deprecated_message(lua_State *L)
Logs a deprecation message.
static int intf_named_tuple(lua_State *L)
Converts a Lua array to a named tuple.
static void impl_warn(void *p, const char *msg, int tocont)
int(lua_kernel_base::* member_callback)(lua_State *L)
static const char * Version
static int intf_log(lua_State *L)
Logs a message Arg 1: (optional) Logger Arg 2: Message.
static int impl_is_deprecated(lua_State *L)
static const char * Interp
static int intf_load(lua_State *L)
Replacement load function.
static int intf_ms_since_init(lua_State *L)
Returns the time stamp, exactly as [set_variable] time=stamp does.
static int intf_get_language(lua_State *L)
static int impl_name_generator_call(lua_State *L)
static void dir_meta_helper(lua_State *L, std::vector< std::string > &keys)
static int intf_object_dir(lua_State *L)
Prints out a list of keys available in an object.
static std::vector< std::string > luaW_get_attributes(lua_State *L, int idx)
This function does the actual work of grabbing all the attribute names.
static int impl_name_generator_collect(lua_State *L)
static int impl_version_compare(lua_State *L)
Compares two versions.
void line(int from_x, int from_y, int to_x, int to_y)
Draw a line.
const version_info wesnoth_version(VERSION)
std::vector< game_tip > load(const config &cfg)
Loads the tips from a config.
void remove_single_widget_definition(const std::string &widget_type, const std::string &definition_id)
Removes a widget definition from the default GUI.
std::string register_metatables(lua_State *L)
int intf_textdomain(lua_State *L)
Creates an interface for gettext.
std::string register_gettext_metatable(lua_State *L)
Adds the gettext metatable.
std::string register_tstring_metatable(lua_State *L)
Adds the tstring metatable.
void register_metatable(lua_State *L)
int luaW_open(lua_State *L)
int load_file(lua_State *L)
Loads a Lua file and pushes the contents on the stack.
int luaW_open(lua_State *L)
int show_lua_console(lua_State *, lua_kernel_base *lk)
int intf_get_relative_dir(lua_State *L)
Expose map_location get_relative_dir.
int intf_vector_negation(lua_State *L)
Expose map_location::vector_negation to lua.
int intf_distance_between(lua_State *L)
Expose map_location distance_between.
int intf_get_in_basis_N_NE(lua_State *L)
Expose map_location get_in_basis_N_NE.
int intf_tiles_adjacent(lua_State *L)
Expose map_location tiles_adjacent.
int intf_vector_diff(lua_State *L)
Expose map_location::vector_difference to lua.
int intf_vector_sum(lua_State *L)
Expose map_location::vector_sum to lua.
int intf_rotate_right_around_center(lua_State *L)
Expose map_location::rotate_right_around_center to lua.
int intf_get_tiles_in_radius(lua_State *L)
Expose map_location get_tiles_in_radius.
int intf_get_adjacent_tiles(lua_State *L)
Expose map_location get_adjacent_tiles.
int intf_get_direction(lua_State *L)
Expose map_location::get_direction function to lua Arg 1: a location Arg 2: a direction Arg 3: (optio...
int luaW_open(lua_State *L)
void load_tables(lua_State *L)
Creates the metatable for RNG objects, and adds the Rng table which contains the constructor.
int luaW_open(lua_State *L)
int luaW_open(lua_State *L)
rng * generator
This generator is automatically synced during synced context.
std::vector< std::string > parenthetical_split(const std::string &val, const char separator, const std::string &left, const std::string &right, const int flags)
Splits a string based either on a separator, except then the text appears within specified parenthesi...
std::vector< std::string > split(const config_attribute_value &val)
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
void lua_push(lua_State *L, const T &val)
static std::string flush(std::ostringstream &s)
#define ON_SCOPE_EXIT(...)
Run some arbitrary code (a lambda) when the current scope exits The lambda body follows this header,...
Error used to report an error in a lua script or in the lua interpreter.
external_log_type external_log_
static map_location::DIRECTION n