From 842a6d94916296912aba934b2b23d59244ea463b Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 3 Jun 2016 19:16:56 -0400 Subject: update castle, colormachine, moreblocks, pipeworks, tpr, and digilines --- digilines/lcd.lua | 233 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 digilines/lcd.lua (limited to 'digilines/lcd.lua') diff --git a/digilines/lcd.lua b/digilines/lcd.lua new file mode 100644 index 0000000..3370a31 --- /dev/null +++ b/digilines/lcd.lua @@ -0,0 +1,233 @@ +--* parts are currently not possible because you cannot set the pitch of an entity from lua + +-- Font: 04.jp.org + +-- load characters map +local chars_file = io.open(minetest.get_modpath("digilines").."/characters", "r") +local charmap = {} +local max_chars = 12 +if not chars_file then + print("[digilines] E: LCD: character map file not found") +else + while true do + local char = chars_file:read("*l") + if char == nil then + break + end + local img = chars_file:read("*l") + chars_file:read("*l") + charmap[char] = img + end +end + +local lcds = { + -- on ceiling + --* [0] = {delta = {x = 0, y = 0.4, z = 0}, pitch = math.pi / -2}, + -- on ground + --* [1] = {delta = {x = 0, y =-0.4, z = 0}, pitch = math.pi / 2}, + -- sides + [2] = {delta = {x = 0.4, y = 0, z = 0}, yaw = math.pi / -2}, + [3] = {delta = {x = -0.4, y = 0, z = 0}, yaw = math.pi / 2}, + [4] = {delta = {x = 0, y = 0, z = 0.4}, yaw = 0}, + [5] = {delta = {x = 0, y = 0, z = -0.4}, yaw = math.pi}, +} + +local reset_meta = function(pos) + minetest.get_meta(pos):set_string("formspec", "field[channel;Channel;${channel}]") +end + +local clearscreen = function(pos) + local objects = minetest.get_objects_inside_radius(pos, 0.5) + for _, o in ipairs(objects) do + local o_entity = o:get_luaentity() + if o_entity and o_entity.name == "digilines_lcd:text" then + o:remove() + end + end +end + +local prepare_writing = function(pos) + local lcd_info = lcds[minetest.get_node(pos).param2] + if lcd_info == nil then return end + local text = minetest.add_entity( + {x = pos.x + lcd_info.delta.x, + y = pos.y + lcd_info.delta.y, + z = pos.z + lcd_info.delta.z}, "digilines_lcd:text") + text:setyaw(lcd_info.yaw or 0) + --* text:setpitch(lcd_info.yaw or 0) + return text +end + +local on_digiline_receive = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + if setchan ~= channel then return end + + meta:set_string("text", msg) + meta:set_string("infotext", msg) + clearscreen(pos) + if msg ~= "" then + prepare_writing(pos) + end +end + +local lcd_box = { + type = "wallmounted", + wall_top = {-8/16, 7/16, -8/16, 8/16, 8/16, 8/16} +} + +minetest.register_alias("digilines_lcd:lcd", "digilines:lcd") +minetest.register_node("digilines:lcd", { + drawtype = "nodebox", + description = "Digiline LCD", + inventory_image = "lcd_lcd.png", + wield_image = "lcd_lcd.png", + tiles = {"lcd_anyside.png"}, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + node_box = lcd_box, + selection_box = lcd_box, + groups = {choppy = 3, dig_immediate = 2}, + + after_place_node = function (pos, placer, itemstack) + local param2 = minetest.get_node(pos).param2 + if param2 == 0 or param2 == 1 then + minetest.add_node(pos, {name = "digilines:lcd", param2 = 3}) + end + prepare_writing (pos) + end, + + on_construct = function(pos) + reset_meta(pos) + end, + + on_destruct = function(pos) + clearscreen(pos) + 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 + if (fields.channel) then + minetest.get_meta(pos):set_string("channel", fields.channel) + end + end, + + digiline = + { + receptor = {}, + effector = { + action = on_digiline_receive + }, + }, + + light_source = 6, +}) + +minetest.register_entity(":digilines_lcd:text", { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + + on_activate = function(self) + local meta = minetest.get_meta(self.object:getpos()) + local text = meta:get_string("text") + self.object:set_properties({textures={generate_texture(create_lines(text))}}) + end +}) + +-- CONSTANTS +local LCD_WITH = 100 +local LCD_PADDING = 8 + +local LINE_LENGTH = 12 +local NUMBER_OF_LINES = 5 + +local LINE_HEIGHT = 14 +local CHAR_WIDTH = 5 + +create_lines = function(text) + local line = "" + local line_num = 1 + local tab = {} + for word in string.gmatch(text, "%S+") do + if string.len(line)+string.len(word) < LINE_LENGTH and word ~= "|" then + if line ~= "" then + line = line.." "..word + else + line = word + end + else + table.insert(tab, line) + if word ~= "|" then + line = word + else + line = "" + end + line_num = line_num+1 + if line_num > NUMBER_OF_LINES then + return tab + end + end + end + table.insert(tab, line) + return tab +end + +generate_texture = function(lines) + local texture = "[combine:"..LCD_WITH.."x"..LCD_WITH + local ypos = 16 + for i = 1, #lines do + texture = texture..generate_line(lines[i], ypos) + ypos = ypos + LINE_HEIGHT + end + return texture +end + +generate_line = function(s, ypos) + local i = 1 + local parsed = {} + local width = 0 + local chars = 0 + while chars < max_chars and i <= #s do + local file = nil + if charmap[s:sub(i, i)] ~= nil then + file = charmap[s:sub(i, i)] + i = i + 1 + elseif i < #s and charmap[s:sub(i, i + 1)] ~= nil then + file = charmap[s:sub(i, i + 1)] + i = i + 2 + else + print("[digilines] W: LCD: unknown symbol in '"..s.."' at "..i) + i = i + 1 + end + if file ~= nil then + width = width + CHAR_WIDTH + table.insert(parsed, file) + chars = chars + 1 + end + end + width = width - 1 + + local texture = "" + local xpos = math.floor((LCD_WITH - 2 * LCD_PADDING - width) / 2 + LCD_PADDING) + for i = 1, #parsed do + texture = texture..":"..xpos..","..ypos.."="..parsed[i]..".png" + xpos = xpos + CHAR_WIDTH + 1 + end + return texture +end + +minetest.register_craft({ + output = "digilines:lcd 2", + recipe = { + {"default:steel_ingot", "digilines:wire_std_00000000", "default:steel_ingot"}, + {"mesecons_lightstone:lightstone_green_off","mesecons_lightstone:lightstone_green_off","mesecons_lightstone:lightstone_green_off"}, + {"default:glass","default:glass","default:glass"} + } +}) -- cgit v1.2.3