mods that hopefully work for a TechAge-based pack

This commit is contained in:
tangent committed 2026-09-09 06:27:51 -06:00
1 parent 4e6b08d194
commit c27db2a537
6234 files changed
+375578

No files matched your search

+21
View File
@@ -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.
+97
View File
@@ -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
+343
View File
@@ -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)
+6
View File
@@ -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