Compare commits
64 Commits
20180815-1
...
20180821-1
Author | SHA1 | Date | |
---|---|---|---|
4658f9eeff | |||
57cdabac78 | |||
07f41b13d8 | |||
9ca24f1f10 | |||
45ec33e78c | |||
f5512c4837 | |||
f7155b385e | |||
4c804e1851 | |||
87ebd877b8 | |||
3ba2dbd1bd | |||
452102cc7c | |||
bee8d5c32d | |||
5cf5e0318a | |||
65a22e1c8e | |||
c703dbfa74 | |||
0cacd9af9c | |||
06b419a905 | |||
010dab660b | |||
5826209f16 | |||
b25b3ef995 | |||
b8a0f1cbb7 | |||
3d5380ef25 | |||
3df1e6454b | |||
e8c0fa93ca | |||
ab0582ff97 | |||
4af469f1aa | |||
d9499481cf | |||
1823b6f0e5 | |||
02216ee611 | |||
10dcad8e06 | |||
898a027a77 | |||
922efe9210 | |||
81a06dc054 | |||
d47f2746d7 | |||
68b748a741 | |||
3cee6172ae | |||
0db84edb1e | |||
81a52b2e0f | |||
053ee765c0 | |||
57d4c99eb8 | |||
244b5011a1 | |||
3141aa5ba7 | |||
c647effff2 | |||
ce9666cc48 | |||
4d1d90cccc | |||
5ed4d1ef27 | |||
ee77614b97 | |||
d0d127e837 | |||
b9a0656407 | |||
4bb68ec009 | |||
161623e869 | |||
d182766236 | |||
09e5607d7a | |||
b9dd38c0de | |||
4fa6d54a4b | |||
157e517663 | |||
e622f94dfc | |||
be7f72dfeb | |||
ec2cfdd87d | |||
2faab30e19 | |||
3a02591d28 | |||
bd0e7d9bfa | |||
06d19f0d2e | |||
b33de7a530 |
76
README.md
@ -1,48 +1,84 @@
|
|||||||
# LED marquee mod
|
|
||||||
|
|
||||||
*by Vanessa Dannenberg*
|
|
||||||
|
|
||||||
This mod provides set of alphanumeric LED marquee panels, controlled by Mesecons' Digilines mod.
|
This mod provides set of alphanumeric LED marquee panels, controlled by Mesecons' Digilines mod.
|
||||||
|
|
||||||
Simply place a panel, right-click it, and set a channel.
|
Simply place one or more panels, and set a channel on just the left-most or upper-left one.
|
||||||
|
|
||||||
Then send a character, a string, or one of several control words to that channel from a Mesecons Lua Controller and the mod will try to display it. The panels use the standard 7-bit ASCII character set (with a few alterations).
|
Then send a character, a string, or one of several control words or codes to that channel from a Mesecons Lua Controller and the mod will try to display it.
|
||||||
|
|
||||||
A single character will be displayed on the connected panel.
|
A single character will be displayed on the connected panel.
|
||||||
|
|
||||||
Strings will be displayed using all panels in a lineup, so long as they all face the same way, starting from the panel the Lua Controller is connected to, going left to right. The other panels in the line do not need to be connected to anything - think of them as being connected together internally. Only the panel at the far left need be connected to the Lua Controller.
|
A numeric message (i.e. not a string) will be converted into a string.
|
||||||
|
|
||||||
|
Strings of all types (other than the keywords below) will be displayed using all panels in a lineup, so long as they all face the same way, starting from the panel the Lua Controller is connected to, going left to right. The other panels in the line do not need to be connected to anything - think of them as being connected together internally. Only the panel at the far left need be connected to the Lua Controller.
|
||||||
|
|
||||||
The string will spread down the line until either a panel is found that faces the wrong way, or has a channel that's not empty/nil and is set to something other than what the first is set to, or if a node is encountered that is not an alpha-numeric panel at all.
|
The string will spread down the line until either a panel is found that faces the wrong way, or has a channel that's not empty/nil and is set to something other than what the first is set to, or if a node is encountered that is not an alpha-numeric panel at all.
|
||||||
|
|
||||||
Panels to the left of the connected one are ignored (unless they, too, have their own connections).
|
Panels to the left of the connected one are ignored (unless they, too, have their own connections).
|
||||||
|
|
||||||
You can put multiple lines of panels end to end to form independent displays, so long as the panels that start each of the lines have unique channel names set.
|
You can also stack up a wall of LED panels, of any horizontal and vertical amount. If you then set a channel on the upper left panel, leave the others un-set, and connect a LuaController to it via digilines, the whole wall of panels will be treated as a multi-line display.
|
||||||
|
|
||||||
The string is padded with spaces and then trimmed to 64 characters.
|
Long strings sent to that channel will be displayed starting at the upper-left and working from left to right, top to bottom, wrapping from line to line as appropriate (similar to printing to a shell terminal).
|
||||||
|
|
||||||
Any unrecognized symbol or character outside the ASCII 32 - 129 range, whether part of a string or singularly is ignored, except as noted below.
|
As with a single line, printing continues from node to node until the program either finds a panel with a different non-empty channel than the first one, or if it finds a panel that's facing the wrong way.
|
||||||
|
|
||||||
|
If the program finds something other than a panel, it wraps to the next line. If it finds something other than a panel twice in a row, that signals that text has wrapped off of the last row, and printing is cut off there.
|
||||||
|
|
||||||
|
Lines of panels don't need to be all the same length, the program will wrap as needed, with the left margin always being aligned with the panel the LuaController is connected to.
|
||||||
|
|
||||||
|
Strings are trimmed to 6 kB.
|
||||||
|
|
||||||
|
Panels are not erased between prints.
|
||||||
|
|
||||||
|
Any unrecognized symbol or character, whether part of a string or singularly is ignored, except as noted below.
|
||||||
|
|
||||||
|
This mod uses the full ISO-8859-1 character set (see https://en.wikipedia.org/wiki/ISO/IEC_8859-1 for details), plus a bunch of symbols stuffed into the normally-empty 128-159 range that should be useful on this sort of display:
|
||||||
|
|
||||||
|
* 128,129: musical notes
|
||||||
|
* 130-140: box drawing glyphs
|
||||||
|
* 141-144: block shades
|
||||||
|
* 145-152: arrows
|
||||||
|
* 153-156: explosion/splat
|
||||||
|
* 157-159: smileys
|
||||||
|
|
||||||
|
If a string is prefixed with character code 255, it is treated as UTF-8 and passed through a simple translation function. Only characters with codes greater than 159 are altered; normal ASCII text, color codes, control codes, and the above symbols are passed through unchanged. Note that in this mode, a character code over 159 is treated as the first byte of a two-byte symbol.
|
||||||
|
|
||||||
The panels also respond to these control messages:
|
The panels also respond to these control messages:
|
||||||
|
|
||||||
* the words "off", "colon" and "period" translate to a blank space, ":", and ".", respectively.
|
* "clear" turns all panels in a lineup or wall off, or up to 2048 of them, anyway - essentially a "clear screen" command.
|
||||||
* "del" or character code 127 displays a square with an X in it
|
* "allon" fills all panels in a lineup/wall, up to a max of 2048 of them, with char(144), i.e. the reverse of "clear".
|
||||||
* "allon" or character code 128 will turn on all LEDs on the panel.
|
* "start_scroll" starts the automatic scrolling function, repeatedly moving the last displayed message to the left one character space each time the scroll timer runs out (and automatically restarting it, natch). The scroll action will spread across the line, and down a multi-line wall (just set a new, different channel on the first row you want to exclude), and will continue until "stop_scroll" or any displayable message is received.
|
||||||
* "cursor" or character code 129 will display a short, thick line at the bottom of the panel.
|
|
||||||
* "off_multi" turns all panels in a lineup off
|
|
||||||
* "allon_multi" turns on all LEDs of all panels in a lineup.
|
|
||||||
|
|
||||||
A byte value of 0 to 30 will change colors (i.e. string.char(0 to 30) ). Color values 0 to 11 are:
|
As it advances through the message, the scroll code will search through the message for a printable character, on each scroll step, basically stripping-out color code, and using just the last one before the new start position. This is done in order to keep a constant visible speed (the text will still be colored properly though).
|
||||||
|
* "stop_scroll" does just what it says - it stops the auto-scroll timer.
|
||||||
|
* "scroll_speed" followed by a decimal number (in the string, not a byte value) sets the time between scroll steps. Minimum 0.5s, maximum 5s.
|
||||||
|
* "scroll_step" will immediately advance the last-displayed message by one character. Omit the above automatic scrolling keywords, and use ONLY this keyword instead if you want to let your LuaController control the scrolling speed. Optionally, you can follow this with a number and the scroll code will skip forward that many bytes into the message, starting from the current position, before starting the above-mentioned color-vs-character search. Essentially, this value will roughly translate to the number of printable characters to skip.
|
||||||
|
* "get" will read the one character (as a numerical character value) currently displayed by the master panel (by reading its node name)
|
||||||
|
* "getstr" will read the last-stored message for the entire lineup/wall (from the master panel's meta). Note that even if the message has been or is being scrolled, you'll get the original stored message.
|
||||||
|
* "getindex" will read the scroll index position in that message, which will always point at a printable character, per the above color-versus-character search.
|
||||||
|
|
||||||
|
During a scroll event, the printed string is padded with spaces (one in auto mode, or as many as the skip value when manually stepping).
|
||||||
|
|
||||||
|
If you need vertical scrolling, you will have to handle that yourself (since the size of a screen/wall is not hard-coded).
|
||||||
|
|
||||||
|
To change colors, put a "/" followed by a digit or a letter from "A" to "R" (or "a" to "r") into your printed string. Digits 0 to 9 trigger colors 0 to 9 (obviously :-) ), while A/a through R/r set colors 10 to 27. Any other sequence is invalid and will just be printed literally. Two slashes "//" will translated to a single char(30) internally, and displayed as a single slash (doing it that way makes the code easier).
|
||||||
|
|
||||||
|
Color values 0 to 11 are:
|
||||||
|
|
||||||
Red (0), orange, yellow, lime, green, aqua, cyan, sky blue, blue, violet, magenta, or red-violet (11)
|
Red (0), orange, yellow, lime, green, aqua, cyan, sky blue, blue, violet, magenta, or red-violet (11)
|
||||||
|
|
||||||
Colors 12 to 23 are the same as 0 to 11, but lower brightness.
|
Colors 12 to 23 are the same as 0 to 11, but lower brightness.
|
||||||
|
|
||||||
Colors 23 - 30 are white, light grey, medium grey, dim grey, light blue, brown, and pink.
|
Colors 24 - 27 are white, light grey, medium grey, and dim grey (or think of them as full bright white, a bit less bright, medium brightness, and dim white).
|
||||||
|
|
||||||
The left-most/"master" panel will remember the last color used, and defaults to red.
|
The last color that was used is stored in the left-most/upper-left "master" panel's metadata, and defaults to red. It should persist across reboots.
|
||||||
|
|
||||||
You can use "get" and "getstr" to read the one character from the connected panel. These messages will not read the other panels in the lineup.
|
char(10) will do its job as linefeed/newline.
|
||||||
|
|
||||||
|
char(29) signals a cursor position command. The next two byte values select a column and row, respectively. The next character after the row byte will be printed there, and the rest of the string then continues printing from that spot onward with normal line wrapping, colors and so forth. Note that any string that does NOT contain cursor positioning commands will automatically start printing at the upper-left.
|
||||||
|
|
||||||
|
Any number of color, line feed, and cursor position commands may be present in a string, making it possible to "frame-buffer" a screen full of text into a string before printing it.
|
||||||
|
|
||||||
All panels emit a small amount of light when displaying something.
|
All panels emit a small amount of light when displaying something.
|
||||||
|
|
||||||
The panels only mount on a wall.
|
The panels only mount on a wall.
|
||||||
|
|
||||||
|
The "master"/connected panel stores the last-displayed message and some other details in its metadata, so you may occasionally need to dig and re-place the panel if things go wonky (this won't happen during normal use, but it may happen if you're making lots of changes to the panels' layout, channel names, etc).
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
default
|
default
|
||||||
digilines
|
digilines
|
||||||
mesecons_luacontroller
|
mesecons_luacontroller
|
||||||
mesecons_microcontroller
|
mesecons_microcontroller?
|
||||||
mesecons_lamp
|
mesecons_lamp?
|
||||||
|
397
init.lua
@ -5,14 +5,92 @@ led_marquee = {}
|
|||||||
|
|
||||||
local S
|
local S
|
||||||
if minetest.get_modpath("intllib") then
|
if minetest.get_modpath("intllib") then
|
||||||
S = intllib.Getter()
|
S = intllib.make_gettext_pair()
|
||||||
else
|
else
|
||||||
S = function(s) return s end
|
S = function(s) return s end
|
||||||
end
|
end
|
||||||
|
|
||||||
local marquee_cbox = {
|
local color_to_char = {
|
||||||
type = "fixed",
|
"0",
|
||||||
fixed = { -16/32, -8/16, -16/32, 16/32, 8/16, -15/32 }
|
"1",
|
||||||
|
"2",
|
||||||
|
"3",
|
||||||
|
"4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"8",
|
||||||
|
"9",
|
||||||
|
"A",
|
||||||
|
"B",
|
||||||
|
"C",
|
||||||
|
"D",
|
||||||
|
"E",
|
||||||
|
"F",
|
||||||
|
"G",
|
||||||
|
"H",
|
||||||
|
"I",
|
||||||
|
"J",
|
||||||
|
"K",
|
||||||
|
"L",
|
||||||
|
"M",
|
||||||
|
"N",
|
||||||
|
"O",
|
||||||
|
"P",
|
||||||
|
"Q",
|
||||||
|
"R"
|
||||||
|
}
|
||||||
|
|
||||||
|
local char_to_color = {
|
||||||
|
["0"] = 0,
|
||||||
|
["1"] = 1,
|
||||||
|
["2"] = 2,
|
||||||
|
["3"] = 3,
|
||||||
|
["4"] = 4,
|
||||||
|
["5"] = 5,
|
||||||
|
["6"] = 6,
|
||||||
|
["7"] = 7,
|
||||||
|
["8"] = 8,
|
||||||
|
["9"] = 9,
|
||||||
|
|
||||||
|
["A"] = 10,
|
||||||
|
["B"] = 11,
|
||||||
|
["C"] = 12,
|
||||||
|
["D"] = 13,
|
||||||
|
["E"] = 14,
|
||||||
|
["F"] = 15,
|
||||||
|
["G"] = 16,
|
||||||
|
["H"] = 17,
|
||||||
|
["I"] = 18,
|
||||||
|
["J"] = 19,
|
||||||
|
["K"] = 20,
|
||||||
|
["L"] = 21,
|
||||||
|
["M"] = 22,
|
||||||
|
["N"] = 23,
|
||||||
|
["O"] = 24,
|
||||||
|
["P"] = 25,
|
||||||
|
["Q"] = 26,
|
||||||
|
["R"] = 27,
|
||||||
|
|
||||||
|
["a"] = 10,
|
||||||
|
["b"] = 11,
|
||||||
|
["c"] = 12,
|
||||||
|
["d"] = 13,
|
||||||
|
["e"] = 14,
|
||||||
|
["f"] = 15,
|
||||||
|
["g"] = 16,
|
||||||
|
["h"] = 17,
|
||||||
|
["i"] = 18,
|
||||||
|
["j"] = 19,
|
||||||
|
["k"] = 20,
|
||||||
|
["l"] = 21,
|
||||||
|
["m"] = 22,
|
||||||
|
["n"] = 23,
|
||||||
|
["o"] = 24,
|
||||||
|
["p"] = 25,
|
||||||
|
["q"] = 26,
|
||||||
|
["r"] = 27
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-- the following functions based on the so-named ones in Jeija's digilines mod
|
-- the following functions based on the so-named ones in Jeija's digilines mod
|
||||||
@ -31,51 +109,184 @@ local on_digiline_receive_std = function(pos, node, channel, msg)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- convert Lua's idea of a UTF-8 char to ISO-8859-1
|
||||||
|
|
||||||
|
-- first char is non-break space, 0xA0
|
||||||
|
local iso_chars=" ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||||
|
|
||||||
|
local get_iso = function(c)
|
||||||
|
local hb = string.byte(c,1) or 0
|
||||||
|
local lb = string.byte(c,2) or 0
|
||||||
|
local dec = lb+hb*256
|
||||||
|
local char = dec - 49664
|
||||||
|
if dec > 49855 then char = dec - 49856 end
|
||||||
|
return char
|
||||||
|
end
|
||||||
|
|
||||||
|
local make_iso = function(s)
|
||||||
|
local i = 1
|
||||||
|
local s2 = ""
|
||||||
|
while i <= string.len(s) do
|
||||||
|
if string.byte(s,i) > 159 then
|
||||||
|
s2 = s2..string.char(get_iso(string.sub(s, i, i+1)))
|
||||||
|
i = i + 2
|
||||||
|
else
|
||||||
|
s2 = s2..string.sub(s, i, i)
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return s2
|
||||||
|
end
|
||||||
|
|
||||||
|
-- scrolling
|
||||||
|
|
||||||
|
led_marquee.set_timer = function(pos, timeout)
|
||||||
|
local timer = minetest.get_node_timer(pos)
|
||||||
|
timer:stop()
|
||||||
|
if timeout > 0 then
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
timer:start(timeout)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
led_marquee.scroll_text = function(pos, elapsed, skip)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local msg = meta:get_string("last_msg")
|
||||||
|
local channel = meta:get_string("channel")
|
||||||
|
local index = meta:get_int("index")
|
||||||
|
local color = meta:get_int("last_color")
|
||||||
|
local colorchar = color_to_char[color+1]
|
||||||
|
if not index or index < 1 or not string.byte(msg, index) then index = 1 end
|
||||||
|
local len = string.len(msg)
|
||||||
|
skip = skip or 1
|
||||||
|
index = index + skip
|
||||||
|
|
||||||
|
-- search backward to find the most recent color code in the string
|
||||||
|
local r = index
|
||||||
|
while r > 0 and not string.match(string.sub(msg, r, r+1), "/[0-9A-Ra-r]") do
|
||||||
|
r = r - 1
|
||||||
|
end
|
||||||
|
if r == 0 then r = 1 end
|
||||||
|
if string.match(string.sub(msg, r, r+1), "/[0-9A-Ra-r]") then
|
||||||
|
colorchar = string.sub(msg, r+1, r+1)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- search forward to find the next printable symbol after the current index
|
||||||
|
local f = index
|
||||||
|
while f < len do
|
||||||
|
if string.match(string.sub(msg, f, f+1), "/[0-9A-Ra-r]") then
|
||||||
|
f = f + 2
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
led_marquee.display_msg(pos, channel, "/"..colorchar..string.sub(msg, f)..string.rep(" ", skip + 1))
|
||||||
|
meta:set_int("index", f)
|
||||||
|
if not elapsed or elapsed < 0.5 then return false end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
-- the nodes:
|
-- the nodes:
|
||||||
|
|
||||||
local fdir_to_right = {
|
local fdir_to_right = {
|
||||||
{ 1, 0 },
|
|
||||||
{ 0, -1 },
|
{ 0, -1 },
|
||||||
{ -1, 0 },
|
{ 0, -1 },
|
||||||
|
{ 0, -1 },
|
||||||
{ 0, 1 },
|
{ 0, 1 },
|
||||||
|
{ 1, 0 },
|
||||||
|
{ -1, 0 },
|
||||||
}
|
}
|
||||||
|
|
||||||
local padding = " "
|
local cbox = {
|
||||||
local allon = string.char(128)
|
type = "wallmounted",
|
||||||
for i = 1, 64 do
|
wall_top = { -8/16, 7/16, -8/16, 8/16, 8/16, 8/16 },
|
||||||
padding = padding.." "
|
wall_bottom = { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 },
|
||||||
allon = allon..string.char(128)
|
wall_side = { -8/16, -8/16, -8/16, -7/16, 8/16, 8/16 }
|
||||||
|
}
|
||||||
|
|
||||||
|
led_marquee.decode_color = function(msg)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local display_string = function(pos, channel, string)
|
led_marquee.display_msg = function(pos, channel, msg)
|
||||||
if string == "off_multi" then
|
msg = string.sub(msg, 1, 6144).." "
|
||||||
string = ""
|
if string.sub(msg,1,1) == string.char(255) then -- treat it as incoming UTF-8
|
||||||
elseif string == "allon_multi" then
|
msg = make_iso(string.sub(msg, 2, 6144))
|
||||||
string = allon
|
|
||||||
end
|
end
|
||||||
local padded_string = string.sub(string..padding, 1, 64)
|
|
||||||
local fdir = minetest.get_node(pos).param2 % 8
|
|
||||||
local pos2 = pos
|
|
||||||
local mastermeta = minetest.get_meta(pos)
|
|
||||||
local lastcolor = mastermeta:get_int("lastcolor")
|
|
||||||
if not lastcolor or lastcolor < 0 or lastcolor > 7 then
|
|
||||||
lastcolor = 0
|
|
||||||
mastermeta:set_int("lastcolor", 0)
|
|
||||||
end
|
|
||||||
for i = 1, 64 do
|
|
||||||
local node = minetest.get_node(pos2)
|
|
||||||
local meta = minetest.get_meta(pos2)
|
|
||||||
local setchan = meta:get_string("channel")
|
|
||||||
|
|
||||||
if not string.match(node.name, "led_marquee:char_") or (setchan ~= nil and setchan ~= "" and setchan ~= channel) then break end
|
local master_fdir = minetest.get_node(pos).param2 % 8
|
||||||
local asc = string.byte(padded_string, i, i)
|
local master_meta = minetest.get_meta(pos)
|
||||||
if (node.param2 % 8) == fdir and asc > 31 and asc < 130 then
|
local last_color = master_meta:get_int("last_color")
|
||||||
minetest.swap_node(pos2, { name = "led_marquee:char_"..asc, param2 = (node.param2 % 8) + (lastcolor*8)})
|
local pos2 = table.copy(pos)
|
||||||
|
if not last_color or last_color < 0 or last_color > 27 then
|
||||||
|
last_color = 0
|
||||||
|
master_meta:set_int("last_color", 0)
|
||||||
|
end
|
||||||
|
local i = 1
|
||||||
|
local len = string.len(msg)
|
||||||
|
local wrapped = nil
|
||||||
|
while i <= len do
|
||||||
|
local node = minetest.get_node(pos2)
|
||||||
|
local fdir = node.param2 % 8
|
||||||
|
local meta = minetest.get_meta(pos2)
|
||||||
|
local setchan = nil
|
||||||
|
if meta then setchan = meta:get_string("channel") end
|
||||||
|
local asc = string.byte(msg, i, i)
|
||||||
|
if not string.match(node.name, "led_marquee:char_") then
|
||||||
|
if not wrapped then
|
||||||
|
pos2.x = pos.x
|
||||||
|
pos2.y = pos2.y-1
|
||||||
|
pos2.z = pos.z
|
||||||
|
wrapped = true
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
elseif string.match(node.name, "led_marquee:char_")
|
||||||
|
and fdir ~= master_fdir or (setchan ~= nil and setchan ~= "" and setchan ~= channel) then
|
||||||
|
break
|
||||||
|
elseif asc == 10 then
|
||||||
|
pos2.x = pos.x
|
||||||
|
pos2.y = pos2.y-1
|
||||||
|
pos2.z = pos.z
|
||||||
|
i = i + 1
|
||||||
|
wrapped = nil
|
||||||
|
elseif asc == 29 then
|
||||||
|
local c = string.byte(msg, i+1, i+1) or 0
|
||||||
|
local r = string.byte(msg, i+2, i+2) or 0
|
||||||
|
pos2.x = pos.x + (fdir_to_right[fdir+1][1])*c
|
||||||
|
pos2.y = pos.y - r
|
||||||
|
pos2.z = pos.z + (fdir_to_right[fdir+1][2])*c
|
||||||
|
i = i + 3
|
||||||
|
wrapped = nil
|
||||||
|
elseif asc == 30 then -- translate to slash for printing
|
||||||
|
minetest.swap_node(pos2, { name = "led_marquee:char_47", param2 = master_fdir + (last_color*8)})
|
||||||
pos2.x = pos2.x + fdir_to_right[fdir+1][1]
|
pos2.x = pos2.x + fdir_to_right[fdir+1][1]
|
||||||
pos2.z = pos2.z + fdir_to_right[fdir+1][2]
|
pos2.z = pos2.z + fdir_to_right[fdir+1][2]
|
||||||
elseif asc < 31 then
|
i = i + 1
|
||||||
lastcolor = asc
|
elseif asc == 47 then -- slash
|
||||||
mastermeta:set_int("lastcolor", asc)
|
local ccode = string.sub(msg, i+1, i+1)
|
||||||
|
if ccode then
|
||||||
|
if char_to_color[ccode] then
|
||||||
|
last_color = char_to_color[ccode]
|
||||||
|
i = i + 2
|
||||||
|
else
|
||||||
|
minetest.swap_node(pos2, { name = "led_marquee:char_47", param2 = master_fdir + (last_color*8)})
|
||||||
|
pos2.x = pos2.x + fdir_to_right[fdir+1][1]
|
||||||
|
pos2.z = pos2.z + fdir_to_right[fdir+1][2]
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
master_meta:set_int("last_color", last_color)
|
||||||
|
wrapped = nil
|
||||||
|
elseif asc > 30 and asc < 256 then
|
||||||
|
minetest.swap_node(pos2, { name = "led_marquee:char_"..asc, param2 = master_fdir + (last_color*8)})
|
||||||
|
pos2.x = pos2.x + fdir_to_right[fdir+1][1]
|
||||||
|
pos2.z = pos2.z + fdir_to_right[fdir+1][2]
|
||||||
|
i = i + 1
|
||||||
|
wrapped = nil
|
||||||
|
else
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -83,92 +294,116 @@ end
|
|||||||
local on_digiline_receive_string = function(pos, node, channel, msg)
|
local on_digiline_receive_string = function(pos, node, channel, msg)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local setchan = meta:get_string("channel")
|
local setchan = meta:get_string("channel")
|
||||||
local lastcolor = meta:get_int("lastcolor")
|
local last_color = meta:get_int("last_color")
|
||||||
if not lastcolor or lastcolor < 0 or lastcolor > 7 then
|
if not last_color or last_color < 0 or last_color > 27 then
|
||||||
lastcolor = 0
|
last_color = 0
|
||||||
meta:set_int("lastcolor", 0)
|
meta:set_int("last_color", 0)
|
||||||
end
|
end
|
||||||
|
local fdir = node.param2 % 8
|
||||||
|
|
||||||
if setchan ~= channel then return end
|
if setchan ~= channel then return end
|
||||||
if msg and msg ~= "" and type(msg) == "string" then
|
if msg and msg ~= "" and type(msg) == "string" then
|
||||||
if string.len(msg) > 1 then
|
if string.len(msg) > 1 then
|
||||||
if msg == "off" then
|
if msg == "clear" then
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_32", param2 = (node.param2 % 8) + (lastcolor*8)})
|
led_marquee.set_timer(pos, 0)
|
||||||
elseif msg == "colon" then
|
msg = string.rep(" ", 2048)
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_58", param2 = (node.param2 % 8) + (lastcolor*8)})
|
meta:set_string("last_msg", msg)
|
||||||
elseif msg == "period" then
|
led_marquee.display_msg(pos, channel, msg)
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_46", param2 = (node.param2 % 8) + (lastcolor*8)})
|
meta:set_int("index", 1)
|
||||||
elseif msg == "del" then
|
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_127", param2 = (node.param2 % 8) + (lastcolor*8)})
|
|
||||||
elseif msg == "allon" then
|
elseif msg == "allon" then
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_128", param2 = (node.param2 % 8) + (lastcolor*8)})
|
led_marquee.set_timer(pos, 0)
|
||||||
elseif msg == "cursor" then
|
msg = string.rep(string.char(144), 2048)
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_129", param2 = (node.param2 % 8) + (lastcolor*8)})
|
meta:set_string("last_msg", msg)
|
||||||
|
led_marquee.display_msg(pos, channel, msg)
|
||||||
|
meta:set_int("index", 1)
|
||||||
|
elseif msg == "start_scroll" then
|
||||||
|
local timeout = meta:get_int("timeout")
|
||||||
|
if not timeout or timeout < 0.5 or timeout > 5 then timeout = 0 end
|
||||||
|
led_marquee.set_timer(pos, timeout)
|
||||||
|
elseif msg == "stop_scroll" then
|
||||||
|
led_marquee.set_timer(pos, 0)
|
||||||
|
return
|
||||||
|
elseif string.sub(msg, 1, 12) == "scroll_speed" then
|
||||||
|
local timeout = tonumber(string.sub(msg, 13))
|
||||||
|
if not timeout or timeout < 0.5 or timeout > 5 then timeout = 0 end
|
||||||
|
meta:set_int("timeout", timeout)
|
||||||
|
led_marquee.set_timer(pos, timeout)
|
||||||
|
elseif string.sub(msg, 1, 11) == "scroll_step" then
|
||||||
|
local skip = tonumber(string.sub(msg, 12))
|
||||||
|
led_marquee.scroll_text(pos, nil, skip)
|
||||||
|
elseif msg == "get" then -- get the master panel's displayed char as ASCII numerical value
|
||||||
|
digilines.receptor_send(pos, digiline.rules.default, channel, tonumber(string.match(minetest.get_node(pos).name,"led_marquee:char_(.+)"))) -- wonderfully horrible string manipulaiton
|
||||||
|
elseif msg == "getstr" then -- get the last stored message
|
||||||
|
digilines.receptor_send(pos, digiline.rules.default, channel, meta:get_string("last_msg"))
|
||||||
|
elseif msg == "getindex" then -- get the scroll index
|
||||||
|
digilines.receptor_send(pos, digiline.rules.default, channel, meta:get_int("index"))
|
||||||
else
|
else
|
||||||
display_string(pos, channel, msg)
|
msg = string.gsub(msg, "//", string.char(30))
|
||||||
|
led_marquee.set_timer(pos, 0)
|
||||||
|
meta:set_string("last_msg", msg)
|
||||||
|
led_marquee.display_msg(pos, channel, msg)
|
||||||
|
meta:set_int("index", 1)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
local asc = string.byte(msg)
|
local asc = string.byte(msg)
|
||||||
if asc > 31 and asc < 130 then
|
if asc > 29 and asc < 256 then
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_"..asc, param2 = (node.param2 % 8) + (lastcolor*8)})
|
minetest.swap_node(pos, { name = "led_marquee:char_"..asc, param2 = fdir + (last_color*8)})
|
||||||
elseif asc < 31 then
|
meta:set_string("last_msg", tostring(msg))
|
||||||
lastcolor = asc
|
meta:set_int("index", 1)
|
||||||
meta:set_int("lastcolor", asc)
|
|
||||||
elseif msg == "get" then -- get value as ASCII numerical value
|
|
||||||
digiline:receptor_send(pos, digiline.rules.default, channel, tonumber(string.match(minetest.get_node(pos).name,"led_marquee:char_(.+)"))) -- wonderfully horrible string manipulaiton
|
|
||||||
elseif msg == "getstr" then -- get actual char
|
|
||||||
digiline:receptor_send(pos, digiline.rules.default, channel, string.char(tonumber(string.match(minetest.get_node(pos).name,"led_marquee:char_(.+)"))))
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif msg and type(msg) == "number" then
|
elseif msg and type(msg) == "number" then
|
||||||
if msg == 0 then
|
meta:set_string("last_msg", tostring(msg))
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_32", param2 = (node.param2 % 8) + (lastcolor*8)})
|
led_marquee.display_msg(pos, channel, tostring(msg))
|
||||||
elseif msg > 31 and alnum_chars[msg - 31] ~= nil then
|
meta:set_int("index", 1)
|
||||||
minetest.swap_node(pos, { name = "led_marquee:char_"..tostring(msg), param2 = (node.param2 % 8) + (lastcolor*8)})
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 32, 129 do
|
-- the nodes!
|
||||||
|
|
||||||
|
for i = 31, 255 do
|
||||||
local groups = { cracky = 2, not_in_creative_inventory = 1}
|
local groups = { cracky = 2, not_in_creative_inventory = 1}
|
||||||
local light = LIGHT_MAX-2
|
local light = LIGHT_MAX-2
|
||||||
local description = S("Alphanumeric LED marquee panel ("..i..")")
|
local description = S("LED marquee panel ("..i..")")
|
||||||
local tiles = {
|
local tiles = {
|
||||||
{ name="led_marquee_base.png", color="white"},
|
{ name="led_marquee_base.png", color="white"},
|
||||||
{ name="led_marquee_leds_off.png", color="white"},
|
{ name="led_marquee_leds_off.png", color="white"},
|
||||||
"led_marquee_char_"..i..".png",
|
"led_marquee_char_"..i..".png",
|
||||||
}
|
}
|
||||||
|
|
||||||
if i == 32 then
|
if i == 31 then
|
||||||
groups = {cracky = 2}
|
|
||||||
light = nil
|
|
||||||
description = S("Alphanumeric LED marquee panel")
|
|
||||||
end
|
|
||||||
|
|
||||||
if i == 129 then
|
|
||||||
tiles = {
|
tiles = {
|
||||||
{ name="led_marquee_base.png", color="white"},
|
{ name="led_marquee_base.png", color="white"},
|
||||||
{ name="led_marquee_leds_off.png", color="white"},
|
{ name="led_marquee_leds_off.png", color="white"},
|
||||||
{
|
{
|
||||||
name = "led_marquee_char_129.png",
|
name = "led_marquee_char_31.png",
|
||||||
animation = {type = "vertical_frames", aspect_w = 32, aspect_h = 32, length = 0.75}
|
animation = {type = "vertical_frames", aspect_w = 32, aspect_h = 32, length = 0.75}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if i == 32 then
|
||||||
|
groups = {cracky = 2}
|
||||||
|
light = nil
|
||||||
|
description = S("LED marquee panel")
|
||||||
|
wimage = "led_marquee_leds_off.png^(led_marquee_char_155.png^[multiply:red)"
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_node("led_marquee:char_"..i, {
|
minetest.register_node("led_marquee:char_"..i, {
|
||||||
description = description,
|
description = description,
|
||||||
drawtype = "mesh",
|
drawtype = "mesh",
|
||||||
mesh = "led_marquee.obj",
|
mesh = "led_marquee.obj",
|
||||||
tiles = tiles,
|
tiles = tiles,
|
||||||
palette="palette.png",
|
inventory_image = wimage,
|
||||||
|
wield_image = wimage,
|
||||||
|
palette="led_marquee_palette.png",
|
||||||
use_texture_alpha = true,
|
use_texture_alpha = true,
|
||||||
groups = groups,
|
groups = groups,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "colorwallmounted",
|
paramtype2 = "colorwallmounted",
|
||||||
light_source = light,
|
light_source = light,
|
||||||
selection_box = marquee_cbox,
|
selection_box = cbox,
|
||||||
collision_box = marquee_cbox,
|
node_box = cbox,
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
reset_meta(pos)
|
reset_meta(pos)
|
||||||
end,
|
end,
|
||||||
@ -183,13 +418,13 @@ for i = 32, 129 do
|
|||||||
action = on_digiline_receive_string,
|
action = on_digiline_receive_string,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
drop = "led_marquee:char_32"
|
drop = "led_marquee:char_32",
|
||||||
|
on_timer = led_marquee.scroll_text
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- crafts
|
-- crafts
|
||||||
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "led_marquee:char_32 6",
|
output = "led_marquee:char_32 6",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -1,36 +1,31 @@
|
|||||||
# Blender v2.79 (sub 0) OBJ File: 'LED marquee.blend'
|
# Blender v2.79 (sub 0) OBJ File: 'LED marquee.blend'
|
||||||
# www.blender.org
|
# www.blender.org
|
||||||
o Cube_Cube_LEDs
|
o Cube_Cube_LEDs
|
||||||
v -0.453125 -0.500000 -0.468750
|
v 0.500000 -0.453125 -0.468750
|
||||||
v -0.453125 0.500000 -0.468750
|
v -0.500000 -0.453125 -0.468750
|
||||||
v -0.453125 0.500000 0.468750
|
v -0.500000 -0.453125 0.468750
|
||||||
v -0.453125 -0.500000 0.468750
|
v 0.500000 -0.453125 0.468750
|
||||||
v -0.437500 -0.500000 -0.500000
|
v 0.500000 -0.437500 -0.500000
|
||||||
v -0.437500 -0.500000 -0.484375
|
v 0.500000 -0.437500 -0.484375
|
||||||
v -0.453125 -0.500000 -0.468750
|
v 0.500000 -0.453125 -0.468750
|
||||||
v -0.453125 -0.500000 0.468750
|
v 0.500000 -0.453125 0.468750
|
||||||
v -0.437500 -0.500000 0.484375
|
v 0.500000 -0.437500 0.484375
|
||||||
v -0.437500 -0.500000 0.500000
|
v 0.500000 -0.437500 0.500000
|
||||||
|
v 0.500000 -0.500000 0.500000
|
||||||
|
v 0.500000 -0.500000 -0.500000
|
||||||
v -0.500000 -0.500000 0.500000
|
v -0.500000 -0.500000 0.500000
|
||||||
v -0.500000 -0.500000 -0.500000
|
v -0.500000 -0.500000 -0.500000
|
||||||
v -0.500000 0.500000 0.500000
|
v -0.500000 -0.437500 0.500000
|
||||||
v -0.500000 0.500000 -0.500000
|
v -0.500000 -0.437500 0.484375
|
||||||
v -0.437500 0.500000 0.500000
|
v -0.500000 -0.453125 0.468750
|
||||||
v -0.437500 0.500000 0.484375
|
v -0.500000 -0.453125 -0.468750
|
||||||
v -0.453125 0.500000 0.468750
|
v -0.500000 -0.437500 -0.484375
|
||||||
v -0.453125 0.500000 -0.468750
|
v -0.500000 -0.437500 -0.500000
|
||||||
v -0.437500 0.500000 -0.484375
|
v 0.500000 -0.449125 -0.468750
|
||||||
v -0.437500 0.500000 -0.500000
|
v -0.500000 -0.449125 -0.468750
|
||||||
v -0.449125 -0.500000 -0.468750
|
v -0.500000 -0.449125 0.468750
|
||||||
v -0.449125 0.500000 -0.468750
|
v 0.500000 -0.449125 0.468750
|
||||||
v -0.449125 0.500000 0.468750
|
|
||||||
v -0.449125 -0.500000 0.468750
|
|
||||||
vt 0.667843 0.000000
|
|
||||||
vt 0.667843 0.015513
|
|
||||||
vt 0.681855 0.031026
|
|
||||||
vt 0.681855 0.961799
|
vt 0.681855 0.961799
|
||||||
vt 0.667843 0.977312
|
|
||||||
vt 0.667843 0.992824
|
|
||||||
vt 0.723891 0.992824
|
vt 0.723891 0.992824
|
||||||
vt 0.723891 0.000000
|
vt 0.723891 0.000000
|
||||||
vt 1.000000 0.007175
|
vt 1.000000 0.007175
|
||||||
@ -39,32 +34,37 @@ vt 0.103234 1.000000
|
|||||||
vt 0.103234 0.007175
|
vt 0.103234 0.007175
|
||||||
vt 0.723891 0.000000
|
vt 0.723891 0.000000
|
||||||
vt 0.723891 0.992824
|
vt 0.723891 0.992824
|
||||||
vt 0.667843 0.992824
|
|
||||||
vt 0.667843 0.977312
|
|
||||||
vt 0.681855 0.961799
|
|
||||||
vt 0.681855 0.031026
|
vt 0.681855 0.031026
|
||||||
|
vt 0.003280 0.226388
|
||||||
|
vt 0.900045 0.226388
|
||||||
|
vt 0.900045 0.164337
|
||||||
|
vt 0.003280 0.164337
|
||||||
|
vt 0.900045 0.226388
|
||||||
|
vt 0.003280 0.226388
|
||||||
|
vt 0.003280 0.164337
|
||||||
|
vt 0.900045 0.164337
|
||||||
|
vt 1.000000 0.017400
|
||||||
|
vt 0.000000 -0.000000
|
||||||
|
vt 1.000000 -0.000000
|
||||||
|
vt 1.000000 1.000000
|
||||||
|
vt 0.000000 0.982506
|
||||||
|
vt 1.000000 0.982506
|
||||||
|
vt 0.000000 0.965011
|
||||||
|
vt 0.000000 0.034801
|
||||||
|
vt 1.000000 0.034801
|
||||||
|
vt 0.667843 0.992824
|
||||||
|
vt 0.681855 0.961799
|
||||||
|
vt 0.667843 0.977312
|
||||||
vt 0.667843 0.015513
|
vt 0.667843 0.015513
|
||||||
vt 0.667843 0.000000
|
vt 0.667843 0.000000
|
||||||
vt 0.003280 0.226388
|
vt 0.667843 0.000000
|
||||||
vt 0.900045 0.226388
|
vt 0.681855 0.031026
|
||||||
vt 0.900045 0.164337
|
vt 0.667843 0.015513
|
||||||
vt 0.003280 0.164337
|
vt 0.667843 0.977312
|
||||||
vt 0.900045 0.226388
|
vt 0.667843 0.992824
|
||||||
vt 0.003280 0.226388
|
|
||||||
vt 0.003280 0.164337
|
|
||||||
vt 0.900045 0.164337
|
|
||||||
vt 1.000000 -0.000000
|
|
||||||
vt 1.000000 0.017400
|
|
||||||
vt 0.000000 0.017400
|
vt 0.000000 0.017400
|
||||||
vt 0.000000 -0.000000
|
|
||||||
vt 1.000000 0.982506
|
|
||||||
vt 1.000000 1.000000
|
|
||||||
vt 0.000000 1.000000
|
vt 0.000000 1.000000
|
||||||
vt 0.000000 0.982506
|
|
||||||
vt 0.000000 0.965011
|
|
||||||
vt 1.000000 0.965011
|
vt 1.000000 0.965011
|
||||||
vt 1.000000 0.034801
|
|
||||||
vt 0.000000 0.034801
|
|
||||||
vt 0.000000 0.000000
|
vt 0.000000 0.000000
|
||||||
vt 1.000000 0.000000
|
vt 1.000000 0.000000
|
||||||
vt 1.000000 1.000000
|
vt 1.000000 1.000000
|
||||||
@ -73,25 +73,39 @@ vt 0.000000 0.000000
|
|||||||
vt 1.000000 0.000000
|
vt 1.000000 0.000000
|
||||||
vt 1.000000 1.000000
|
vt 1.000000 1.000000
|
||||||
vt 0.000000 1.000000
|
vt 0.000000 1.000000
|
||||||
vn 0.0000 -1.0000 0.0000
|
|
||||||
vn -1.0000 -0.0000 -0.0000
|
|
||||||
vn -0.0000 1.0000 0.0000
|
|
||||||
vn 0.0000 0.0000 -1.0000
|
|
||||||
vn 0.0000 0.0000 1.0000
|
|
||||||
vn 1.0000 0.0000 0.0000
|
vn 1.0000 0.0000 0.0000
|
||||||
vn 0.7071 0.0000 -0.7071
|
vn 0.0000 -1.0000 -0.0000
|
||||||
vn 0.7071 0.0000 0.7071
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn -0.0000 0.0000 1.0000
|
||||||
|
vn -0.0000 1.0000 0.0000
|
||||||
|
vn -0.0000 0.7071 -0.7071
|
||||||
|
vn -0.0000 0.7071 0.7071
|
||||||
g Cube_Cube_LEDs_Cube_Cube_LEDs_base
|
g Cube_Cube_LEDs_Cube_Cube_LEDs_base
|
||||||
s off
|
s off
|
||||||
f 5/1/1 6/2/1 7/3/1 8/4/1 9/5/1 10/6/1 11/7/1 12/8/1
|
f 8/1/1 11/2/1 12/3/1
|
||||||
f 12/9/2 11/10/2 13/11/2 14/12/2
|
f 12/4/2 11/5/2 13/6/2 14/7/2
|
||||||
f 14/13/3 13/14/3 15/15/3 16/16/3 17/17/3 18/18/3 19/19/3 20/20/3
|
f 14/8/3 13/9/3 18/10/3
|
||||||
f 12/21/4 14/22/4 20/23/4 5/24/4
|
f 12/11/4 14/12/4 20/13/4 5/14/4
|
||||||
f 13/25/5 11/26/5 10/27/5 15/28/5
|
f 13/15/5 11/16/5 10/17/5 15/18/5
|
||||||
f 20/29/6 19/30/6 6/31/6 5/32/6
|
f 19/19/6 5/20/6 20/21/6
|
||||||
f 16/33/6 15/34/6 10/35/6 9/36/6
|
f 15/22/6 9/23/6 16/24/6
|
||||||
f 9/36/7 8/37/7 17/38/7 16/33/7
|
f 8/25/7 16/24/7 9/23/7
|
||||||
f 18/39/8 7/40/8 6/31/8 19/30/8
|
f 7/26/8 19/19/8 18/27/8
|
||||||
|
f 13/9/3 15/28/3 17/29/3
|
||||||
|
f 15/28/3 16/30/3 17/29/3
|
||||||
|
f 19/31/3 20/32/3 18/10/3
|
||||||
|
f 20/32/3 14/8/3 18/10/3
|
||||||
|
f 13/9/3 17/29/3 18/10/3
|
||||||
|
f 12/3/1 5/33/1 7/34/1
|
||||||
|
f 5/33/1 6/35/1 7/34/1
|
||||||
|
f 9/36/1 10/37/1 8/1/1
|
||||||
|
f 10/37/1 11/2/1 8/1/1
|
||||||
|
f 12/3/1 7/34/1 8/1/1
|
||||||
|
f 7/26/8 6/38/8 19/19/8
|
||||||
|
f 19/19/6 6/38/6 5/20/6
|
||||||
|
f 15/22/6 10/39/6 9/23/6
|
||||||
|
f 8/25/7 17/40/7 16/24/7
|
||||||
g Cube_Cube_LEDs_Cube_Cube_LEDs_leds_off
|
g Cube_Cube_LEDs_Cube_Cube_LEDs_leds_off
|
||||||
f 1/41/6 2/42/6 3/43/6 4/44/6
|
f 1/41/6 2/42/6 3/43/6 4/44/6
|
||||||
g Cube_Cube_LEDs_Cube_Cube_LEDs_leds_on
|
g Cube_Cube_LEDs_Cube_Cube_LEDs_leds_on
|
||||||
|
Before Width: | Height: | Size: 353 B After Width: | Height: | Size: 348 B |
Before Width: | Height: | Size: 360 B After Width: | Height: | Size: 338 B |
BIN
textures/led_marquee_char_130.png
Normal file
After Width: | Height: | Size: 210 B |
BIN
textures/led_marquee_char_131.png
Normal file
After Width: | Height: | Size: 279 B |
BIN
textures/led_marquee_char_132.png
Normal file
After Width: | Height: | Size: 262 B |
BIN
textures/led_marquee_char_133.png
Normal file
After Width: | Height: | Size: 274 B |
BIN
textures/led_marquee_char_134.png
Normal file
After Width: | Height: | Size: 276 B |
BIN
textures/led_marquee_char_135.png
Normal file
After Width: | Height: | Size: 268 B |
BIN
textures/led_marquee_char_136.png
Normal file
After Width: | Height: | Size: 302 B |
BIN
textures/led_marquee_char_137.png
Normal file
After Width: | Height: | Size: 268 B |
BIN
textures/led_marquee_char_138.png
Normal file
After Width: | Height: | Size: 451 B |
BIN
textures/led_marquee_char_139.png
Normal file
After Width: | Height: | Size: 272 B |
BIN
textures/led_marquee_char_140.png
Normal file
After Width: | Height: | Size: 306 B |
BIN
textures/led_marquee_char_141.png
Normal file
After Width: | Height: | Size: 305 B |
BIN
textures/led_marquee_char_142.png
Normal file
After Width: | Height: | Size: 302 B |
BIN
textures/led_marquee_char_143.png
Normal file
After Width: | Height: | Size: 352 B |
BIN
textures/led_marquee_char_144.png
Normal file
After Width: | Height: | Size: 270 B |
BIN
textures/led_marquee_char_145.png
Normal file
After Width: | Height: | Size: 336 B |
BIN
textures/led_marquee_char_146.png
Normal file
After Width: | Height: | Size: 318 B |
BIN
textures/led_marquee_char_147.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
textures/led_marquee_char_148.png
Normal file
After Width: | Height: | Size: 309 B |
BIN
textures/led_marquee_char_149.png
Normal file
After Width: | Height: | Size: 323 B |
BIN
textures/led_marquee_char_150.png
Normal file
After Width: | Height: | Size: 316 B |
BIN
textures/led_marquee_char_151.png
Normal file
After Width: | Height: | Size: 359 B |
BIN
textures/led_marquee_char_152.png
Normal file
After Width: | Height: | Size: 352 B |
BIN
textures/led_marquee_char_153.png
Normal file
After Width: | Height: | Size: 244 B |
BIN
textures/led_marquee_char_154.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
textures/led_marquee_char_155.png
Normal file
After Width: | Height: | Size: 362 B |
BIN
textures/led_marquee_char_156.png
Normal file
After Width: | Height: | Size: 379 B |
BIN
textures/led_marquee_char_157.png
Normal file
After Width: | Height: | Size: 494 B |
BIN
textures/led_marquee_char_158.png
Normal file
After Width: | Height: | Size: 518 B |
BIN
textures/led_marquee_char_159.png
Normal file
After Width: | Height: | Size: 500 B |
BIN
textures/led_marquee_char_160.png
Normal file
After Width: | Height: | Size: 96 B |
BIN
textures/led_marquee_char_161.png
Normal file
After Width: | Height: | Size: 336 B |
BIN
textures/led_marquee_char_162.png
Normal file
After Width: | Height: | Size: 367 B |
BIN
textures/led_marquee_char_163.png
Normal file
After Width: | Height: | Size: 399 B |
BIN
textures/led_marquee_char_164.png
Normal file
After Width: | Height: | Size: 369 B |
BIN
textures/led_marquee_char_165.png
Normal file
After Width: | Height: | Size: 332 B |
BIN
textures/led_marquee_char_166.png
Normal file
After Width: | Height: | Size: 266 B |
BIN
textures/led_marquee_char_167.png
Normal file
After Width: | Height: | Size: 396 B |
BIN
textures/led_marquee_char_168.png
Normal file
After Width: | Height: | Size: 203 B |
BIN
textures/led_marquee_char_169.png
Normal file
After Width: | Height: | Size: 438 B |
BIN
textures/led_marquee_char_170.png
Normal file
After Width: | Height: | Size: 363 B |
BIN
textures/led_marquee_char_171.png
Normal file
After Width: | Height: | Size: 293 B |
BIN
textures/led_marquee_char_172.png
Normal file
After Width: | Height: | Size: 230 B |
BIN
textures/led_marquee_char_173.png
Normal file
After Width: | Height: | Size: 203 B |
BIN
textures/led_marquee_char_174.png
Normal file
After Width: | Height: | Size: 461 B |
BIN
textures/led_marquee_char_175.png
Normal file
After Width: | Height: | Size: 203 B |
BIN
textures/led_marquee_char_176.png
Normal file
After Width: | Height: | Size: 280 B |
BIN
textures/led_marquee_char_177.png
Normal file
After Width: | Height: | Size: 297 B |
BIN
textures/led_marquee_char_178.png
Normal file
After Width: | Height: | Size: 319 B |
BIN
textures/led_marquee_char_179.png
Normal file
After Width: | Height: | Size: 291 B |
BIN
textures/led_marquee_char_180.png
Normal file
After Width: | Height: | Size: 250 B |
BIN
textures/led_marquee_char_181.png
Normal file
After Width: | Height: | Size: 307 B |
BIN
textures/led_marquee_char_182.png
Normal file
After Width: | Height: | Size: 343 B |
BIN
textures/led_marquee_char_183.png
Normal file
After Width: | Height: | Size: 216 B |
BIN
textures/led_marquee_char_184.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
textures/led_marquee_char_185.png
Normal file
After Width: | Height: | Size: 304 B |
BIN
textures/led_marquee_char_186.png
Normal file
After Width: | Height: | Size: 345 B |
BIN
textures/led_marquee_char_187.png
Normal file
After Width: | Height: | Size: 317 B |
BIN
textures/led_marquee_char_188.png
Normal file
After Width: | Height: | Size: 465 B |
BIN
textures/led_marquee_char_189.png
Normal file
After Width: | Height: | Size: 435 B |
BIN
textures/led_marquee_char_190.png
Normal file
After Width: | Height: | Size: 478 B |
BIN
textures/led_marquee_char_191.png
Normal file
After Width: | Height: | Size: 348 B |
BIN
textures/led_marquee_char_192.png
Normal file
After Width: | Height: | Size: 408 B |
BIN
textures/led_marquee_char_193.png
Normal file
After Width: | Height: | Size: 402 B |
BIN
textures/led_marquee_char_194.png
Normal file
After Width: | Height: | Size: 426 B |
BIN
textures/led_marquee_char_195.png
Normal file
After Width: | Height: | Size: 413 B |
BIN
textures/led_marquee_char_196.png
Normal file
After Width: | Height: | Size: 394 B |
BIN
textures/led_marquee_char_197.png
Normal file
After Width: | Height: | Size: 377 B |
BIN
textures/led_marquee_char_198.png
Normal file
After Width: | Height: | Size: 404 B |
BIN
textures/led_marquee_char_199.png
Normal file
After Width: | Height: | Size: 364 B |
BIN
textures/led_marquee_char_200.png
Normal file
After Width: | Height: | Size: 343 B |
BIN
textures/led_marquee_char_201.png
Normal file
After Width: | Height: | Size: 339 B |
BIN
textures/led_marquee_char_202.png
Normal file
After Width: | Height: | Size: 396 B |
BIN
textures/led_marquee_char_203.png
Normal file
After Width: | Height: | Size: 328 B |
BIN
textures/led_marquee_char_204.png
Normal file
After Width: | Height: | Size: 326 B |
BIN
textures/led_marquee_char_205.png
Normal file
After Width: | Height: | Size: 321 B |
BIN
textures/led_marquee_char_206.png
Normal file
After Width: | Height: | Size: 381 B |
BIN
textures/led_marquee_char_207.png
Normal file
After Width: | Height: | Size: 310 B |
BIN
textures/led_marquee_char_208.png
Normal file
After Width: | Height: | Size: 352 B |
BIN
textures/led_marquee_char_209.png
Normal file
After Width: | Height: | Size: 362 B |
BIN
textures/led_marquee_char_210.png
Normal file
After Width: | Height: | Size: 347 B |
BIN
textures/led_marquee_char_211.png
Normal file
After Width: | Height: | Size: 348 B |
BIN
textures/led_marquee_char_212.png
Normal file
After Width: | Height: | Size: 389 B |
BIN
textures/led_marquee_char_213.png
Normal file
After Width: | Height: | Size: 349 B |
BIN
textures/led_marquee_char_214.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
textures/led_marquee_char_215.png
Normal file
After Width: | Height: | Size: 322 B |
BIN
textures/led_marquee_char_216.png
Normal file
After Width: | Height: | Size: 389 B |
BIN
textures/led_marquee_char_217.png
Normal file
After Width: | Height: | Size: 341 B |
BIN
textures/led_marquee_char_218.png
Normal file
After Width: | Height: | Size: 339 B |
BIN
textures/led_marquee_char_219.png
Normal file
After Width: | Height: | Size: 401 B |
BIN
textures/led_marquee_char_220.png
Normal file
After Width: | Height: | Size: 340 B |
BIN
textures/led_marquee_char_221.png
Normal file
After Width: | Height: | Size: 376 B |