From 4d32583fef2838d03a167b78cb78068dff3251f2 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Wed, 10 Jun 2015 23:38:56 -0400 Subject: [PATCH] add alpha-numeric support (full ASCII charset, 32-127) via 15-segment display tube (similar to Burroughs B-7971). --- README.md | 26 +++- init.lua | 210 ++++++++++++++++++++++++++- textures/nixie_tube_alnum_seg_1.png | Bin 0 -> 272 bytes textures/nixie_tube_alnum_seg_10.png | Bin 0 -> 362 bytes textures/nixie_tube_alnum_seg_11.png | Bin 0 -> 858 bytes textures/nixie_tube_alnum_seg_12.png | Bin 0 -> 409 bytes textures/nixie_tube_alnum_seg_13.png | Bin 0 -> 863 bytes textures/nixie_tube_alnum_seg_14.png | Bin 0 -> 361 bytes textures/nixie_tube_alnum_seg_15.png | Bin 0 -> 797 bytes textures/nixie_tube_alnum_seg_2.png | Bin 0 -> 371 bytes textures/nixie_tube_alnum_seg_3.png | Bin 0 -> 408 bytes textures/nixie_tube_alnum_seg_4.png | Bin 0 -> 335 bytes textures/nixie_tube_alnum_seg_5.png | Bin 0 -> 402 bytes textures/nixie_tube_alnum_seg_6.png | Bin 0 -> 362 bytes textures/nixie_tube_alnum_seg_7.png | Bin 0 -> 817 bytes textures/nixie_tube_alnum_seg_8.png | Bin 0 -> 379 bytes textures/nixie_tube_alnum_seg_9.png | Bin 0 -> 820 bytes textures/nixie_tube_alnum_wires.png | Bin 0 -> 3390 bytes 18 files changed, 230 insertions(+), 6 deletions(-) create mode 100644 textures/nixie_tube_alnum_seg_1.png create mode 100644 textures/nixie_tube_alnum_seg_10.png create mode 100644 textures/nixie_tube_alnum_seg_11.png create mode 100644 textures/nixie_tube_alnum_seg_12.png create mode 100644 textures/nixie_tube_alnum_seg_13.png create mode 100644 textures/nixie_tube_alnum_seg_14.png create mode 100644 textures/nixie_tube_alnum_seg_15.png create mode 100644 textures/nixie_tube_alnum_seg_2.png create mode 100644 textures/nixie_tube_alnum_seg_3.png create mode 100644 textures/nixie_tube_alnum_seg_4.png create mode 100644 textures/nixie_tube_alnum_seg_5.png create mode 100644 textures/nixie_tube_alnum_seg_6.png create mode 100644 textures/nixie_tube_alnum_seg_7.png create mode 100644 textures/nixie_tube_alnum_seg_8.png create mode 100644 textures/nixie_tube_alnum_seg_9.png create mode 100644 textures/nixie_tube_alnum_wires.png diff --git a/README.md b/README.md index 4ca607b..3d643d2 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,30 @@ nixie_tubes mod by Vanessa Ezekowitz -This mod provides a set of classic Nixie tubes, controlled by Mesecons' +This mod provides a set of classic Nixie tubes, and a set of alphanumeric +15-segment tubes similar to Burroughs B-7971, controlled by Mesecons' Digilines mod. Simply place a tube, right-click it, and set a channel. -Then send a message to that channel from a Mesecons Lua Controller with either -a number 0-9, the word "colon", the word "period" or the word "off". The tube -will "light-up" the appropriate number or symbol, or turn off entirely. +Then send a character or one of several control words to that channel from a +Mesecons Lua Controller and the tube will try to display it. + +The classic tubes are numeric with colon and period symbols, and hence will +respond to the literal numbers 0-9, and the words "colon", "period", and +"off". Any other symbol or word is ignored. + +The alphanumeric tubes respond to characters from the standard 7-bit ASCII +character set, along with these messages: + +* "off", "colon" and "period" act the same as on the numeric tubes. Note that + neither a colon nor a period actually look all that great on a 15-segment + display, so use a classic tube for those, if you can. +* "del" or character code 127 displays an all-on square, but without segment + #15 (the bottom, chevron-shaped one). +* "allon" or character code 128 will display an all-on square, with segment + #15 lit also. +* "cursor" or character code 129 will display just segment 15. + +Any unrecognized word or symbol outside the 32-129 range is ignored. Tubes emit a small amount of light when displaying something. diff --git a/init.lua b/init.lua index b55cad2..02bfe05 100644 --- a/init.lua +++ b/init.lua @@ -37,7 +37,7 @@ local reset_meta = function(pos) minetest.get_meta(pos):set_string("formspec", "field[channel;Channel;${channel}]") end -local on_digiline_receive = function(pos, node, channel, msg) +local on_digiline_receive_std = function(pos, node, channel, msg) local meta = minetest.get_meta(pos) local setchan = meta:get_string("channel") if setchan ~= channel then return end @@ -91,11 +91,217 @@ for _,tube in ipairs(nixie_types) do digiline = { receptor = {}, effector = { - action = on_digiline_receive + action = on_digiline_receive_std }, }, drop = "nixie_tubes:tube_off" }) end +-- Alpha-numeric tubes (Burroughs B-7971 or similar) + +--[[ + +Map of display wires: + + --1------ + |\ |8 /| + 6| \ | / |2 + | 7\ | /9 | + | \|/ | +14--> ---- ---- <--10 + | /|\ | + |13/ | \11| + 5| / | \ |3 + |/ 12| \| + ------4-- + _ + --¯¯ ¯¯-- <--15 + +-- Wire positions in table: +-- char = { 1, 2, 3, 4, .... , 13, 14, 15 } + +]]-- + +local alnum_chars = { + { " ", { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }, -- 32 + { "!", { 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0 } }, + { '"', { 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0 } }, + { "#", { 0,1,1,1,0,0,0,1,0,1,0,1,0,1,0 } }, + { "$", { 1,0,1,1,0,1,0,1,0,1,0,1,0,1,0 } }, + { "%", { 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0 } }, + { "&", { 1,0,0,1,1,0,1,0,1,0,1,0,0,1,0 } }, + { "'", { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 } }, + { "(", { 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0 } }, + { ")", { 0,0,0,0,0,0,1,0,0,0,0,0,1,0,0 } }, + { "*", { 0,0,0,0,0,0,1,1,1,0,1,1,1,0,0 } }, + { ",", { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 } }, + { "-", { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 } }, + { ".", { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 } }, + { "/", { 0,0,0,0,0,0,0,0,1,0,0,0,1,0,0 } }, + { "0", { 1,1,1,1,1,1,0,0,1,0,0,0,1,0,0 } }, -- 48 + { "1", { 0,1,1,0,0,0,0,0,1,0,0,0,0,0,0 } }, + { "2", { 1,1,0,1,0,0,0,0,0,1,0,0,1,0,0 } }, + { "3", { 1,1,1,1,0,0,0,0,0,1,0,0,0,0,0 } }, + { "4", { 0,1,1,0,0,1,0,0,0,1,0,0,0,1,0 } }, + { "5", { 1,0,1,1,0,1,0,0,0,1,0,0,0,1,0 } }, + { "6", { 1,0,1,1,1,1,0,0,0,1,0,0,0,1,0 } }, + { "7", { 1,0,0,0,0,0,0,0,1,0,0,1,0,0,0 } }, + { "8", { 1,1,1,1,1,1,0,0,0,0,1,0,0,1,0 } }, + { "9", { 1,1,1,0,0,1,0,0,0,1,0,0,0,1,0 } }, + { ":", { 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0 } }, -- 58 + { ";", { 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0 } }, + { "<", { 0,0,0,0,0,0,0,0,1,0,1,0,0,1,0 } }, + { "=", { 0,0,0,1,0,0,0,0,0,1,0,0,0,1,0 } }, + { ">", { 0,0,0,0,0,0,1,0,0,1,0,0,1,0,0 } }, + { "?", { 1,1,0,0,0,0,0,0,0,1,0,1,0,0,0 } }, + { "@", { 1,1,0,1,1,1,0,1,0,1,0,0,0,0,0 } }, -- 64 + { "A", { 1,1,1,0,1,1,0,0,0,1,0,0,0,1,0 } }, + { "B", { 1,1,1,1,0,0,0,1,0,1,0,1,0,0,0 } }, + { "C", { 1,0,0,1,1,1,0,0,0,0,0,0,0,0,0 } }, + { "D", { 1,1,1,1,0,0,0,1,0,0,0,1,0,0,0 } }, + { "E", { 1,0,0,1,1,1,0,0,0,0,0,0,0,1,0 } }, + { "F", { 1,0,0,0,1,1,0,0,0,0,0,0,0,1,0 } }, + { "G", { 1,0,1,1,1,1,0,0,0,1,0,0,0,0,0 } }, + { "H", { 0,1,1,0,1,1,0,0,0,1,0,0,0,1,0 } }, + { "I", { 1,0,0,1,0,0,0,1,0,0,0,1,0,0,0 } }, + { "J", { 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0 } }, + { "K", { 0,0,0,0,1,1,0,0,1,0,1,0,0,1,0 } }, + { "L", { 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 } }, + { "M", { 0,1,1,0,1,1,1,0,1,0,0,0,0,0,0 } }, + { "N", { 0,1,1,0,1,1,1,0,0,0,1,0,0,0,0 } }, + { "O", { 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 } }, + { "P", { 1,1,0,0,1,1,0,0,0,1,0,0,0,1,0 } }, + { "Q", { 1,1,1,1,1,1,0,0,0,0,1,0,0,0,0 } }, + { "R", { 1,1,0,0,1,1,0,0,0,1,1,0,0,1,0 } }, + { "S", { 1,0,1,1,0,1,0,0,0,1,0,0,0,1,0 } }, + { "T", { 1,0,0,0,0,0,0,1,0,0,0,1,0,0,0 } }, + { "U", { 0,1,1,1,1,1,0,0,0,0,0,0,0,0,0 } }, + { "V", { 0,0,0,0,1,1,0,0,1,0,0,0,1,0,0 } }, + { "W", { 0,1,1,0,1,1,0,0,0,0,1,0,1,0,0 } }, + { "X", { 0,0,0,0,0,0,1,0,1,0,1,0,1,0,0 } }, + { "Y", { 0,0,0,0,0,0,1,0,1,0,0,1,0,0,0 } }, + { "Z", { 1,0,0,1,0,0,0,0,1,0,0,0,1,0,0 } }, + { "[", { 1,0,0,1,1,1,0,0,0,0,0,0,0,0,0 } }, -- 91 + { "\\", { 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0 } }, + { "]", { 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0 } }, + { "^", { 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 } }, + { "_", { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 } }, + { "`", { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 } }, + { "a", { 1,1,1,1,0,0,0,0,0,1,0,0,1,0,0 } }, -- 97 + { "b", { 0,0,0,1,1,1,0,0,0,0,1,0,0,1,0 } }, + { "c", { 0,0,0,1,1,0,0,0,0,1,0,0,0,1,0 } }, + { "d", { 0,1,1,1,0,0,0,0,0,1,0,0,1,0,0 } }, + { "e", { 1,0,0,1,1,1,0,0,1,0,0,0,0,1,0 } }, + { "f", { 1,0,0,0,1,1,0,0,0,0,0,0,0,1,0 } }, + { "g", { 1,1,1,1,0,0,1,0,0,1,0,0,0,0,0 } }, + { "h", { 0,0,0,0,1,1,0,0,0,0,1,0,0,1,0 } }, + { "i", { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 } }, + { "j", { 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 } }, + { "k", { 0,0,0,0,0,0,0,1,1,0,1,1,0,0,0 } }, + { "l", { 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0 } }, + { "m", { 0,0,1,0,1,0,0,0,0,1,0,1,0,1,0 } }, + { "n", { 0,0,0,0,1,0,0,0,0,0,1,0,0,1,0 } }, + { "o", { 0,0,1,1,1,0,0,0,0,1,0,0,0,1,0 } }, + { "p", { 1,0,0,0,1,1,0,0,1,0,0,0,0,1,0 } }, + { "q", { 1,1,1,0,0,0,1,0,0,1,0,0,0,0,0 } }, + { "r", { 0,0,0,0,1,0,0,0,0,0,0,0,0,1,0 } }, + { "s", { 1,0,1,1,0,1,0,0,0,1,0,0,0,1,0 } }, + { "t", { 0,0,0,1,1,1,0,0,0,0,0,0,0,1,0 } }, + { "u", { 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 } }, + { "v", { 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0 } }, + { "w", { 0,0,1,0,1,0,0,0,0,0,1,0,1,0,0 } }, + { "x", { 0,0,0,0,0,0,1,0,1,0,1,0,1,0,0 } }, + { "y", { 0,0,0,0,0,0,1,0,1,0,0,0,1,0,0 } }, + { "z", { 1,0,0,1,0,0,0,0,1,0,0,0,1,0,0 } }, + { "{", { 1,0,0,1,0,0,1,0,0,0,0,0,1,1,0 } }, + { "|", { 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0 } }, + { "}", { 1,0,0,1,0,0,0,0,1,1,1,0,0,0,0 } }, + { "~", { 0,1,0,0,0,1,1,0,0,1,0,0,0,0,0 } }, + { string.char(127), { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 } }, -- "DEL" + { string.char(128), { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 } }, -- all-on + { string.char(129), { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } }, -- "cursor" segment +} + +local on_digiline_receive_alnum = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + if setchan ~= channel then return end + if msg then + local asc = string.byte(msg) or 32 + if msg == "off" then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_32", param2 = node.param2}) + elseif msg == "colon" then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_58", param2 = node.param2}) + elseif msg == "period" then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_46", param2 = node.param2}) + elseif msg == "del" then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_127", param2 = node.param2}) + elseif msg == "allon" then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_128", param2 = node.param2}) + elseif msg == "cursor" then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_129", param2 = node.param2}) + elseif asc and alnum_chars[asc] then + minetest.swap_node(pos, { name = "nixie_tubes:alnum_"..asc, param2 = node.param2}) + end + end +end + +for i in ipairs(alnum_chars) do + local char = alnum_chars[i][1] + local bits = alnum_chars[i][2] + + local groups = { cracky = 2, not_in_creative_inventory = 1} + local light = LIGHT_MAX-4 + local description = S("Alphanumeric Nixie Tube ("..char..")") + + local wires = "nixie_tube_alnum_wires.png" + for j = 1, 15 do + if bits[j] == 1 then + wires = wires.."^nixie_tube_alnum_seg_"..j..".png" + end + end + + if char == 32 then + groups = {cracky = 2} + light = nil + description = S("Alphanumeric Nixie Tube") + wires = "nixie_tube_alnum_wires.png" + end + + minetest.register_node("nixie_tubes:alnum_"..string.byte(char), { + description = description, + drawtype = "mesh", + mesh = "nixie_tube.obj", + tiles = { + "nixie_tube_base.png", + "nixie_tube_backing.png", + wires, + "nixie_tube_anode.png", + "nixie_tube_glass.png", + }, + use_texture_alpha = true, + groups = groups, + paramtype = "light", + paramtype2 = "facedir", + light_source = light, + selection_box = tube_cbox, + collision_box = tube_cbox, + on_construct = function(pos) + reset_meta(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + if (fields.channel) then + minetest.get_meta(pos):set_string("channel", fields.channel) + end + end, + digiline = { + receptor = {}, + effector = { + action = on_digiline_receive_alnum + }, + }, + drop = "nixie_tubes:alnum_32" + }) +end diff --git a/textures/nixie_tube_alnum_seg_1.png b/textures/nixie_tube_alnum_seg_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc70b0951605fc33e1b8e2ddd8f85f84a095312 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=*F9YvLn>~)y}Z!RDN*9s$N$GI z59OG2A9PTYFG{{PVxwgPXr? zZcBRvl&vT}t~{OR#7-uoRU6eerJS8$ng4L|+m((FmpsyEk!z6kwVQF_X=m{aqo-|l zxnX;pBm(86C#uVCPzd^PSbkzv(zT7-T)g&0ZuIQr^whtg@OY+}q-|DA_%9~b{ZsZB zrwLvYNtb+Ja75hFSZ_sW$bN=*H(R5XCaHL0K@9&Gi>~P>tdfzk1A39c)78&qol`;+ E0Ip|h$N&HU literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_10.png b/textures/nixie_tube_alnum_seg_10.png new file mode 100644 index 0000000000000000000000000000000000000000..8b01a26efa245842187968500c70a351d975f910 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU^Mh}aSW-r_4exCtSNy4Y!A}S zcDwW{u>DaKa>-ZJycBtZlx?$ZvxJ5-51#w zT>0JmM^m<2-<{1Cfy!;CYR%8gS3gz4wZZ@Gt6R(D^QxcDRc{kBF#jfQQTX6Y_U*cB z&;QMx|4SgJKVX*GS~b=p(p6xQS!9INirz2@T#=1dqnDd5%DOQM67Al*K#U*> z89FZpVN_HSS_F}lXs%{a8ct8S=5%v<_V2=z1>Lo`)7k%XbKu-O=lMRr-*e8xAxV-X zNs=TYHbPkxkMEeHU!6mS!kY%C z^4PPc?W9+guKJ@E_|nsUu-Q3lW1EF>3NOsG1#m^_HLppHHQL?pIxkt^Icw!BKfvEh zI7iVuMJ$q2r`?d{vC*8$4v@PLU_ep92x@SpyrMSuXo$>;>nC>|rY}G(@pi#{1w%e^ z&=_dOJa?(8%3x^_D&U5RgZMn~Z4nftt#l0Jw{= z&S?cZ{q7UrmprcE%S5ZPRPa7+M5X?p5zrJu>dB#1;6b%?d`n=dfM_$YO~+9jngkhF`?2(uc%+gi0HIsKY}@tu*l(f?q5)0Lg8Fd< z{(p#Mb+}En4rA(MZL!b$VV7YuLEJCI$5q94^>Ks7xZK>ydPFYY2rtgSzs~*@;b9>@ kpF$)_k|arzB*{4a2@KKa*Oc&hng9R*07*qoM6N<$g5(yT=>Px# literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_12.png b/textures/nixie_tube_alnum_seg_12.png new file mode 100644 index 0000000000000000000000000000000000000000..47397111029b9b980fa83b8c7935f5aad504522c GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU`+6IaSW-r_4ejQufq-u?H}J4 ztz>c8&2jhDlV>k3xC^{`q-15?`GaX+o5ilx-QCT}3;ASaTv^nY2MLJF>U=BGyZ$KP z;?nX-|LO%aJQd32J-vhk1QB4S;r(MjZg1FP_*rtH^WE|l%VnG=eX5%(WxeIYoA$st zg`VeaK1){XR9@+nPrSi4FXGum=505aAIxIytNf6?r-=0#OZ-WOCkG7voXSj6e?8mb zoWZY-6N}{D+RAL~KkBoLpUqp|TkPA)oQ99G$Ng@mUA{BbDCk3dO!!TP{~b&k4XDWB z&+$k1uZ8Lz_%ZRi@6BhIY{ZW9ZjeyBb>N}q{#MP*2L*}qJ09(8EOua=(qq7*wtR1* z!^w_E?VFW9UA6eFz0kFn*DUgpK!ds8&d0~TJlZej|IPK-`=AZyxEQ|gnNe)_?4ACJ qa>ISIzip0~x8(q<5(rE>CjQCVLuFZ5(OzJXGkCiCxvX~Tm)7hA8u9CHi-1>n@X@VhAOOnDy;EKeQMj1gtMK|6h*1gwaghYt= z<6=-oMJ2HeBa#Y#%vMnv)6H$p&28#;r;GL%=y&evyYsp^7th7>ocH;h^E~G~BuSDa zNs=T&FxIu_-3Ny3w%Z0e(zs|=cLVRKRgShDr5MMLjUFKP+KWs8K z-2s%{w2l*Eo5il#>NmR_^>TdP0*LFUuM)~{+MTwlGvHNC-mpyGrk`ZXEVZntBBBF>@L7wU9ct&o)f zre+bW)M(gd%iN<9S8+m*avfTo39H1Ct$?`QT&z{^DUE_0epN8!fJF}L%GL(0r~$-p z1wESOZF0XV73jqY$K>qsxAWSwGy27^fX`JK)1ux(>L&M^-?^yV2WtG}03noe0Noaw zZ@oL^mEkn{eXY--u+3$UXYY)nD2rfh5v)*c&^k39bQ>mc+<<70WzNUbLfD(F(Jx8` z#4*8Pd3{zYx7kt^pbM9MV~!)HK@iAPB|<1P_4c| zv?H4V+*k!Xh7LKkR;ci#X2AryOc=7yxbMTeMrGJ_2N2&D!UoYcx8NBMt5c3aoYCcq zPwdhs-F7fZuwLfB_C@|iV$aMHNwqT>qgGc(1vX6kRR p*M<1(4DEc9BuSDaNs|2k{0qZh>;5LWKS}@q002ovPDHLkV1mn6tK0wp literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_14.png b/textures/nixie_tube_alnum_seg_14.png new file mode 100644 index 0000000000000000000000000000000000000000..8cfccb142566fb80b0860d4b5b734994ac0cbfa9 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU^MV_aSW-r_4evsFJ?!Pwuj$S z)KC73=HeF9dL--O(lmFeE7wu(3x}L?bocUZ6uPvccj;2`2?^=yNs5bFS0+vIE!)$2 zH|K=V-+BLP4$C|{!zc&`6YCGV2|l`Q@lG??D^h@YHqQ!S=^vfB4eNyp4rno2Pl;e@ znzFn~$V%nTM~ChXJHs1qf6RW^w(E!FF|!XRO#Een9=CY4>F}#m+*%X-xPwhUM(i_F z%(_>mGUs(R8-(;dj9BQ!ao~?i-vKt!S0*zaO)(05CD_1NyX(u22ffAFmp)d{i0!Xu zDXMR(n;$u?<42m_VGaq!_&uNUeC__~rI{bCY5OUC;m`}lyF8hk2F%++->^yCm9jbZ u=jRNP{Z-jpI6@YsN!uWZ)j&bD&mpObd=DY+3A%mx@pUXO@geCxw1Cw?D literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_15.png b/textures/nixie_tube_alnum_seg_15.png new file mode 100644 index 0000000000000000000000000000000000000000..61aeeadf01833745a603b398579dccc9c8b02636 GIT binary patch literal 797 zcmV+&1LFLNP)K)e>`2!GhpPM7`)iZ>C3&f_U`e(WCXI1w{}M zPl5+Q=pm-nN?UDuNNGV+vu)jMn$0G=GafqC(3=(w*5?Ovn8Q5tKL7WbcL*Vb5JCtc zgb+dqA%qY@2qA4pUz12ANK8vj zNu@;qnZ$z3ybQTqp1l7@IRA|R@>xl8?9WB#vl668?2_82Y+Nptq3tj`!`&CV;dDUUhN^CgkOJDdv z+k(_DUeY!pl^M{H`b{sd$*joH-}32f{{-Z(D4A4pP|1Xnid?FPzR&E`F=?kM6_2Qz zQFlPixQ2=yQm`p=UB`-LEoZgO>GN;Vm6epy z^SNPdlWHC^=utI~soSq^Le-FpRH^tda&(I#gT+d+Vt+d_ZR=XDXgO!ax4OQw;wM#0 zp0kFszFzW_-u4FYx={mW44PImqi(;NNwwP=&ai=1TraM+Rb;Aa8faiA2DUtNE07iI zRxA~P%;}o9VJ>;s)olwPf6+bmJ8F-&jHs(f?I^0|MZ;}e!&RAsN&coaUy;1=*AK_P_ZR5lxRMt%oj324$CXvJT+?x0*J*t}6b)atL(>!1J)oy7 zOP;*B(0o=2l4CZok$r)`DlLM+!`i9@$~X^c}MvJ;)O*8m&6N1LIh$;gk+BJN%gGU%a;})*xrzI z>vOabi{4Ma2hu_kg$uj*Wp}HrxvZ4j*}`6=cS!Dh>Nzhh(;sOc5A8ZLX`}aS=Cm8n zTd(d2&YR}Nx`6fLi~};4do~_364tq(w&4)l)`$EPgd`X=OS4Qm4lr<-Sjx6CRBqh* z>Cw)^?XlOix1V1ns_mdK II;Vst01dB|d;kCd literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_3.png b/textures/nixie_tube_alnum_seg_3.png new file mode 100644 index 0000000000000000000000000000000000000000..94f95f272f0c94b0d72523182b1a652e672e8e05 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV2t;4aSW-r_4cNr_hAQ#_K(kf zCo5@abu8k0^uqncDvOSe=BBxScy{gTTs^sY^8ACo0!MB>N)I^VxN5Nm>+LPIvOUgX z2QB7)|F5ff`k?L3mk~ET(3iZu9=FN^E@O?SO4E8V2Cq#y85}Sb4q9e0Mibwy8r+H literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_4.png b/textures/nixie_tube_alnum_seg_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5b435d7876ebb751f10796a941ce9db699aad863 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU=;IoaSW-r_4e9+FJ?!9hL8E5 z!+D!>6`Z)TS1Xi-i7A=cHBb9CZJJowwn_%?Kxymji{b$Wy#fYHy?QM3Yg=bnzjN4k zpZUx?Ak_1iq~eK!{>`7@KB2-TVUquvnWmi&=R{O7K4NY({4g`zGCfixgRxtn>SkBK z={+-zqe?PAA1zvFp3qp%#?#n;iA%sd^FrcutK&Ks*;cVG{eO6h;_5lac=Zn3PIih` zm?v<9O(<-~((`=3m-=jwUiYHtgq5;h!n~Oi*0Rp?@R0oA=A_(S_NzNzNJ+ovnf>20 z&IV>Hiw;PIep_)ta|>%wTxZPX=axO5r)$~dR~EX@^>Tc<{D9cy3(6nWl|3gd`T2)w YbDw?I*~QVhz<^@#boFyt=akR{07N5+WB>pF literal 0 HcmV?d00001 diff --git a/textures/nixie_tube_alnum_seg_5.png b/textures/nixie_tube_alnum_seg_5.png new file mode 100644 index 0000000000000000000000000000000000000000..3abdd45cf661b39aa860ad432455848aad84873b GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV2t#1aSW-r_4ej&FJ?!Hwuj&E z=Y%OLn02vrD{#a)=X`cfvR?s!gZkQOf z+{=q8WaVT7Px%!|_OnywlpoL)-4n5jk@J|hVI6-q`xNc~$)agD>Sb0hWGOi2=JZ6w zfe{@gq=;2F9GoD{#Q%BSf|v$1<{r5?9gE{LwT^9-VA}IYBDU(wNyg=;#pf>xNa1i> z8J!rt{JHg`!$=j^gakre#&{oX~Q=mvu{=W{t2n63&l4GX$R(P@lt2$Zk@3sdFm9$Ygu!@ zub$SZ`RrqQSENUb#%{xT7Z)8gWA#4s@eJ?Z4-SD_86sC6ocB)own{(RYTPk9Ad9D$1H`+m1D+cn` zIBL>fzdL6V4OrqHZ1K5zy~NGs7ea2PItn}F6@BNT&-_t3c%KRtwrH@*_j1}ZSONdC z!JmryopRPC)S**{f@i#=)$2mcmsb_cXaM0U1&w}j!6#0NB38<&wFw)1tTI%VW{*r( z0Bm&H0v|YR&;?Xrokn?2`^w6AVivAhRsr~XhP8>!B00O1u;4|W@MS+8No{fz}^(W263+cm~rLfkrcgW~MY z$*&QZcESK^L^I0F~;hOK_U)64B3V$w75 z=e%Q^Y$w^SujiUQ!*6fctF1;)Eq#hU+D(V)E5o~t ztKZGFDtmaNwR-uvH&?ZnuDcaCWf|j}gl^~ER_c5@vJtQ5SZv9*?wgt0z^nDHq>7uF z?TgsEl2;aK+Zg4JZ$Ec9KkqZUtK{)BW(Vvw7=;ut(1ZNd`*r@8+|OZp(<2MGgvEME+kt3GNE%Y3F&YzHYzG%(-P~M^lZ%6m zVeo=blO`@EY9XnbR;3ag+8TPJiS&XX*8=}>A&w5^C;Z@fma~2Dci#6sZ_byGWPOPP zLL3nC^}MjIHvgt-H?^r%F5`@oM#Fizl{_=EZZ`jh8q;3$h~t`kV%kydsvsV@`$DdZ z1jJXBDY8$EqaO2sW)+q^X{&od@kZ}}=s^p*G| zJhevT$o--0*hK#9)MYx4?hHUb=gRbQ}W?{{MKBcC#+o4Sr7BFl^@P!+G(U<>_1v3NUfS_B8 ztPYJz72!IrIHksy;X@Ov5w~zUpkIZIb`2i2895BPE$T6D$eWSx-%n9M6m0fxY_XupZMNXG(cB)yv^8Rd0@TrI0^o$tffAa-#1R`1Y zYgOx6O@a)5k~6JWgYSK2-aD%of6Y1|9u{oFRn>}hs#9kZ{>GRQb9x*zuAA`E>QsMi zJD`T}o~S~-`#f#W^57e?WLmFFeh(~oe|2AD?GiA#yv`_5qFlf=j5>op{cb}TT)pbA zZ30S{*GgmVIBm$BVZ$bUpw_t{e;+*mdHr7VA-G@G4!g0-yvrsGh7+dz-{kv;N0KB- yk|arzBuSDaNs=T)AP3nC0RTYG$q|DWkGB6e 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 Q_+JD#*}Gt>(LR6u2SmPJ?f?J) literal 0 HcmV?d00001