first working version
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
files/
|
15
.luacheckrc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
globals = {
|
||||||
|
"digilines",
|
||||||
|
"digicontrol"
|
||||||
|
}
|
||||||
|
|
||||||
|
read_globals = {
|
||||||
|
"vector",
|
||||||
|
"screwdriver",
|
||||||
|
"minetest",
|
||||||
|
"default",
|
||||||
|
"pipeworks",
|
||||||
|
"dump",
|
||||||
|
"VoxelArea",
|
||||||
|
}
|
37
diode.lua
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
minetest.register_node("digicontrol:diode", {
|
||||||
|
description = "Digilines Diode",
|
||||||
|
inventory_image = "digicontrol_diode.png",
|
||||||
|
tiles = {
|
||||||
|
"digicontrol_diode.png",
|
||||||
|
"digicontrol_bottom.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side.png",
|
||||||
|
"digicontrol_side.png"
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = digicontrol.node_box,
|
||||||
|
selection_box = digicontrol.selection_box,
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = false,
|
||||||
|
groups = {digicontrol = 1, dig_immediate = 2},
|
||||||
|
digiline = {
|
||||||
|
semiconductor = {
|
||||||
|
rules = function(node)
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(1, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
},
|
||||||
|
wire = {
|
||||||
|
rules = function(node)
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(1, node.param2),
|
||||||
|
digicontrol.get_rule(3, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
46
filter.lua
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
minetest.register_node("digicontrol:filter", {
|
||||||
|
description = "Digilines Filter",
|
||||||
|
inventory_image = "digicontrol_filter.png",
|
||||||
|
tiles = {
|
||||||
|
"digicontrol_filter.png",
|
||||||
|
"digicontrol_bottom.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side.png",
|
||||||
|
"digicontrol_side.png"
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = digicontrol.node_box,
|
||||||
|
selection_box = digicontrol.selection_box,
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = false,
|
||||||
|
groups = {digicontrol = 1, dig_immediate = 2},
|
||||||
|
digiline = {
|
||||||
|
semiconductor = {
|
||||||
|
rules = function(node, pos, from, channel)
|
||||||
|
local setchannel = minetest.get_meta(pos):get_string("channel")
|
||||||
|
if channel ~= setchannel then return {} end
|
||||||
|
local side = digicontrol.get_side(pos, from, node.param2)
|
||||||
|
if side == 3 then
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(1, node.param2)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(3, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},
|
||||||
|
wire = {
|
||||||
|
rules = function(node)
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(1, node.param2),
|
||||||
|
digicontrol.get_rule(3, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
49
init.lua
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
digicontrol = {}
|
||||||
|
|
||||||
|
digicontrol.selection_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }
|
||||||
|
}
|
||||||
|
|
||||||
|
digicontrol.node_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{ -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 },
|
||||||
|
{ -6/16, -7/16, -6/16, 6/16, -6/16, 6/16 }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local BASE_RULES = {
|
||||||
|
{x = 0, y = 0, z = 1}, -- Up (side 0)
|
||||||
|
{x = 1, y = 0, z = 0}, -- Right (side 1)
|
||||||
|
{x = 0, y = 0, z =-1}, -- Down (side 2)
|
||||||
|
{x =-1, y = 0, z = 0} -- Left (side 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
digicontrol.all_rules = BASE_RULES
|
||||||
|
|
||||||
|
function digicontrol.get_rule(side, param2)
|
||||||
|
if param2 >= 4 then return nil end
|
||||||
|
return BASE_RULES[((side + param2) % 4) + 1]
|
||||||
|
end
|
||||||
|
|
||||||
|
function digicontrol.get_side(pos, from, param2)
|
||||||
|
if param2 >= 4 then return nil end
|
||||||
|
local dir = vector.subtract(from, pos)
|
||||||
|
local facedir = minetest.dir_to_facedir(dir)
|
||||||
|
return ((facedir - param2) + 4) % 4
|
||||||
|
end
|
||||||
|
|
||||||
|
local MP = minetest.get_modpath("digicontrol")
|
||||||
|
|
||||||
|
-- Overrides to digilines functions
|
||||||
|
dofile(MP.."/override.lua")
|
||||||
|
|
||||||
|
-- Nodes
|
||||||
|
dofile(MP.."/diode.lua")
|
||||||
|
dofile(MP.."/splitter.lua")
|
||||||
|
dofile(MP.."/trisplitter.lua")
|
||||||
|
dofile(MP.."/filter.lua")
|
||||||
|
--dofile(MP.."/limiter.lua")
|
||||||
|
--dofile(MP.."/router.lua")
|
5
mod.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
name = digicontrol
|
||||||
|
description = Adds nodes to control the flow of digiline messages
|
||||||
|
depends = default, digilines
|
||||||
|
optional_depends = digiline_routing
|
||||||
|
min_minetest_version = 5.0
|
81
override.lua
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
|
||||||
|
-- Override digilines.transmit and digilines.receptor_send to add more functionality
|
||||||
|
-- Mostly copied from https://github.com/minetest-mods/digilines/blob/master/internal.lua
|
||||||
|
|
||||||
|
|
||||||
|
local function queue_new()
|
||||||
|
return {nextRead = 1, nextWrite = 1}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function queue_empty(queue)
|
||||||
|
return queue.nextRead == queue.nextWrite
|
||||||
|
end
|
||||||
|
|
||||||
|
local function queue_enqueue(queue, object)
|
||||||
|
local nextWrite = queue.nextWrite
|
||||||
|
queue[nextWrite] = object
|
||||||
|
queue.nextWrite = nextWrite + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
local function queue_dequeue(queue)
|
||||||
|
local nextRead = queue.nextRead
|
||||||
|
local object = queue[nextRead]
|
||||||
|
queue[nextRead] = nil
|
||||||
|
queue.nextRead = nextRead + 1
|
||||||
|
return object[1], object[2]
|
||||||
|
end
|
||||||
|
|
||||||
|
function digilines.transmit(pos, channel, msg, checked, origin)
|
||||||
|
local checkedID = minetest.hash_node_position(pos)
|
||||||
|
if checked[checkedID] or not origin then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
checked[checkedID] = true
|
||||||
|
|
||||||
|
digilines.vm_begin()
|
||||||
|
local queue = queue_new()
|
||||||
|
queue_enqueue(queue, {pos, origin})
|
||||||
|
while not queue_empty(queue) do
|
||||||
|
local curPos, fromPos = queue_dequeue(queue)
|
||||||
|
local node = digilines.get_node_force(curPos)
|
||||||
|
local spec = digilines.getspec(node)
|
||||||
|
if spec then
|
||||||
|
-- Effector actions --> Receive
|
||||||
|
if spec.effector then
|
||||||
|
spec.effector.action(curPos, node, channel, msg, fromPos)
|
||||||
|
end
|
||||||
|
-- Cable actions --> Transmit
|
||||||
|
local rules
|
||||||
|
-- Custom semiconductor def for digicontrol nodes
|
||||||
|
if spec.semiconductor then
|
||||||
|
rules = spec.semiconductor.rules(node, curPos, fromPos, channel)
|
||||||
|
elseif spec.wire then
|
||||||
|
rules = digilines.importrules(spec.wire.rules, node)
|
||||||
|
end
|
||||||
|
if rules then
|
||||||
|
for _, rule in ipairs(rules) do
|
||||||
|
local nextPos = digilines.addPosRule(curPos, rule)
|
||||||
|
if digilines.rules_link(curPos, nextPos) then
|
||||||
|
checkedID = minetest.hash_node_position(nextPos)
|
||||||
|
if not checked[checkedID] then
|
||||||
|
checked[checkedID] = true
|
||||||
|
queue_enqueue(queue, {nextPos, curPos})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
digilines.vm_end()
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function digilines.receptor_send(pos, rules, channel, msg)
|
||||||
|
local checked = {}
|
||||||
|
checked[minetest.hash_node_position(pos)] = true -- exclude itself
|
||||||
|
for _,rule in ipairs(rules) do
|
||||||
|
if digilines.rules_link(pos, digilines.addPosRule(pos, rule)) then
|
||||||
|
digilines.transmit(digilines.addPosRule(pos, rule), channel, msg, checked, pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
46
splitter.lua
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
minetest.register_node("digicontrol:splitter", {
|
||||||
|
description = "Digilines Splitter",
|
||||||
|
inventory_image = "digicontrol_splitter.png",
|
||||||
|
tiles = {
|
||||||
|
"digicontrol_splitter.png",
|
||||||
|
"digicontrol_bottom.png",
|
||||||
|
"digicontrol_side.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png"
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = digicontrol.node_box,
|
||||||
|
selection_box = digicontrol.selection_box,
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = false,
|
||||||
|
groups = {digicontrol = 1, dig_immediate = 2},
|
||||||
|
digiline = {
|
||||||
|
semiconductor = {
|
||||||
|
rules = function(node, pos, from)
|
||||||
|
local side = digicontrol.get_side(pos, from, node.param2)
|
||||||
|
if side == 3 then
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(0, node.param2),
|
||||||
|
digicontrol.get_rule(2, node.param2)
|
||||||
|
}
|
||||||
|
elseif side == 0 or side == 2 then
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(3, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},
|
||||||
|
wire = {
|
||||||
|
rules = function(node)
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(0, node.param2),
|
||||||
|
digicontrol.get_rule(2, node.param2),
|
||||||
|
digicontrol.get_rule(3, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
BIN
textures/digicontrol_bottom.png
Normal file
After Width: | Height: | Size: 222 B |
BIN
textures/digicontrol_diode.png
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
textures/digicontrol_filter.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
textures/digicontrol_side.png
Normal file
After Width: | Height: | Size: 138 B |
BIN
textures/digicontrol_side_port.png
Normal file
After Width: | Height: | Size: 208 B |
BIN
textures/digicontrol_splitter.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
textures/digicontrol_trisplitter.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
textures/digicontrol_trisplitter2.png
Normal file
After Width: | Height: | Size: 12 KiB |
44
trisplitter.lua
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
minetest.register_node("digicontrol:trisplitter", {
|
||||||
|
description = "Digilines Tri-Splitter",
|
||||||
|
inventory_image = "digicontrol_trisplitter.png",
|
||||||
|
tiles = {
|
||||||
|
"digicontrol_trisplitter.png",
|
||||||
|
"digicontrol_bottom.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png",
|
||||||
|
"digicontrol_side_port.png"
|
||||||
|
},
|
||||||
|
drawtype = "nodebox",
|
||||||
|
node_box = digicontrol.node_box,
|
||||||
|
selection_box = digicontrol.selection_box,
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = false,
|
||||||
|
groups = {digicontrol = 1, dig_immediate = 2},
|
||||||
|
digiline = {
|
||||||
|
semiconductor = {
|
||||||
|
rules = function(node, pos, from)
|
||||||
|
local side = digicontrol.get_side(pos, from, node.param2)
|
||||||
|
if side == 3 then
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(0, node.param2),
|
||||||
|
digicontrol.get_rule(1, node.param2),
|
||||||
|
digicontrol.get_rule(2, node.param2)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return {
|
||||||
|
digicontrol.get_rule(3, node.param2)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},
|
||||||
|
wire = {
|
||||||
|
rules = function(node)
|
||||||
|
if node.param2 >= 4 then return {} end
|
||||||
|
return digicontrol.all_rules
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|