summaryrefslogtreecommitdiff
path: root/digistuff
diff options
context:
space:
mode:
Diffstat (limited to 'digistuff')
-rw-r--r--digistuff/README41
-rw-r--r--digistuff/depends.txt2
-rw-r--r--digistuff/init.lua930
-rw-r--r--digistuff/sounds/digistuff_piezo_fast_repeat.oggbin0 -> 5515 bytes
-rw-r--r--digistuff/sounds/digistuff_piezo_long_single.oggbin0 -> 6637 bytes
-rw-r--r--digistuff/sounds/digistuff_piezo_short_single.oggbin0 -> 4672 bytes
-rw-r--r--digistuff/sounds/digistuff_piezo_slow_repeat.oggbin0 -> 5219 bytes
-rw-r--r--digistuff/textures/digistuff_adwaita_edit-undo.pngbin0 -> 1382 bytes
-rw-r--r--digistuff/textures/digistuff_adwaita_emblem-default.pngbin0 -> 2062 bytes
-rw-r--r--digistuff/textures/digistuff_adwaita_go-down.pngbin0 -> 1732 bytes
-rw-r--r--digistuff/textures/digistuff_adwaita_go-next.pngbin0 -> 1701 bytes
-rw-r--r--digistuff/textures/digistuff_adwaita_go-previous.pngbin0 -> 1671 bytes
-rw-r--r--digistuff/textures/digistuff_adwaita_go-up.pngbin0 -> 1673 bytes
-rw-r--r--digistuff/textures/digistuff_camera_back.pngbin0 -> 1881 bytes
-rw-r--r--digistuff/textures/digistuff_camera_bottom.pngbin0 -> 303 bytes
-rw-r--r--digistuff/textures/digistuff_camera_front.pngbin0 -> 1784 bytes
-rw-r--r--digistuff/textures/digistuff_camera_left.pngbin0 -> 1754 bytes
-rw-r--r--digistuff/textures/digistuff_camera_pole.pngbin0 -> 3213 bytes
-rw-r--r--digistuff/textures/digistuff_camera_right.pngbin0 -> 1831 bytes
-rw-r--r--digistuff/textures/digistuff_camera_top.pngbin0 -> 239 bytes
-rw-r--r--digistuff/textures/digistuff_digibutton_off.pngbin0 -> 444 bytes
-rw-r--r--digistuff/textures/digistuff_digibutton_on.pngbin0 -> 459 bytes
-rw-r--r--digistuff/textures/digistuff_digibutton_sides.pngbin0 -> 434 bytes
-rw-r--r--digistuff/textures/digistuff_digidetector.pngbin0 -> 737 bytes
-rw-r--r--digistuff/textures/digistuff_digimese.pngbin0 -> 565 bytes
-rw-r--r--digistuff/textures/digistuff_nic_top.pngbin0 -> 3435 bytes
-rw-r--r--digistuff/textures/digistuff_panel_back.pngbin0 -> 14208 bytes
-rw-r--r--digistuff/textures/digistuff_panel_bg.pngbin0 -> 8169 bytes
-rw-r--r--digistuff/textures/digistuff_panel_front.pngbin0 -> 9961 bytes
-rw-r--r--digistuff/textures/digistuff_panel_locked.pngbin0 -> 234 bytes
-rw-r--r--digistuff/textures/digistuff_panel_unlocked.pngbin0 -> 236 bytes
-rw-r--r--digistuff/textures/digistuff_piezo_sides.pngbin0 -> 3187 bytes
-rw-r--r--digistuff/textures/digistuff_piezo_top.pngbin0 -> 2663 bytes
-rw-r--r--digistuff/textures/digistuff_ts_bg.pngbin0 -> 1735 bytes
-rw-r--r--digistuff/textures/digistuff_ts_front.pngbin0 -> 1806 bytes
35 files changed, 973 insertions, 0 deletions
diff --git a/digistuff/README b/digistuff/README
new file mode 100644
index 0000000..8247ce7
--- /dev/null
+++ b/digistuff/README
@@ -0,0 +1,41 @@
+Digilines Stuff
+===============
+
+
+License:
+Code - LGPL v3 or later (contains some code from mesecons and digilines)
+Textures WITHOUT "adwaita" in the file name - CC BY-SA 3.0 Generic (contains modified versions of textures from mesecons and digilines)
+Textures WITH "adwaita" in the file name - These are icons by the GNOME Project, licensed under GNU LGPL v3 or CC BY-SA 3.0.
+
+
+Depends:
+Required: digilines (base only) and mesecons (base only)
+Only needed for craft recipes: default, mesecons_luacontroller, homedecor
+
+
+How to use digilines buttons:
+Connect to a digiline (or digimese), right-click, and set a channel and message.
+When the button is pressed (right-click), it will send that message on that channel, over digilines.
+Note that the settings cannot be changed after setting - you must dig and re-place the button to do so.
+
+
+How to use digimese:
+It conducts digilines signals (like digilines) in all directions (like mese). That's about it, really.
+
+
+How to use the digilines player detector:
+Set a channel and radius (radius must be a number >0 and <10 - anything invalid will be ignored and "6" used instead).
+Every second while a player is within the radius, a table listing the players in range will be sent via digilines on the chosen channel.
+
+
+How to use the digilines control panel:
+Once a channel is set, any messages sent on that channel will be shown on the "LCD". The buttons, when pressed, send the messages "up", "down", "left", "right", "back", and "enter" on the same channel. If the panel is placed in a protected area (all standard protection mods are supported), only the owner of the area (and players with the protection_bypass privilege) can set the channel. There is also a "lock" function in the bottom-right of the "LCD" area. Click the padlock icon to lock/unlock it. If locked, only the owner of the area is allowed to use the buttons. If unlocked, anyone can use the buttons, although channel setting and (for reasons that shuld be obvious) locking/unlocking is still limited to the area owner and players with protection_bypass.
+
+
+How to use the NIC:
+Send a digilines signal with the URL you want to download. The HTTPRequestResult table will be sent back on the same channel.
+
+
+How to use the camera:
+Set the channel, distance, and radius. The camera will search for a node "distance" meters away and up to 10m down.
+Every second while a player is within "radius" meters of that point, a table listing the players in range will be sent via digilines on the chosen channel.
diff --git a/digistuff/depends.txt b/digistuff/depends.txt
new file mode 100644
index 0000000..39f4fe0
--- /dev/null
+++ b/digistuff/depends.txt
@@ -0,0 +1,2 @@
+digilines
+mesecons?
diff --git a/digistuff/init.lua b/digistuff/init.lua
new file mode 100644
index 0000000..bcb7ce7
--- /dev/null
+++ b/digistuff/init.lua
@@ -0,0 +1,930 @@
+digistuff = {}
+digistuff.sounds_playing = {}
+
+digistuff.update_panel_formspec = function (pos,dispstr)
+ local meta = minetest.get_meta(pos)
+ local locked = meta:get_int("locked") == 1
+ local fs = "size[10,8]"..
+ "background[0,0;0,0;digistuff_panel_bg.png;true]"..
+ "label[0,0;%s]"..
+ (locked and "image_button[9,3;1,1;digistuff_panel_locked.png;unlock;]" or "image_button[9,3;1,1;digistuff_panel_unlocked.png;lock;]")..
+ "image_button[2,4.5;1,1;digistuff_adwaita_go-up.png;up;]"..
+ "image_button[1,5;1,1;digistuff_adwaita_go-previous.png;left;]"..
+ "image_button[3,5;1,1;digistuff_adwaita_go-next.png;right;]"..
+ "image_button[2,5.5;1,1;digistuff_adwaita_go-down.png;down;]"..
+ "image_button[1,6.5;1,1;digistuff_adwaita_edit-undo.png;back;]"..
+ "image_button[3,6.5;1,1;digistuff_adwaita_emblem-default.png;enter;]"..
+ "field[6,5.75;2,1;channel;Channel;${channel}]"..
+ "button[8,5.5;1,1;savechan;Set]"
+ fs = fs:format(minetest.formspec_escape(dispstr)):gsub("|","\n")
+ meta:set_string("formspec",fs)
+ meta:set_string("text",dispstr)
+end
+
+digistuff.update_ts_formspec = function (pos)
+ local meta = minetest.get_meta(pos)
+ local fs = "size[10,8]"..
+ "background[0,0;0,0;digistuff_ts_bg.png;true]"
+ if meta:get_int("init") == 0 then
+ fs = fs.."field[3.75,3;3,1;channel;Channel;]"..
+ "button_exit[4,3.75;2,1;save;Save]"
+ else
+ local data = minetest.deserialize(meta:get_string("data")) or {}
+ for _,field in pairs(data) do
+ if field.type == "image" then
+ fs = fs..string.format("image[%s,%s;%s,%s;%s]",field.X,field.Y,field.W,field.H,field.texture_name)
+ elseif field.type == "field" then
+ fs = fs..string.format("field[%s,%s;%s,%s;%s;%s;%s]",field.X,field.Y,field.W,field.H,field.name,field.label,field.default)
+ elseif field.type == "pwdfield" then
+ fs = fs..string.format("pwdfield[%s,%s;%s,%s;%s;%s]",field.X,field.Y,field.W,field.H,field.name,field.label)
+ elseif field.type == "textarea" then
+ fs = fs..string.format("textarea[%s,%s;%s,%s;%s;%s;%s]",field.X,field.Y,field.W,field.H,field.name,field.label,field.default)
+ elseif field.type == "label" then
+ fs = fs..string.format("label[%s,%s;%s]",field.X,field.Y,field.label)
+ elseif field.type == "vertlabel" then
+ fs = fs..string.format("vertlabel[%s,%s;%s]",field.X,field.Y,field.label)
+ elseif field.type == "button" then
+ fs = fs..string.format("button[%s,%s;%s,%s;%s;%s]",field.X,field.Y,field.W,field.H,field.name,field.label)
+ elseif field.type == "button_exit" then
+ fs = fs..string.format("button_exit[%s,%s;%s,%s;%s;%s]",field.X,field.Y,field.W,field.H,field.name,field.label)
+ elseif field.type == "image_button" then
+ fs = fs..string.format("image_button[%s,%s;%s,%s;%s;%s;%s]",field.X,field.Y,field.W,field.H,field.image,field.name,field.label)
+ elseif field.type == "image_button_exit" then
+ fs = fs..string.format("image_button_exit[%s,%s;%s,%s;%s;%s;%s]",field.X,field.Y,field.W,field.H,field.image,field.name,field.label)
+ elseif field.type == "dropdown" then
+ local choices = ""
+ for _,i in ipairs(field.choices) do
+ if type(i) == "string" then
+ choices = choices..minetest.formspec_escape(i)..","
+ end
+ end
+ choices = string.sub(choices,1,-2)
+ fs = fs..string.format("dropdown[%s,%s;%s,%s;%s;%s;%s]",field.X,field.Y,field.W,field.H,field.name,choices,field.selected_id)
+ end
+ end
+ end
+ meta:set_string("formspec",fs)
+end
+
+digistuff.ts_on_receive_fields = function (pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ local playername = sender:get_player_name()
+ local locked = meta:get_int("locked") == 1
+ local can_bypass = minetest.check_player_privs(playername,{protection_bypass=true})
+ local is_protected = minetest.is_protected(pos,playername)
+ if (locked and is_protected) and not can_bypass then
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this screen.")
+ return
+ end
+ local init = meta:get_int("init") == 1
+ if not init then
+ if fields.save then
+ meta:set_string("channel",fields.channel)
+ meta:set_int("init",1)
+ digistuff.update_ts_formspec(pos)
+ end
+ else
+ digiline:receptor_send(pos, digiline.rules.default, setchan, fields)
+ end
+end
+
+digistuff.process_command = function (meta, data, msg)
+ if msg.command == "clear" then
+ data = {}
+ elseif msg.command == "addimage" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ if not msg.texture_name or type(msg.texture_name) ~= "string" then
+ return
+ end
+ local field = {type="image",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,texture_name=minetest.formspec_escape(msg.texture_name)}
+ table.insert(data,field)
+ elseif msg.command == "addfield" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"name","label","default"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="field",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label),default=minetest.formspec_escape(msg.default)}
+ table.insert(data,field)
+ elseif msg.command == "addpwdfield" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"name","label"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="pwdfield",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "addtextarea" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"name","label","default"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="textarea",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label),default=minetest.formspec_escape(msg.default)}
+ table.insert(data,field)
+ elseif msg.command == "addlabel" then
+ for _,i in pairs({"X","Y"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ if not msg.label or type(msg.label) ~= "string" then
+ return
+ end
+ local field = {type="label",X=msg.X,Y=msg.Y,label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "addvertlabel" then
+ for _,i in pairs({"X","Y"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ if not msg.label or type(msg.label) ~= "string" then
+ return
+ end
+ local field = {type="vertlabel",X=msg.X,Y=msg.Y,label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "addbutton" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"name","label"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="button",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "addbutton_exit" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"name","label"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="button_exit",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "addimage_button" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"image","name","label"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="image_button",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,image=minetest.formspec_escape(msg.image),name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "addimage_button_exit" then
+ for _,i in pairs({"X","Y","W","H"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ for _,i in pairs({"image","name","label"}) do
+ if not msg[i] or type(msg[i]) ~= "string" then
+ return
+ end
+ end
+ local field = {type="image_button_exit",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,image=minetest.formspec_escape(msg.image),name=minetest.formspec_escape(msg.name),label=minetest.formspec_escape(msg.label)}
+ table.insert(data,field)
+ elseif msg.command == "adddropdown" then
+ for _,i in pairs({"X","Y","W","H","selected_id"}) do
+ if not msg[i] or type(msg[i]) ~= "number" then
+ return
+ end
+ end
+ if not msg.name or type(msg.name) ~= "string" then
+ return
+ end
+ if not msg.choices or type(msg.choices) ~= "table" or #msg.choices < 1 then
+ return
+ end
+ local field = {type="dropdown",X=msg.X,Y=msg.Y,W=msg.W,H=msg.H,name=msg.name,selected_id=msg.selected_id,choices=msg.choices}
+ table.insert(data,field)
+ elseif msg.command == "lock" then
+ meta:set_int("locked",1)
+ elseif msg.command == "unlock" then
+ meta:set_int("locked",0)
+ end
+ return data
+end
+
+digistuff.ts_on_digiline_receive = function (pos, node, channel, msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then return end
+ if type(msg) ~= "table" then return end
+ local data = minetest.deserialize(meta:get_string("data")) or {}
+ if msg.command then
+ data = digistuff.process_command(meta,data,msg)
+ else
+ for _,i in ipairs(msg) do
+ if i.command then
+ data = digistuff.process_command(meta,data,i) or data
+ end
+ end
+ end
+ meta:set_string("data",minetest.serialize(data))
+ digistuff.update_ts_formspec(pos)
+end
+
+digistuff.panel_on_digiline_receive = function (pos, node, channel, msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then return end
+ if type(msg) ~= "string" then return end
+ digistuff.update_panel_formspec(pos,msg)
+end
+
+digistuff.panel_on_receive_fields = function(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ local playername = sender:get_player_name()
+ local locked = meta:get_int("locked") == 1
+ local can_bypass = minetest.check_player_privs(playername,{protection_bypass=true})
+ local is_protected = minetest.is_protected(pos,playername)
+ if fields.savechan then
+ if can_bypass or not is_protected then
+ meta:set_string("channel",fields.channel)
+ local helpmsg = "Channel has been set. Waiting for data..."
+ digistuff.update_panel_formspec(pos,helpmsg)
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to change the channel of this panel.")
+ end
+ elseif fields.up then
+ if can_bypass or not is_protected or not locked then
+ digiline:receptor_send(pos, digiline.rules.default, setchan, "up")
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this panel.")
+ end
+ elseif fields.down then
+ if can_bypass or not is_protected or not locked then
+ digiline:receptor_send(pos, digiline.rules.default, setchan, "down")
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this panel.")
+ end
+ elseif fields.left then
+ if can_bypass or not is_protected or not locked then
+ digiline:receptor_send(pos, digiline.rules.default, setchan, "left")
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this panel.")
+ end
+ elseif fields.right then
+ if can_bypass or not is_protected or not locked then
+ digiline:receptor_send(pos, digiline.rules.default, setchan, "right")
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this panel.")
+ end
+ elseif fields.back then
+ if can_bypass or not is_protected or not locked then
+ digiline:receptor_send(pos, digiline.rules.default, setchan, "back")
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this panel.")
+ end
+ elseif fields.enter then
+ if can_bypass or not is_protected or not locked then
+ digiline:receptor_send(pos, digiline.rules.default, setchan, "enter")
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to use this panel.")
+ end
+ elseif fields.lock then
+ if can_bypass or not is_protected then
+ meta:set_int("locked",1)
+ minetest.chat_send_player(playername,"This panel has been locked. Access will now be controlled according to area protection.")
+ digistuff.update_panel_formspec(pos,meta:get_string("text"))
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to lock this panel.")
+ end
+ elseif fields.unlock then
+ if can_bypass or not is_protected then
+ meta:set_int("locked",0)
+ minetest.chat_send_player(playername,"This panel has been unlocked. It can now be used (but not locked or have the channel changed) by anyone.")
+ digistuff.update_panel_formspec(pos,meta:get_string("text"))
+ else
+ minetest.record_protection_violation(pos,playername)
+ minetest.chat_send_player(playername,"You are not authorized to unlock this panel.")
+ end
+ end
+end
+
+digistuff.button_turnoff = function (pos)
+ local node = minetest.get_node(pos)
+ if node.name=="digistuff:button_on" then --has not been dug
+ minetest.swap_node(pos, {name = "digistuff:button_off", param2=node.param2})
+ if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_pop", {pos=pos}) end
+ end
+end
+
+minetest.register_node("digistuff:digimese", {
+ description = "Digimese",
+ tiles = {"digistuff_digimese.png"},
+ paramtype = "light",
+ light_source = 3,
+ groups = {cracky = 3, level = 2},
+ is_ground_content = false,
+ sounds = default.node_sound_stone_defaults(),
+ digiline = { wire = { rules = {
+ {x = 1, y = 0, z = 0},
+ {x =-1, y = 0, z = 0},
+ {x = 0, y = 1, z = 0},
+ {x = 0, y =-1, z = 0},
+ {x = 0, y = 0, z = 1},
+ {x = 0, y = 0, z =-1}}}}
+})
+
+minetest.register_node("digistuff:button", {
+ drawtype = "nodebox",
+ tiles = {
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_off.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ legacy_wallmounted = true,
+ walkable = false,
+ sunlight_propagates = true,
+ selection_box = {
+ type = "fixed",
+ fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the thin plate behind the button
+ { -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
+ }
+ },
+ digiline =
+ {
+ receptor = {}
+ },
+ groups = {dig_immediate=2},
+ description = "Digilines Button",
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","size[8,4;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;msg;Message;${msg}]button_exit[2.25,3;3,1;submit;Save]")
+ end,
+ on_receive_fields = function(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ if fields.channel and fields.msg and fields.channel ~= "" and fields.msg ~= "" then
+ meta:set_string("channel",fields.channel)
+ meta:set_string("msg",fields.msg)
+ meta:set_string("formspec","")
+ minetest.swap_node(pos, {name = "digibutton:button_off", param2=minetest.get_node(pos).param2})
+ else
+ minetest.chat_send_player(sender:get_player_name(),"Channel and message must both be set!")
+ end
+ end,
+ sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node("digistuff:button_off", {
+ drawtype = "nodebox",
+ tiles = {
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_off.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ legacy_wallmounted = true,
+ walkable = false,
+ sunlight_propagates = true,
+ selection_box = {
+ type = "fixed",
+ fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the thin plate behind the button
+ { -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
+ }
+ },
+ digiline =
+ {
+ receptor = {}
+ },
+ groups = {dig_immediate=2, not_in_creative_inventory=1},
+ drop = "digistuff:button",
+ description = "Digilines Button (off state - you hacker you!)",
+ on_rightclick = function (pos, node, clicker)
+ local meta = minetest.get_meta(pos)
+ digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg"))
+ minetest.swap_node(pos, {name = "digistuff:button_on", param2=node.param2})
+ if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_push", {pos=pos}) end
+ minetest.after(0.5, digistuff.button_turnoff, pos)
+ end,
+ sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node("digistuff:button_on", {
+ drawtype = "nodebox",
+ tiles = {
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_sides.png",
+ "digistuff_digibutton_on.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ legacy_wallmounted = true,
+ walkable = false,
+ light_source = default.LIGHT_MAX-7,
+ sunlight_propagates = true,
+ selection_box = {
+ type = "fixed",
+ fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 },
+ { -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 }
+ }
+ },
+ digiline =
+ {
+ receptor = {}
+ },
+ groups = {dig_immediate=2, not_in_creative_inventory=1},
+ drop = 'digistuff:button',
+ on_rightclick = function (pos, node, clicker)
+ local meta = minetest.get_meta(pos)
+ digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg"))
+ if minetest.get_modpath("mesecons") then minetest.sound_play("mesecons_button_push", {pos=pos}) end
+ end,
+ description = "Digilines Button (on state - you hacker you!)",
+ sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_craft({
+ output = "digistuff:digimese",
+ recipe = {
+ {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000"},
+ {"digilines:wire_std_00000000","default:mese","digilines:wire_std_00000000"},
+ {"digilines:wire_std_00000000","digilines:wire_std_00000000","digilines:wire_std_00000000"}
+ }
+})
+
+minetest.register_craft({
+ output = "digistuff:button",
+ recipe = {
+ {"mesecons_button:button_off"},
+ {"mesecons_luacontroller:luacontroller0000"},
+ {"digilines:wire_std_00000000"}
+ }
+})
+
+minetest.register_alias("digibutton:button","digistuff:button")
+minetest.register_alias("digibutton:button_off","digistuff:button_off")
+minetest.register_alias("digibutton:button_on","digistuff:button_on")
+minetest.register_alias("digibutton:digimese","digistuff:digimese")
+
+minetest.register_node("digistuff:detector", {
+ tiles = {
+ "digistuff_digidetector.png"
+ },
+ digiline =
+ {
+ receptor = {}
+ },
+ groups = {cracky=2},
+ description = "Digilines Player Detector",
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","size[8,4;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;radius;Radius;${radius}]button_exit[2.25,3;3,1;submit;Save]")
+ end,
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ if fields.msg then meta:set_string("msg",fields.msg) end
+ if fields.radius then meta:set_string("radius",fields.radius) end
+ end,
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_abm({
+ nodenames = {"digistuff:detector"},
+ interval = 1.0,
+ chance = 1,
+ action = function(pos)
+ local meta = minetest.get_meta(pos)
+ local channel = meta:get_string("channel")
+ local radius = meta:get_string("radius")
+ local found_any = false
+ local players_found = {}
+ if not radius or not tonumber(radius) or tonumber(radius) < 1 or tonumber(radius) > 10 then radius = 6 end
+ local objs = minetest.get_objects_inside_radius(pos, radius)
+ if objs then
+ local _,obj
+ for _,obj in ipairs(objs) do
+ if obj:is_player() then
+ table.insert(players_found,obj:get_player_name())
+ found_any = true
+ end
+ end
+ if found_any then
+ digiline:receptor_send(pos, digiline.rules.default, channel, players_found)
+ end
+ end
+ end
+})
+
+minetest.register_node("digistuff:panel", {
+ description = "Digilines Control Panel",
+ groups = {cracky=3},
+ on_construct = function(pos)
+ local helpmsg = "Please set a channel."
+ digistuff.update_panel_formspec(pos,helpmsg)
+ minetest.get_meta(pos):set_int("locked",0)
+ end,
+ drawtype = "nodebox",
+ tiles = {
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_front.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, 0.4, 0.5, 0.5, 0.5 }
+ }
+ },
+ on_receive_fields = digistuff.panel_on_receive_fields,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = digistuff.panel_on_digiline_receive
+ },
+ },
+})
+
+minetest.register_craft({
+ output = "digistuff:detector",
+ recipe = {
+ {"mesecons_detector:object_detector_off"},
+ {"mesecons_luacontroller:luacontroller0000"},
+ {"digilines:wire_std_00000000"}
+ }
+})
+
+minetest.register_craft({
+ output = "digistuff:panel",
+ recipe = {
+ {"","digistuff:button",""},
+ {"digistuff:button","digilines:lcd","digistuff:button"},
+ {"","digistuff:button",""}
+ }
+})
+
+minetest.register_craft({
+ output = "digistuff:touchscreen",
+ recipe = {
+ {"mesecons_luacontroller:luacontroller0000","default:glass","default:glass"},
+ {"default:glass","digilines:lcd","default:glass"},
+ {"default:glass","default:glass","default:glass"}
+ }
+})
+
+minetest.register_node("digistuff:touchscreen", {
+ description = "Digilines Touchscreen",
+ groups = {cracky=3},
+ on_construct = function(pos)
+ digistuff.update_ts_formspec(pos,true)
+ end,
+ drawtype = "nodebox",
+ tiles = {
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_panel_back.png",
+ "digistuff_ts_front.png"
+ },
+ paramtype = "light",
+ paramtype2 = "facedir",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, 0.4, 0.5, 0.5, 0.5 }
+ }
+ },
+ on_receive_fields = digistuff.ts_on_receive_fields,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = digistuff.ts_on_digiline_receive
+ },
+ },
+})
+
+minetest.register_node("digistuff:piezo", {
+ description = "Digilines Piezoelectric Beeper",
+ groups = {cracky=3},
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","field[channel;Channel;${channel}")
+ end,
+ on_destruct = function(pos)
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ end,
+ tiles = {
+ "digistuff_piezo_top.png",
+ "digistuff_piezo_sides.png",
+ "digistuff_piezo_sides.png",
+ "digistuff_piezo_sides.png",
+ "digistuff_piezo_sides.png",
+ "digistuff_piezo_sides.png"
+ },
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ end,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = function(pos,node,channel,msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then return end
+ if msg == "shortbeep" then
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ minetest.sound_play({name = "digistuff_piezo_short_single",gain = 0.2},{pos = pos,max_hear_distance = 16})
+ elseif msg == "longbeep" then
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ minetest.sound_play({name = "digistuff_piezo_long_single",gain = 0.2},{pos = pos,max_hear_distance = 16})
+ elseif msg == "fastrepeat" then
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ digistuff.sounds_playing[pos_hash] = minetest.sound_play({name = "digistuff_piezo_fast_repeat",gain = 0.2},{pos = pos,max_hear_distance = 16,loop = true})
+ elseif msg == "slowrepeat" then
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ digistuff.sounds_playing[pos_hash] = minetest.sound_play({name = "digistuff_piezo_slow_repeat",gain = 0.2},{pos = pos,max_hear_distance = 16,loop = true})
+ elseif msg == "stop" then
+ local pos_hash = minetest.hash_node_position(pos)
+ if digistuff.sounds_playing[pos_hash] then
+ minetest.sound_stop(digistuff.sounds_playing[pos_hash])
+ digistuff.sounds_playing[pos_hash] = nil
+ end
+ end
+ end
+ },
+ },
+})
+
+local http = minetest.request_http_api()
+
+if http then
+ minetest.register_node("digistuff:nic", {
+ description = "Digilines NIC",
+ groups = {cracky=3},
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","field[channel;Channel;${channel}")
+ end,
+ tiles = {
+ "digistuff_nic_top.png",
+ "jeija_microcontroller_bottom.png",
+ "jeija_microcontroller_sides.png",
+ "jeija_microcontroller_sides.png",
+ "jeija_microcontroller_sides.png",
+ "jeija_microcontroller_sides.png"
+ },
+ drawtype = "nodebox",
+ selection_box = {
+ --From luacontroller
+ type = "fixed",
+ fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 },
+ },
+ node_box = {
+ --From Luacontroller
+ type = "fixed",
+ fixed = {
+ {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, -- Bottom slab
+ {-5/16, -7/16, -5/16, 5/16, -6/16, 5/16}, -- Circuit board
+ {-3/16, -6/16, -3/16, 3/16, -5/16, 3/16}, -- IC
+ }
+ },
+ paramtype = "light",
+ sunlight_propagates = true,
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ end,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = function(pos,node,channel,msg)
+ local meta = minetest.get_meta(pos)
+ if meta:get_string("channel") ~= channel then return end
+ if type(msg) ~= "string" then return end
+ http.fetch({
+ url = msg,
+ timeout = 5,
+ user_agent = "Minetest Digilines Modem",
+ },
+ function(res)
+ digiline:receptor_send(pos, digiline.rules.default, channel, res)
+ end)
+ end
+ },
+ },
+ })
+ minetest.register_craft({
+ output = "digistuff:nic",
+ recipe = {
+ {"","","mesecons:wire_00000000_off"},
+ {"digilines:wire_std_00000000","mesecons_luacontroller:luacontroller0000","mesecons:wire_00000000_off"}
+ }
+ })
+end
+
+minetest.register_node("digistuff:camera", {
+ tiles = {
+ "digistuff_camera_top.png",
+ "digistuff_camera_bottom.png",
+ "digistuff_camera_right.png",
+ "digistuff_camera_left.png",
+ "digistuff_camera_back.png",
+ "digistuff_camera_front.png",
+ },
+ digiline =
+ {
+ receptor = {}
+ },
+ groups = {cracky=2},
+ paramtype = "light",
+ paramtype2 = "facedir",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.1,-0.5,-0.28,0.1,-0.3,0.3}, --Camera Body
+ {-0.045,-0.42,-0.34,0.045,-0.36,-0.28}, -- Lens
+ {-0.05,-0.9,-0.05,0.05,-0.5,0.05}, --Pole
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.1,-0.5,-0.34,0.1,-0.3,0.3}, --Camera Body
+ }
+ },
+ description = "Digilines Camera",
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","size[8,6;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;radius;Radius (max 10);${radius}]field[1,3;6,2;distance;Distance (max 20);${distance}]button_exit[2.25,4;3,1;submit;Save]")
+ end,
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ if fields.distance and tonumber(fields.distance) then meta:set_int("distance",math.max(math.min(20,fields.distance),0)) end
+ if fields.radius and tonumber(fields.radius) then meta:set_int("radius",math.max(math.min(10,fields.radius),1)) end
+ end,
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_abm({
+ nodenames = {"digistuff:camera"},
+ interval = 1.0,
+ chance = 1,
+ action = function(pos,node)
+ local meta = minetest.get_meta(pos)
+ local channel = meta:get_string("channel")
+ local radius = meta:get_int("radius")
+ local distance = meta:get_int("distance")
+ local dir = vector.multiply(minetest.facedir_to_dir(node.param2),-1)
+ local spot = vector.add(pos,vector.multiply(dir,distance))
+ local i = 0
+ while i <= 10 and minetest.get_node(spot).name == "air" do
+ --Downward search for ground level
+ spot = vector.add(spot,vector.new(0,-1,0))
+ i = i + 1
+ end
+ if minetest.get_node(spot).name == "air" or minetest.get_node(spot).name == "ignore" then
+ --Ground not in range
+ return
+ end
+
+ local found_any = false
+ local players_found = {}
+ local objs = minetest.get_objects_inside_radius(spot,radius)
+ if objs then
+ local _,obj
+ for _,obj in ipairs(objs) do
+ if obj:is_player() then
+ table.insert(players_found,obj:get_player_name())
+ found_any = true
+ end
+ end
+ if found_any then
+ digiline:receptor_send({x=pos.x,y=pos.y-1,z=pos.z}, digiline.rules.default, channel, players_found)
+ end
+ end
+ end
+})
+
+minetest.register_craft({
+ output = "digistuff:camera",
+ recipe = {
+ {"homedecor:plastic_sheeting","homedecor:plastic_sheeting","homedecor:plastic_sheeting"},
+ {"default:glass","homedecor:ic","mesecons_luacontroller:luacontroller0000"},
+ {"homedecor:plastic_sheeting","homedecor:plastic_sheeting","homedecor:plastic_sheeting"},
+ }
+})
diff --git a/digistuff/sounds/digistuff_piezo_fast_repeat.ogg b/digistuff/sounds/digistuff_piezo_fast_repeat.ogg
new file mode 100644
index 0000000..be035da
--- /dev/null
+++ b/digistuff/sounds/digistuff_piezo_fast_repeat.ogg
Binary files differ
diff --git a/digistuff/sounds/digistuff_piezo_long_single.ogg b/digistuff/sounds/digistuff_piezo_long_single.ogg
new file mode 100644
index 0000000..435ac61
--- /dev/null
+++ b/digistuff/sounds/digistuff_piezo_long_single.ogg
Binary files differ
diff --git a/digistuff/sounds/digistuff_piezo_short_single.ogg b/digistuff/sounds/digistuff_piezo_short_single.ogg
new file mode 100644
index 0000000..0178f15
--- /dev/null
+++ b/digistuff/sounds/digistuff_piezo_short_single.ogg
Binary files differ
diff --git a/digistuff/sounds/digistuff_piezo_slow_repeat.ogg b/digistuff/sounds/digistuff_piezo_slow_repeat.ogg
new file mode 100644
index 0000000..1b35343
--- /dev/null
+++ b/digistuff/sounds/digistuff_piezo_slow_repeat.ogg
Binary files differ
diff --git a/digistuff/textures/digistuff_adwaita_edit-undo.png b/digistuff/textures/digistuff_adwaita_edit-undo.png
new file mode 100644
index 0000000..ab01729
--- /dev/null
+++ b/digistuff/textures/digistuff_adwaita_edit-undo.png
Binary files differ
diff --git a/digistuff/textures/digistuff_adwaita_emblem-default.png b/digistuff/textures/digistuff_adwaita_emblem-default.png
new file mode 100644
index 0000000..4caba38
--- /dev/null
+++ b/digistuff/textures/digistuff_adwaita_emblem-default.png
Binary files differ
diff --git a/digistuff/textures/digistuff_adwaita_go-down.png b/digistuff/textures/digistuff_adwaita_go-down.png
new file mode 100644
index 0000000..53cedf0
--- /dev/null
+++ b/digistuff/textures/digistuff_adwaita_go-down.png
Binary files differ
diff --git a/digistuff/textures/digistuff_adwaita_go-next.png b/digistuff/textures/digistuff_adwaita_go-next.png
new file mode 100644
index 0000000..3b7d049
--- /dev/null
+++ b/digistuff/textures/digistuff_adwaita_go-next.png
Binary files differ
diff --git a/digistuff/textures/digistuff_adwaita_go-previous.png b/digistuff/textures/digistuff_adwaita_go-previous.png
new file mode 100644
index 0000000..0df44ef
--- /dev/null
+++ b/digistuff/textures/digistuff_adwaita_go-previous.png
Binary files differ
diff --git a/digistuff/textures/digistuff_adwaita_go-up.png b/digistuff/textures/digistuff_adwaita_go-up.png
new file mode 100644
index 0000000..e13742a
--- /dev/null
+++ b/digistuff/textures/digistuff_adwaita_go-up.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_back.png b/digistuff/textures/digistuff_camera_back.png
new file mode 100644
index 0000000..61653a7
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_back.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_bottom.png b/digistuff/textures/digistuff_camera_bottom.png
new file mode 100644
index 0000000..72bce61
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_bottom.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_front.png b/digistuff/textures/digistuff_camera_front.png
new file mode 100644
index 0000000..4981c98
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_front.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_left.png b/digistuff/textures/digistuff_camera_left.png
new file mode 100644
index 0000000..0243ad1
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_left.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_pole.png b/digistuff/textures/digistuff_camera_pole.png
new file mode 100644
index 0000000..49a5ef8
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_pole.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_right.png b/digistuff/textures/digistuff_camera_right.png
new file mode 100644
index 0000000..5dca35f
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_right.png
Binary files differ
diff --git a/digistuff/textures/digistuff_camera_top.png b/digistuff/textures/digistuff_camera_top.png
new file mode 100644
index 0000000..fca75f8
--- /dev/null
+++ b/digistuff/textures/digistuff_camera_top.png
Binary files differ
diff --git a/digistuff/textures/digistuff_digibutton_off.png b/digistuff/textures/digistuff_digibutton_off.png
new file mode 100644
index 0000000..9e4506b
--- /dev/null
+++ b/digistuff/textures/digistuff_digibutton_off.png
Binary files differ
diff --git a/digistuff/textures/digistuff_digibutton_on.png b/digistuff/textures/digistuff_digibutton_on.png
new file mode 100644
index 0000000..1466179
--- /dev/null
+++ b/digistuff/textures/digistuff_digibutton_on.png
Binary files differ
diff --git a/digistuff/textures/digistuff_digibutton_sides.png b/digistuff/textures/digistuff_digibutton_sides.png
new file mode 100644
index 0000000..9b79b57
--- /dev/null
+++ b/digistuff/textures/digistuff_digibutton_sides.png
Binary files differ
diff --git a/digistuff/textures/digistuff_digidetector.png b/digistuff/textures/digistuff_digidetector.png
new file mode 100644
index 0000000..42902f3
--- /dev/null
+++ b/digistuff/textures/digistuff_digidetector.png
Binary files differ
diff --git a/digistuff/textures/digistuff_digimese.png b/digistuff/textures/digistuff_digimese.png
new file mode 100644
index 0000000..aa6b97b
--- /dev/null
+++ b/digistuff/textures/digistuff_digimese.png
Binary files differ
diff --git a/digistuff/textures/digistuff_nic_top.png b/digistuff/textures/digistuff_nic_top.png
new file mode 100644
index 0000000..da49613
--- /dev/null
+++ b/digistuff/textures/digistuff_nic_top.png
Binary files differ
diff --git a/digistuff/textures/digistuff_panel_back.png b/digistuff/textures/digistuff_panel_back.png
new file mode 100644
index 0000000..b1a5344
--- /dev/null
+++ b/digistuff/textures/digistuff_panel_back.png
Binary files differ
diff --git a/digistuff/textures/digistuff_panel_bg.png b/digistuff/textures/digistuff_panel_bg.png
new file mode 100644
index 0000000..d357b1b
--- /dev/null
+++ b/digistuff/textures/digistuff_panel_bg.png
Binary files differ
diff --git a/digistuff/textures/digistuff_panel_front.png b/digistuff/textures/digistuff_panel_front.png
new file mode 100644
index 0000000..d3083fa
--- /dev/null
+++ b/digistuff/textures/digistuff_panel_front.png
Binary files differ
diff --git a/digistuff/textures/digistuff_panel_locked.png b/digistuff/textures/digistuff_panel_locked.png
new file mode 100644
index 0000000..5e523a6
--- /dev/null
+++ b/digistuff/textures/digistuff_panel_locked.png
Binary files differ
diff --git a/digistuff/textures/digistuff_panel_unlocked.png b/digistuff/textures/digistuff_panel_unlocked.png
new file mode 100644
index 0000000..c94f26c
--- /dev/null
+++ b/digistuff/textures/digistuff_panel_unlocked.png
Binary files differ
diff --git a/digistuff/textures/digistuff_piezo_sides.png b/digistuff/textures/digistuff_piezo_sides.png
new file mode 100644
index 0000000..7d66228
--- /dev/null
+++ b/digistuff/textures/digistuff_piezo_sides.png
Binary files differ
diff --git a/digistuff/textures/digistuff_piezo_top.png b/digistuff/textures/digistuff_piezo_top.png
new file mode 100644
index 0000000..44f8e07
--- /dev/null
+++ b/digistuff/textures/digistuff_piezo_top.png
Binary files differ
diff --git a/digistuff/textures/digistuff_ts_bg.png b/digistuff/textures/digistuff_ts_bg.png
new file mode 100644
index 0000000..87c54f2
--- /dev/null
+++ b/digistuff/textures/digistuff_ts_bg.png
Binary files differ
diff --git a/digistuff/textures/digistuff_ts_front.png b/digistuff/textures/digistuff_ts_front.png
new file mode 100644
index 0000000..bd4c326
--- /dev/null
+++ b/digistuff/textures/digistuff_ts_front.png
Binary files differ