mods that hopefully work for a TechAge-based pack
This commit is contained in:
1 parent
4e6b08d194
commit
c27db2a537
6234 files changed
+375578
No files matched your search
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Joachim Stolberg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,97 @@
|
||||
NanoBasic / [nanobasic]
|
||||
=======================
|
||||
|
||||
## Nanobasic Mod for Luanti (Minetest)
|
||||
|
||||
NanoBasic is a BASIC interpreter to monitor and control Minetest/Luanti machines.
|
||||
Most of the common BASIC keywords are supported:
|
||||
|
||||
```bnf
|
||||
PRINT expression-list [ ; | , ]
|
||||
FOR numeric_variable '=' numeric_expression TO numeric_expression [ STEP number ]
|
||||
IF relation-expression THEN statement-list [ ELSE statement-list ]
|
||||
IF relation-expression GOTO line-number [ ELSE statement-list ]
|
||||
GOTO line-number
|
||||
GOSUB line-number
|
||||
ON numeric_expression GOSUB line-number-list
|
||||
ON numeric_expression GOTO line-number-list
|
||||
LET variable = expression
|
||||
LET string-variable$ = string-expression$
|
||||
DIM array-variable "(" numeric_expression ")"
|
||||
ERASE ( array-variable | string-variable$ )
|
||||
READ variable-list
|
||||
DATA constant-list ; numbers only, only at the end of the program
|
||||
RESTORE [ number ] ; number is offset (0..n), not line number
|
||||
RETURN
|
||||
END
|
||||
BREAK
|
||||
TRON, TROFF
|
||||
FREE
|
||||
AND, NOT, OR, RND, MOD, LEN, VAL, SPC, TIME, SLEEP
|
||||
LEN, MID$, LEFT$, RIGHT$, STR$, HEX$, STRING$, NIL
|
||||
CMD, CMD$
|
||||
|
||||
; Basic V2 features:
|
||||
|
||||
CONST variable = number
|
||||
IF relation-expression THEN
|
||||
statements...
|
||||
[ ELSE
|
||||
statements... ]
|
||||
ENDIF
|
||||
WHILE relation-expression
|
||||
statements...
|
||||
LOOP
|
||||
variable = expression ; without LET
|
||||
string-variable$ = string-expression$ ; without LET
|
||||
```
|
||||
|
||||
Supported data types are:
|
||||
|
||||
- Signed Integer, 32 bit (-2,147,483,648 to 2,147,483,647)
|
||||
- String
|
||||
- Array (one dimension)
|
||||
- Constant (numeric only)
|
||||
|
||||
The Basic language is inspired by the original Microsoft Basic known from Home Computers in the 80s.
|
||||
|
||||
This mod requires the Lua package nanobasic, which has to be installed with:
|
||||
|
||||
```bash
|
||||
$ luarocks --lua-version 5.1 install nanobasic
|
||||
```
|
||||
|
||||
For more info to LuaRocks, see: https://luarocks.org/
|
||||
|
||||
To enable this `unsafe` package, add 'nanobasic' to the list of trusted mods in
|
||||
minetest.conf:
|
||||
|
||||
```text
|
||||
secure.trusted_mods = <other mods>,nanobasic
|
||||
```
|
||||
|
||||
Or, if not available, add the following line:
|
||||
|
||||
```text
|
||||
secure.trusted_mods = nanobasic
|
||||
```
|
||||
|
||||
An example of how NanoBasic can be used can be found here:
|
||||
https://github.com/joe7575/techage/blob/master/logic/basic_terminal.lua
|
||||
|
||||
## Dependencies
|
||||
|
||||
There are no dependencies.
|
||||
|
||||
## License
|
||||
|
||||
Copyright (C) 2024-2025 Joachim Stolberg
|
||||
|
||||
Licensed under the MIT license. See LICENSE.txt
|
||||
|
||||
|
||||
## History
|
||||
|
||||
**v1.0.0 (2025-01-01)**
|
||||
- First release
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
--[[
|
||||
|
||||
Copyright 2024-2025 Joachim Stolberg
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||
and associated documentation files (the “Software”), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
]]--
|
||||
|
||||
local IE = minetest.request_insecure_environment()
|
||||
|
||||
if not IE then
|
||||
minetest.log("warning", "[nanobasic] Add 'nanobasic' to the list of 'secure.trusted_mods' in minetest.conf!!!")
|
||||
do return end
|
||||
end
|
||||
|
||||
local status, nblib = pcall(IE.require, "nanobasiclib")
|
||||
if not status then
|
||||
minetest.log("warning", "[nanobasic] Install nanobasic via 'luarocks --lua-version 5.1 install nanobasic'!!")
|
||||
do return end
|
||||
end
|
||||
|
||||
if nblib.version() < "1.0.2" then
|
||||
minetest.log("warning", "[nanobasic] Update nanobasic via 'luarocks --lua-version 5.1 install nanobasic'!!")
|
||||
do return end
|
||||
end
|
||||
|
||||
nanobasic = {}
|
||||
|
||||
local M = minetest.get_meta
|
||||
local VMList = {}
|
||||
local UIDList = {}
|
||||
local storage = minetest.get_mod_storage()
|
||||
|
||||
-- Parameters types
|
||||
nanobasic.NB_NONE = 0 -- no parameter
|
||||
nanobasic.NB_NUM = 1 -- number
|
||||
nanobasic.NB_STR = 2 -- string
|
||||
nanobasic.NB_ARR = 3 -- array
|
||||
nanobasic.NB_ANY = 4 -- any kind of parameter or none
|
||||
|
||||
-- Return values of 'nb_run()'
|
||||
nanobasic.NB_END = 0 -- programm end reached
|
||||
nanobasic.NB_ERROR = 1 -- error in programm
|
||||
nanobasic.NB_BREAK = 2 -- break command
|
||||
nanobasic.NB_BUSY = 3 -- programm still running
|
||||
nanobasic.NB_XFUNC = 4 -- 'call' external function
|
||||
|
||||
nanobasic.CallResults = {"END", "ERROR", "BUSY", "BREAK", "XFUNC"}
|
||||
|
||||
function nanobasic.version()
|
||||
return nblib.version()
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Wrapper for the nanobasic library in C
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
--
|
||||
-- Standard API
|
||||
--
|
||||
|
||||
-- @return string with the size of free memory
|
||||
function nanobasic.free_mem()
|
||||
return nblib.free_mem()
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param param_types: table with parameter types (NB_NUM, NB_STR, NB_ARR)
|
||||
-- @param return_type: return type (NB_NONE, NB_NUM, NB_STR, NB_ARR)
|
||||
-- @return 'nanobasic.run' result, if function was called
|
||||
function nanobasic.add_function(name, param_types, return_type)
|
||||
return nblib.add_function(name, param_types, return_type)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return true, if VM was successfully initialized
|
||||
function nanobasic.create(pos, code)
|
||||
local sts
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
VMList[hash], sts = nblib.create(code)
|
||||
return sts == 0
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param cycles: number of cycles to execute
|
||||
-- @return number of executed cycles, or -1 if error
|
||||
function nanobasic.run(pos, cycles)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.run(VMList[hash], cycles) or -1
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
function nanobasic.get_screen_buffer(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.get_screen_buffer(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
function nanobasic.clear_screen(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.clear_screen(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param text: string to be output
|
||||
function nanobasic.print(pos, text)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.print(VMList[hash], text)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return true, if VM was successfully reset
|
||||
function nanobasic.reset(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.reset(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
function nanobasic.destroy(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
if VMList[hash] then
|
||||
nblib.destroy(VMList[hash])
|
||||
VMList[hash] = nil
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
-- Helper functions
|
||||
--
|
||||
-- @param pos: node position
|
||||
function nanobasic.dump_code(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.dump_code(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
function nanobasic.output_symbol_table(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.output_symbol_table(VMList[hash])
|
||||
end
|
||||
|
||||
--
|
||||
-- API for external functions
|
||||
--
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param label: label to search for
|
||||
-- @return address of the label, or 0 if not found
|
||||
function nanobasic.get_label_address(pos, label)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.get_label_address(VMList[hash], label)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param addr: address to set the program counter
|
||||
-- @return true, if PC was successfully set
|
||||
function nanobasic.set_pc(pos, addr)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.set_pc(VMList[hash], addr)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return number of parameters on the parameter stack (0..n)
|
||||
function nanobasic.stack_depth(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.stack_depth(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param idx = stack position (1..n) 1 = top of stack
|
||||
function nanobasic.peek_num(pos, idx)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.peek_num(VMList[hash], idx)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return number from the parameter stack
|
||||
function nanobasic.pop_num(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.pop_num(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param number: push number on the parameter stack
|
||||
function nanobasic.push_num(pos, number)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.push_num(VMList[hash], number or 0)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return string from the parameter stack
|
||||
function nanobasic.pop_str(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.pop_str(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param str: push string on the parameter stack
|
||||
function nanobasic.push_str(pos, str)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.push_str(VMList[hash], str)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param name: return variable index number used by the VM
|
||||
function nanobasic.get_var_num(pos, name)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.get_var_num(VMList[hash], name)
|
||||
end
|
||||
|
||||
function nanobasic.pop_arr_addr(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.pop_arr_addr(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param addr: array address, determined via pop_arr_addr()
|
||||
-- @return Array as table or nil
|
||||
function nanobasic.read_arr(pos, addr)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.read_arr(VMList[hash], addr)
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param addr: array address, determined via pop_arr_addr()
|
||||
-- @param tbl: Array as table
|
||||
function nanobasic.write_arr(pos, addr, tbl)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.write_arr(VMList[hash], addr, tbl)
|
||||
end
|
||||
|
||||
--
|
||||
-- Debug API functions
|
||||
--
|
||||
|
||||
-- @param pos: node position
|
||||
function nanobasic.get_variable_list(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.get_variable_list(VMList[hash])
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @param type: variable type from get_variable_list()
|
||||
-- @param var: variable index from get_variable_list()
|
||||
-- @param idx: array index (or 0)
|
||||
function nanobasic.read_variable(pos, _type, var, idx)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] and nblib.read_variable(VMList[hash], _type, var, idx)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Further API functions
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return hash value for the node position
|
||||
function nanobasic.hash_node_position(pos)
|
||||
return nblib.hash_node_position(pos)
|
||||
end
|
||||
|
||||
function nanobasic.bitmap(font_color, bg_color, text)
|
||||
return nblib.bitmap(font_color, bg_color, text)
|
||||
end
|
||||
|
||||
-- @param hash: hash value for the node position
|
||||
-- @return node position as table (x,y,z)
|
||||
function nanobasic.get_position_from_hash(hash)
|
||||
local x = (hash:byte(1) - 48) + (hash:byte(2) - 48) * 64 + (hash:byte(3) - 48) * 4096
|
||||
local y = (hash:byte(4) - 48) + (hash:byte(5) - 48) * 64 + (hash:byte(6) - 48) * 4096
|
||||
local z = (hash:byte(7) - 48) + (hash:byte(8) - 48) * 64 + (hash:byte(9) - 48) * 4096
|
||||
return {x = x - 32768, y = y - 32768, z = z - 32768}
|
||||
end
|
||||
|
||||
-- @param pos: node position
|
||||
-- @return true, if VM is loaded
|
||||
function nanobasic.is_loaded(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
return VMList[hash] ~= nil
|
||||
end
|
||||
|
||||
-- Restore a previously backed up VM without starting it
|
||||
-- (called from minetest.register_lbm)
|
||||
-- @param pos: node position
|
||||
function nanobasic.vm_restore(pos)
|
||||
local hash = nblib.hash_node_position(pos)
|
||||
if VMList[hash] == nil then
|
||||
local s = storage:get_string(hash)
|
||||
if s ~= "" then
|
||||
if nanobasic.create(pos, "") then
|
||||
print("vm_restore")
|
||||
nblib.unpack_vm(VMList[hash], s)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- World maintenance
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
-- Store the VM in mod storage
|
||||
local function vm_store(hash, vm)
|
||||
print("vm_store")
|
||||
local s = nblib.pack_vm(vm)
|
||||
storage:set_string(hash, s)
|
||||
end
|
||||
|
||||
minetest.register_on_shutdown(function()
|
||||
for hash, vm in pairs(VMList) do
|
||||
vm_store(hash, vm)
|
||||
end
|
||||
end)
|
||||
|
||||
local function remove_unloaded_vms()
|
||||
local tbl = table.copy(VMList)
|
||||
local cnt = 0
|
||||
VMList = {}
|
||||
for hash, vm in pairs(tbl) do
|
||||
local pos = nanobasic.get_position_from_hash(hash)
|
||||
if minetest.get_node_or_nil(pos) then
|
||||
VMList[hash] = vm
|
||||
cnt = cnt + 1
|
||||
else
|
||||
vm_store(hash, vm)
|
||||
end
|
||||
end
|
||||
minetest.after(60, remove_unloaded_vms)
|
||||
end
|
||||
|
||||
minetest.after(60, remove_unloaded_vms)
|
||||
@@ -0,0 +1,6 @@
|
||||
title = NanoBasic
|
||||
name = nanobasic
|
||||
description = NanoBasic is a BASIC interpreter for Minetest/Luanti mods
|
||||
depends =
|
||||
optional_depends =
|
||||
min_minetest_version = 5.4
|
||||
Reference in new issue
Block a user