local types = { {"e", "anything defined"}, {"v", "any variable"}, {"ve", "any defined variable"}, {"s", "string"}, {"vs", "string variable"}, {"n", "number"}, {"vn", "number variable"}, {"ui", "unsigned integer number"}, {"b", "bool"}, {"vb", "bool variable"} } local instr = { {"mov", ", ", "`to <= from`; Copies from into to."}, {"xchg", ", ", "`a,b <= b,a`; Switches a with b."}, {"getvar", "[, ]", "Sets varname to the current variable called if it's set. If exists is passed, it's set to a bool indicating whether the variable was set."}, {"copytable", ", ", "Copies ${origin}.* to ${target}.*."}, {"add", ", ", "`to <= to + from`"}, {"add", "[, [, […]]]", "`to <= to ∨ ba ∨ bb ∨ …`; logical or: *to* indicates whether at least one of the arguments is true"}, {"add", ", ", "`to <= to .. from`; string concatenation"}, {"sub", ", ", "`num <= num - tosub`"}, {"sub", ", [, ]", "`str <= str:sub(start, end)`; substring"}, {"mul", ", ", "`to <= to * from`; multiplication"}, {"mul", "[, [, […]]]", "`to <= to ∧ ba ∧ bb ∧ …`; logical and: *to* indicates whether all of the arguments are true"}, {"mul", ", ", "`str <= str:rep(cnt)`; repeating a string cnt times"}, {"div", ", ", "`num <= num / todiv`; division"}, {"inc", "", "`num <= num + 1`"}, {"dec", "", "`num <= num - 1`"}, {"neg", "", "`num <= -num`; negation"}, {"neg", "", "`var <= ¬var`; logical not"}, {"neg", "", "`str <= str:rev()`; reverts a string"}, {"inv", "", "`num <= 1 / num`"}, {"mod", ", ", "`num <= num mod dv`; modulo"}, {"jmp", "[, ]", "jump; If *cond* is not *false*, the instruction pointer is set to *target*. To disallow infinite loops, the program is interrupted after changing it, mods may have different heuristics about restarting it then."}, {"call", "[, ]", "same as pushing the current instruction pointer and then jumping (see jmp); used to execute subroutines"}, {"ret", "", "pop some unsigned integer, then jump there; used to exit subroutines"}, {"push", "[, [, […]]]", "put values onto the stack; from left to right"}, {"pop", "[, [, […]]]", "takes values from the stack and sets the passed variables to them; the last variable must be a defined one; from left to right"}, {"equal", ", ", "`a <= (a = b)`; equality"}, {"less", ", ", "`a <= (a < b)`; after executing, a is a bool"}, {"less", ", ", "`a <= (a < b)`; less also works for strings, it compares characters from left to right, see man ASCII for the order"}, {"greater", ", ", "executes less b,a"}, {"usleep", "", "aborts the program for at least ⌊max{0, t}⌋ microseconds"}, {"sleep", "", "executes usleep with t * 1000000 as argument"}, {"get_us_time", "", "stores current time in microsecond precision into *to*; can be used to measure time differences"}, {"tostring", "", "Sets *var* to a string representing its value; if it's not defined, it's set to `$nil`, if it's a boolean, it's set to `$true` or `$false`"}, {"tonumber", "", "Sets *var* to a number representing its value"}, {"toboolean", "", "If *var* is `false` or not defined, it's set to `false`, else it's set to `true`."}, {"print", "[, [, […]]]", "adds variables to the log, seperated by \\t (tab), \\n (newline) is added at the end"}, {"flush", "", "Output the log, what exactly happens should vary for every mod."}, } --[[ local mbl = 0 local mal = 0 for i = 1,#instr do local bef = instr[i] mbl = math.max(#bef[1], mbl) mal = math.max(#bef[2], mal) end--]] local o = "### Types\n\n" .. "Name | Description\n" .. "----|-------------\n" for i = 1,#types do local t = types[i] o = o .. t[1] .. (" "):rep(1 - #t[1]) .. "| " .. t[2] .. "\n" end o = o .. "\n\n### Instructions\n\n" .. "Name | Parameters | Description\n" .. "-----|------------|------------\n" for i = 1,#instr do i = instr[i] if i[2] ~= "" then i[2] = "`" .. i[2] .. "`" else i[2] = "no arguments" end o = o .. i[1] .. " | " .. i[2] .. " | " .. i[3] .. "\n" end o = o .. "\n\n" io.write(o) io.flush()