Added a memory node, stores 16 values and takes into account an offset.
It's accessed using a channel in the form of sending a digiline message: Channel: <prefix><address + offset> Message: - For read: "get" - For write: a number (it doesn't really mind beyond that)
This commit is contained in:
parent
43a8e5bbec
commit
0e489bcec4
2
test3d_t416/depends.txt
Normal file
2
test3d_t416/depends.txt
Normal file
@ -0,0 +1,2 @@
|
||||
default
|
||||
digilines
|
80
test3d_t416/init.lua
Normal file
80
test3d_t416/init.lua
Normal file
@ -0,0 +1,80 @@
|
||||
local MEMSIZE=16
|
||||
if not digiline then
|
||||
print("Digilines not found.")
|
||||
return
|
||||
end
|
||||
local oldprint=print
|
||||
local function print(...)
|
||||
for k,v in ipairs({...}) do
|
||||
oldprint("[Test3D:T416] "..tostring(v))
|
||||
end
|
||||
end
|
||||
print("Loading.")
|
||||
|
||||
local function t416_digiline_receive(pos, node, channel, msg)
|
||||
print("Digiline: "..tostring(pos.x)..","..tostring(pos.y)..","..tostring(pos.z).."; Channel: "..tostring(channel).."; Message: "..tostring(msg))
|
||||
local meta = minetest.get_meta(pos)
|
||||
local mem = string.split(meta:get_string("mem"),"\n")
|
||||
local ms = ""
|
||||
local chan = meta:get_string("channel")
|
||||
local memoffset = meta:get_int("startaddr")
|
||||
if channel:sub(1,#chan) == chan and tonumber(channel:sub(#chan+1),16)+1-memoffset <= MEMSIZE and tonumber(channel:sub(#chan+1),16)+1-memoffset > 0 then
|
||||
local memaddr = tonumber(channel:sub(#chan+1),16)+1-memoffset
|
||||
print(memaddr)
|
||||
if tostring(msg):lower() == "get" then
|
||||
digiline:receptor_send(pos, digiline.rules.default, channel, tonumber(mem[memaddr] or 0))
|
||||
print("Reading address "..tostring(memaddr)..": "..tostring(mem[memaddr]))
|
||||
else
|
||||
mem[memaddr] = tonumber(msg) or 0
|
||||
for k,v in ipairs(mem) do
|
||||
ms = ms .. tostring(v) .. "\n"
|
||||
end
|
||||
meta:set_string("mem",ms)
|
||||
print("Set address "..tostring(memaddr).." to "..tostring(tonumber(msg)))
|
||||
end
|
||||
end
|
||||
end
|
||||
print("Created T416 digiline function")
|
||||
|
||||
local function t416_set_meta(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local ms = ""
|
||||
for i = 1, 16 do
|
||||
ms = ms .. "0\n"
|
||||
end
|
||||
meta:set_string("mem",ms)
|
||||
meta:set_string("channel","Default")
|
||||
meta:set_int("startaddr",0)
|
||||
meta:set_string("formspec","size[5,12]\nlabel[0.4,0.5;T416 Memory Node (16 words)]\nfield[0.5,2;4,1;channel;Channel prefix;${channel}]\nfield[0.5,3;4,1;startaddr;Starting address;${startaddr}]\ntextarea[0.5,4;4,8;mem;Memory contents;${mem}]")
|
||||
end
|
||||
minetest.register_node("test3d_t416:t416", {
|
||||
description = "T416 Memory Node",
|
||||
tiles = {
|
||||
{
|
||||
image="t416.png",
|
||||
animation={
|
||||
type = "vertical_frames",
|
||||
aspect_w=16,
|
||||
aspect_h=16,
|
||||
length=18,
|
||||
length=1.8,
|
||||
},
|
||||
},
|
||||
},
|
||||
on_construct = t416_set_meta,
|
||||
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
|
||||
digiline = {
|
||||
receptor = {},
|
||||
effector = {
|
||||
action = t416_digiline_receive
|
||||
}
|
||||
},
|
||||
on_receive_fields = function(pos,_,fields,sender)
|
||||
if fields.channel == nil then return end
|
||||
local meta = minetest.get_meta(pos)
|
||||
fields.channel = fields.channel or ""
|
||||
meta:set_string("channel",fields.channel)
|
||||
meta:set_int("startaddr",tonumber(fields.startaddr))
|
||||
end
|
||||
})
|
||||
print("T416 node registered")
|
BIN
test3d_t416/textures/t416.png
Normal file
BIN
test3d_t416/textures/t416.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 778 B |
Loading…
Reference in New Issue
Block a user