1
0
mirror of https://github.com/mt-mods/led_marquee.git synced 2025-06-28 22:36:41 +02:00

74 Commits

Author SHA1 Message Date
589ab5f19a don't reset scroll position if re-printing the same message 2018-08-22 18:40:58 -04:00
bbb2b57328 fix shifted block shades (char 143, 144) 2018-08-21 21:14:27 -04:00
1b2e898615 remove debug prints 2018-08-21 05:48:41 -04:00
2d74ccf8e6 fix the fix ;) 2018-08-21 04:59:58 -04:00
3f98601875 fix glitch where first byte of msg gets skipped on scroll
(causes color code to be displayed raw)
2018-08-21 04:47:00 -04:00
cf94878a46 consolidate timer sanity checking into led_marquee.set_timer 2018-08-21 04:22:22 -04:00
0bc150e64a reduce allowed minimum timeout to 0.2s 2018-08-21 04:15:37 -04:00
f9f68d13ab better centering for k 2018-08-21 01:35:45 -04:00
ddfed65b2a better centering for y ÿ ý 2018-08-21 01:30:48 -04:00
85fd214907 better shape for "Ý" 2018-08-21 01:26:34 -04:00
4658f9eeff better ring on "Å" 2018-08-21 01:03:10 -04:00
57cdabac78 better circumflexes
characters Â Ê Î Ô Û â ê î ô û
2018-08-21 00:59:48 -04:00
07f41b13d8 fix height of "Ø"
(capital O with stroke, char #216)
2018-08-21 00:39:18 -04:00
9ca24f1f10 fix width of "L" 2018-08-21 00:37:51 -04:00
45ec33e78c fix string length limits in README 2018-08-21 00:29:27 -04:00
f5512c4837 wield image 2018-08-21 00:27:07 -04:00
f7155b385e don't forget to increment the string index for unrecognized chars 2018-08-20 21:33:04 -04:00
4c804e1851 forgot to lowercase chars in color codes table 2018-08-20 20:58:10 -04:00
87ebd877b8 update README accordingly 2018-08-20 20:34:36 -04:00
3ba2dbd1bd use string.char(10) for newline, like it should be
(since colors are now strings)
2018-08-20 20:25:44 -04:00
452102cc7c use printable strings for color codes
instead of string.char(0-27), use "/" as an escape followed by
"[0-9][A-R][a-r]", all inside the string.

e.g. digiline_send("chan", "/0this /1is /2some /3colorful /4text")

"/" followed by any other character than the above will be treated as an
invalid color code and will be taken literally.

"//" will print a single slash.

Note: on receipt, all instances of "//" in a message are actually
translated to string.char(30) -- one for each pair.  This makes the
scrolling code easier.  Keep this in mind if you use the "getstr" and
"getindex" commands.

Also, this expands the max string length to 6 kB, to allow a full 80x25
display with one color code er character.  "clear" and "allon" remain at
2kB since that's still enough.
2018-08-20 20:24:31 -04:00
bee8d5c32d increase string limit to 4 kB
(also pad "clear" and "allon" strings to 2 kB)
2018-08-19 02:06:00 -04:00
5cf5e0318a documentation fixes 2018-08-17 18:20:41 -04:00
65a22e1c8e drop support for "off_multi" (just use "clear")
renamed "allon_multi" to "allon"
2018-08-17 17:14:55 -04:00
c703dbfa74 add optional stepping value to "scroll_step" 2018-08-17 17:12:49 -04:00
0cacd9af9c fix fencepost error 2018-08-17 15:43:41 -04:00
06b419a905 track colors properly in scrolling text
(also fixes timing glitches)
2018-08-17 15:24:21 -04:00
010dab660b don't reset index to 1 on timer-start
(that's handled elsewhere)

also, pre-increment the index so that it matches what's displayed
2018-08-17 11:42:16 -04:00
5826209f16 always reset the scroll index to 1 on any new displayed message 2018-08-17 11:20:49 -04:00
b25b3ef995 use proper form of digilines.receptor_send() 2018-08-17 11:17:27 -04:00
b8a0f1cbb7 fix getindex 2018-08-17 11:03:07 -04:00
3d5380ef25 only reset the scroll index when starting the timer
(not when stopping it)
2018-08-17 10:48:33 -04:00
3df1e6454b add "getindex" command to read the stored message's scroll index position
that is, the string index position of the first displayed character thereof.
2018-08-17 10:46:49 -04:00
e8c0fa93ca more clarifications 2018-08-17 10:44:13 -04:00
ab0582ff97 update README accordingly 2018-08-17 10:39:20 -04:00
4af469f1aa check for "get" and "get_string" in the right place :-P 2018-08-17 10:36:20 -04:00
d9499481cf clarify "get" command 2018-08-17 10:34:40 -04:00
1823b6f0e5 get_str will now get the last displayed string from the master's meta
(instead of only the first char)
2018-08-17 10:33:48 -04:00
02216ee611 store single-byte messages in the meta also 2018-08-17 10:29:10 -04:00
10dcad8e06 store numeric message as a string in the master's meta 2018-08-17 10:27:27 -04:00
898a027a77 numeric messages are now printed in full
instead of just the first char.
2018-08-17 10:25:12 -04:00
922efe9210 clarify README regarding scrolling
also make sure to `return false` from the scroll_text function if the
scroll timer was last set to a value below the allowed minimum (which
would mean the user/program intended to shut it off by setting it to 0,
or the stepper was called manually, implying no timer)
2018-08-17 10:12:35 -04:00
81a06dc054 add a command to immediately scroll the displayed message by one step
to be used in lieu of the three existing auto-scroll commands in case
you want the LuaC to handle the stepping.
2018-08-17 09:49:26 -04:00
d47f2746d7 Merge branch '138-fix' into 'master'
Rotate char 138 correctly

See merge request VanessaE/led_marquee!2
2018-08-17 12:45:33 +00:00
68b748a741 Rotate char 138 correctly 2018-08-17 09:09:08 +02:00
3cee6172ae brain-o 2018-08-17 00:49:18 -04:00
0db84edb1e more documentation tweaks 2018-08-17 00:05:08 -04:00
81a52b2e0f update README to follow those commits 2018-08-17 00:00:24 -04:00
053ee765c0 drop support for "off", "colon", "period", "del", "all_on" and "cursor" keywords
(use the actuall ascii chars instead, they do the same thing anyways, but can be part of a string)
2018-08-16 23:50:26 -04:00
57d4c99eb8 add "clear" as more readable an alternate to "off_multi" 2018-08-16 23:41:40 -04:00
244b5011a1 move "allon_multi" and "off_multi" checks to main eval section 2018-08-16 23:40:35 -04:00
3141aa5ba7 basic automatic horizontal scrolling support 2018-08-16 23:35:51 -04:00
c647effff2 make µC and lamps optional depends
(they're only needed for crafting anyways)
2018-08-16 16:50:41 -04:00
ce9666cc48 local-ize functions 2018-08-16 13:22:02 -04:00
4d1d90cccc local-ize iso_chars 2018-08-16 13:21:28 -04:00
5ed4d1ef27 update README to follow 2018-08-16 13:20:26 -04:00
ee77614b97 treat strings prefixed with 0xff as Lua's weird UTF-8 encoding
translate them to bare ISO-8859-1 at print time

Only alters chars with codes > 0x9f, so graphics/symbols in the
0x7f-0x9f range and color and control codes < 0x20 are preserved

The routine assumes that any char code > 0x9f is the first byte of a
two-byte UTF-8 symbol.

Note that due to Minetest's busted formspecs, it's not possible to
actually type-in or copy-paste proper UTF strings to take advantage of
this mode, so it's only useful if the strings are generated by or
imported in from something else (e.g. a URL or something, or a LuaC
program that generates strings)
2018-08-16 13:14:27 -04:00
d0d127e837 rewrite README a bit, synchronize with forum post 2018-08-16 02:43:11 -04:00
b9a0656407 Added a "cursor position" command byte
updated README
2018-08-16 02:25:31 -04:00
4bb68ec009 basic multi-line support
Stack up a wall of LED panels, any horizontal and vertical amount

Set a channel on the upper left panel, leave the others un-set, and
connect a LuaC to it via digilines.

Long strings sent to that channel will be displayed using all panels,
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).

string.char(28) can be inserted anywhere to force a linefeed.

As usual, printing continues from node to node until the program either
finds a panel with a different non-empty channel than the first one, or
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.

Lines of panels don't need to be the same length, the program will wrap
as needed.

This commit also gets rid of the end-of-line padding, uses proper
string.rep() to create the all-off and all-on fills (each of which is
1kB), and fixes one or two other minor issues.

Strings are trimmed to 1 kB.

Panels are not erased between prints.
2018-08-16 01:46:03 -04:00
161623e869 fix minor mesh/triangulation glitch 2018-08-15 19:51:53 -04:00
d182766236 reduce color palette to 28 entries to make room for future control codes
(loses a dupe brown entry, and light blue and pink, which don't really work
well on a LED display)
2018-08-15 19:32:56 -04:00
09e5607d7a fix typo in docs 2018-08-15 19:17:39 -04:00
b9dd38c0de re-format palette to power-of-2 resolution 2018-08-15 19:05:05 -04:00
4fa6d54a4b fix undefined fdir in one spot
make some vars more readable
consolidate/cache fdir usage
2018-08-15 18:53:58 -04:00
157e517663 rename palette 2018-08-15 18:35:29 -04:00
e622f94dfc Merge branch 'led_marquee_gettext' into 'master'
Change intlib Getter (deprecated) to make_gettext_pair.

See merge request VanessaE/led_marquee!1
2018-08-15 22:13:43 +00:00
be7f72dfeb remove unused global 2018-08-15 18:12:35 -04:00
ec2cfdd87d update README to follow 2018-08-15 18:02:08 -04:00
2faab30e19 basic support for the ISO-8859-1 character set
(sorry, no UTF-8 here, Lue doesn't do multi-byte too well in this situation)
plus a bunch of symbols stuffed into the empty 128-159 range that should be
useful on a marquee:

128,129: musical notes
130-140: box drawing glyphs
141-144: block shades
145-152: arrows
153-156: explosion/splat
157-159: smileys

This commit changes the "all on" keyword to point to char(144), and
"cursor" is moved to char(31).
2018-08-15 17:26:30 -04:00
3a02591d28 fix swapped fdir checks 2018-08-15 14:57:20 -04:00
bd0e7d9bfa fix color range check 2018-08-15 14:28:38 -04:00
06d19f0d2e fix orientation checks
(broke at the 31-color update)
2018-08-15 14:27:55 -04:00
b33de7a530 Change intlib Getter (deprecated) to make_gettext_pair. 2018-08-15 10:09:30 -07:00
141 changed files with 455 additions and 166 deletions

View File

@ -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.2s, 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).

View File

@ -1,5 +1,5 @@
default default
digilines digilines
mesecons_luacontroller mesecons_luacontroller
mesecons_microcontroller mesecons_microcontroller?
mesecons_lamp mesecons_lamp?

401
init.lua
View File

@ -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,188 @@ 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 not timeout or timeout < 0.2 or timeout > 5 then return false end
if timeout > 0 then
local meta = minetest.get_meta(pos)
meta:set_int("timeout", timeout)
timer:start(timeout)
end
end
led_marquee.scroll_text = function(pos, elapsed, skip)
skip = skip or 1
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 then index = 1 end
local len = string.len(msg)
index = index + skip
if index > len then index = 1 end
-- 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-1, f), "/[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.2 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 +298,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")
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))
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)
local last_msg = meta:get_string("last_msg")
meta:set_string("last_msg", msg)
led_marquee.display_msg(pos, channel, msg)
if last_msg ~= msg then
meta:set_int("index", 1)
end
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 +422,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 = {

Binary file not shown.

Binary file not shown.

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 B

After

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 501 B

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 B

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

Some files were not shown because too many files have changed in this diff Show More