diff options
author | Vanessa Dannenberg <vanessa.e.dannenberg@gmail.com> | 2018-09-25 21:34:03 -0400 |
---|---|---|
committer | Vanessa Dannenberg <vanessa.e.dannenberg@gmail.com> | 2018-09-25 21:34:03 -0400 |
commit | ceeb41ec8bd06dabdb0899a30701220e69862672 (patch) | |
tree | b732d17166436260d24a2e934bf5850f6a60665f /street_signs/init.lua | |
parent | f7874dbfd9b47c14f85f11d8bfc1a09ad12870f4 (diff) | |
download | dreambuilder_modpack-ceeb41ec8bd06dabdb0899a30701220e69862672.tar dreambuilder_modpack-ceeb41ec8bd06dabdb0899a30701220e69862672.tar.gz dreambuilder_modpack-ceeb41ec8bd06dabdb0899a30701220e69862672.tar.bz2 dreambuilder_modpack-ceeb41ec8bd06dabdb0899a30701220e69862672.tar.xz dreambuilder_modpack-ceeb41ec8bd06dabdb0899a30701220e69862672.zip |
switch to tenplus1's bees redo
update signs_lib and street signs mods
Diffstat (limited to 'street_signs/init.lua')
-rw-r--r-- | street_signs/init.lua | 567 |
1 files changed, 487 insertions, 80 deletions
diff --git a/street_signs/init.lua b/street_signs/init.lua index 3c08ab3..9b96b69 100644 --- a/street_signs/init.lua +++ b/street_signs/init.lua @@ -1,4 +1,7 @@ --- This mod provides basic green two-stack street name signs +-- This mod provides your standard green street name signs +-- (that is, the two-up, 2m high ones identifying street intersections), +-- and the larger kind found above or alongside highways +-- -- forked from signs_lib by Diego Martinez et. al street_signs = {} @@ -46,9 +49,6 @@ local CHAR_FILE = "%s_%02x.png" -- Fonts path local CHAR_PATH = TP .. "/" .. CHAR_FILE --- Font name. -local font_name = "street_signs_font" - -- Lots of overkill here. KISS advocates, go away, shoo! ;) -- kaeza local PNG_HDR = string.char(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A) @@ -93,62 +93,51 @@ local function read_image_size(filename) return ws:byte(), hs:byte() end --- Set by build_char_db() -local LINE_HEIGHT -local SIGN_WIDTH -local COLORBGW, COLORBGH - --- Size of the canvas, in characters. --- Please note that CHARS_PER_LINE is multiplied by the average character --- width to get the total width of the canvas, so for proportional fonts, --- either more or fewer characters may fit on a line. -local CHARS_PER_LINE = 30 -local NUMBER_OF_LINES = 4 - -- 4 rows, max 80 chars per, plus a bit of fudge to -- avoid excess trimming (e.g. due to color codes) local MAX_INPUT_CHARS = 400 --- This holds the individual character widths. --- Indexed by the actual character (e.g. charwidth["A"]) -local charwidth - -- helper functions to trim sign text input/output local function trim_input(text) return text:sub(1, math.min(MAX_INPUT_CHARS, text:len())) end -local function build_char_db() +local function build_char_db(font_size) - charwidth = { } + local cw = {} -- To calculate average char width. local total_width = 0 local char_count = 0 for c = 32, 255 do - local w, h = read_image_size(CHAR_PATH:format(font_name, c)) + local w, h = read_image_size(CHAR_PATH:format("street_signs_font_"..font_size.."px", c)) if w and h then local ch = string.char(c) - charwidth[ch] = w + cw[ch] = w total_width = total_width + w char_count = char_count + 1 end end - COLORBGW, COLORBGH = read_image_size(TP.."/street_signs_color_n.png") - assert(COLORBGW and COLORBGH, "error reading bg dimensions") - LINE_HEIGHT = COLORBGH + 6 + local cbw, cbh = read_image_size(TP.."/street_signs_color_"..font_size.."px_n.png") + assert(cbw and cbh, "error reading bg dimensions") + return cw, cbw, cbh, (total_width / char_count) +end - -- XXX: Is there a better way to calc this? - SIGN_WIDTH = math.floor((total_width / char_count) * CHARS_PER_LINE) +street_signs.charwidth15, +street_signs.colorbgw15, +street_signs.lineheight15, +street_signs.avgwidth15 = build_char_db(15) -end +street_signs.charwidth31, +street_signs.colorbgw31, +street_signs.lineheight31, +street_signs.avgwidth31 = build_char_db(31) local sign_groups = {choppy=2, dig_immediate=2} - local fences_with_sign = { } -- some local helper functions @@ -164,11 +153,11 @@ end local math_max = math.max -local function fill_line(x, y, w, c) +local function fill_line(x, y, w, c, font_size, colorbgw) c = c or "0" local tex = { } - for xx = 0, math.max(0, w), COLORBGW do - table.insert(tex, (":%d,%d=street_signs_color_%s.png"):format(x + xx, y, c)) + for xx = 0, math.max(0, w), colorbgw do + table.insert(tex, (":%d,%d=street_signs_color_"..font_size.."px_%s.png"):format(x + xx, y, c)) end return table.concat(tex) end @@ -186,14 +175,15 @@ local function char_tex(font_name, ch) return tex, exists end -local function make_line_texture(line, lineno, pos) - +local function make_line_texture(line, lineno, pos, line_width, line_height, cwidth_tab, font_size, colorbgw) local width = 0 local maxw = 0 + local font_name = "street_signs_font_"..font_size.."px" local words = { } - local n = minetest.registered_nodes[minetest.get_node(pos).name] - local default_color = n.default_color or 0 + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + local default_color = def.default_color or 0 local cur_color = tonumber(default_color, 16) @@ -212,10 +202,10 @@ local function make_line_texture(line, lineno, pos) cur_color = cc end else - local w = charwidth[c] + local w = cwidth_tab[c] if w then width = width + w + 1 - if width >= (SIGN_WIDTH - charwidth[" "]) then + if width >= (line_width - cwidth_tab[" "]) then width = 0 else maxw = math_max(width, maxw) @@ -232,7 +222,7 @@ local function make_line_texture(line, lineno, pos) end i = i + 1 end - width = width + charwidth[" "] + 1 + width = width + cwidth_tab[" "] + 1 maxw = math_max(width, maxw) table.insert(words, { chars=chars, w=ch_offs }) end @@ -241,27 +231,27 @@ local function make_line_texture(line, lineno, pos) local texture = { } - local start_xpos = math.floor((SIGN_WIDTH - maxw) / 2) + 6 + local start_xpos = math.floor((line_width - maxw) / 2) + def.x_offset local xpos = start_xpos - local ypos = (LINE_HEIGHT * lineno) + 4 + local ypos = (line_height + def.line_spacing)* lineno + def.y_offset cur_color = nil for word_i, word in ipairs(words) do local xoffs = (xpos - start_xpos) if (xoffs > 0) and ((xoffs + word.w) > maxw) then - table.insert(texture, fill_line(xpos, ypos, maxw, "n")) + table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) xpos = start_xpos - ypos = ypos + LINE_HEIGHT + ypos = ypos + line_height + def.line_spacing lineno = lineno + 1 - if lineno >= NUMBER_OF_LINES then break end - table.insert(texture, fill_line(xpos, ypos, maxw, cur_color)) + if lineno >= def.number_of_lines then break end + table.insert(texture, fill_line(xpos, ypos, maxw, cur_color, font_size, colorbgw)) end for ch_i, ch in ipairs(word.chars) do if ch.col ~= cur_color then cur_color = ch.col - table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color)) + table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color, font_size, colorbgw)) end table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex)) end @@ -269,24 +259,46 @@ local function make_line_texture(line, lineno, pos) texture, (":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ") ) - xpos = xpos + word.w + charwidth[" "] - if xpos >= (SIGN_WIDTH + charwidth[" "]) then break end + xpos = xpos + word.w + cwidth_tab[" "] + if xpos >= (line_width + cwidth_tab[" "]) then break end end - table.insert(texture, fill_line(xpos, ypos, maxw, "n")) - table.insert(texture, fill_line(start_xpos, ypos + LINE_HEIGHT, maxw, "n")) + table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) + table.insert(texture, fill_line(start_xpos, ypos + line_height, maxw, "n", font_size, colorbgw)) return table.concat(texture), lineno end local function make_sign_texture(lines, pos) - local texture = { ("[combine:%dx%d"):format(SIGN_WIDTH, LINE_HEIGHT * NUMBER_OF_LINES) } + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + + local font_size + local line_width + local line_height + local char_width + local colorbgw + + if def.font_size and def.font_size == 31 then + font_size = 31 + line_width = math.floor(street_signs.avgwidth31 * def.chars_per_line) * def.horiz_scaling + line_height = street_signs.lineheight31 + char_width = street_signs.charwidth31 + colorbgw = street_signs.colorbgw31 + else + font_size = 15 + line_width = math.floor(street_signs.avgwidth15 * def.chars_per_line) * def.horiz_scaling + line_height = street_signs.lineheight15 + char_width = street_signs.charwidth15 + colorbgw = street_signs.colorbgw15 + end + + local texture = { ("[combine:%dx%d"):format(line_width, (line_height + def.line_spacing) * def.number_of_lines * def.vert_scaling) } + local lineno = 0 for i = 1, #lines do - if lineno >= NUMBER_OF_LINES then break end - local linetex, ln = make_line_texture(lines[i], lineno, pos) - table.insert(texture, linetex) - local linetex, ln = make_line_texture(lines[i], lineno+1, pos) + if lineno >= def.number_of_lines then break end + local linetex, ln = make_line_texture(lines[i], lineno, pos, line_width, line_height, char_width, font_size, colorbgw) table.insert(texture, linetex) lineno = ln + 1 end @@ -426,6 +438,14 @@ minetest.register_node("street_signs:sign_basic", { on_punch = function(pos, node, puncher) street_signs.update_sign(pos) end, + number_of_lines = 2, + horiz_scaling = 1, + vert_scaling = 1, + line_spacing = 6, + font_size = 15, + x_offset = 1, + y_offset = 3, + chars_per_line = 30, entity_info = { mesh = "street_signs_basic_entity.obj", yaw = { @@ -473,6 +493,14 @@ minetest.register_node("street_signs:sign_basic_top_only", { on_punch = function(pos, node, puncher) street_signs.update_sign(pos) end, + number_of_lines = 2, + horiz_scaling = 1, + vert_scaling = 1, + line_spacing = 6, + font_size = 15, + x_offset = 1, + y_offset = 3, + chars_per_line = 30, entity_info = { mesh = "street_signs_basic_top_only_entity.obj", yaw = { @@ -484,6 +512,315 @@ minetest.register_node("street_signs:sign_basic_top_only", { } }) +local colors = { + { "green", "f", "dye:green", "dye:white" }, + { "blue", "f", "dye:blue", "dye:white" }, + { "yellow", "0", "dye:yellow", "dye:black" } +} + +for _, c in ipairs(colors) do + + cbox = { + type = "fixed", + fixed = { -0.4375, -0.4375, 0.375, 1.4375, 0.4375, 0.5 } + } + + local color = c[1] + local defc = c[2] + + minetest.register_node("street_signs:sign_highway_small_"..color, { + description = "Small highway sign ("..color..")", + inventory_image = "street_signs_highway_small_"..color.."_inv.png", + wield_image = "street_signs_highway_small_"..color.."_inv.png", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "mesh", + node_box = cbox, + selection_box = cbox, + mesh = "street_signs_highway_small.obj", + tiles = { "street_signs_highway_small_"..color..".png" }, + default_color = defc, + groups = {choppy=2, dig_immediate=2}, + on_construct = function(pos) + street_signs.construct_sign(pos) + end, + on_destruct = function(pos) + street_signs.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + street_signs.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + street_signs.update_sign(pos) + end, + number_of_lines = 3, + horiz_scaling = 2, + vert_scaling = 1.15, + line_spacing = 2, + font_size = 31, + x_offset = 9, + y_offset = 7, + chars_per_line = 22, + entity_info = { + mesh = "street_signs_highway_small_entity.obj", + yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, + } + } + }) + cbox = { + type = "fixed", + fixed = { -0.4375, -0.4375, 0.375, 1.4375, 1.4375, 0.5 } + } + + minetest.register_node("street_signs:sign_highway_medium_"..color, { + description = "Medium highway sign ("..color..")", + inventory_image = "street_signs_highway_medium_"..color.."_inv.png", + wield_image = "street_signs_highway_medium_"..color.."_inv.png", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "mesh", + node_box = cbox, + selection_box = cbox, + mesh = "street_signs_highway_medium.obj", + tiles = { "street_signs_highway_medium_"..color..".png" }, + default_color = defc, + groups = {choppy=2, dig_immediate=2}, + on_construct = function(pos) + street_signs.construct_sign(pos) + end, + on_destruct = function(pos) + street_signs.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + street_signs.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + street_signs.update_sign(pos) + end, + number_of_lines = 6, + horiz_scaling = 2, + vert_scaling = 0.915, + line_spacing = 2, + font_size = 31, + x_offset = 7, + y_offset = 10, + chars_per_line = 22, + entity_info = { + mesh = "street_signs_highway_medium_entity.obj", + yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, + } + } + }) + + cbox = { + type = "fixed", + fixed = { -0.4375, -0.4375, 0.375, 2.4375, 1.4375, 0.5 } + } + + minetest.register_node("street_signs:sign_highway_large_"..color, { + description = "Large highway sign ("..color..")", + inventory_image = "street_signs_highway_large_"..color.."_inv.png", + wield_image = "street_signs_highway_large_"..color.."_inv.png", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "mesh", + node_box = cbox, + selection_box = cbox, + mesh = "street_signs_highway_large.obj", + tiles = { "street_signs_highway_large_"..color..".png" }, + default_color = defc, + groups = {choppy=2, dig_immediate=2}, + on_construct = function(pos) + street_signs.construct_sign(pos) + end, + on_destruct = function(pos) + street_signs.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + street_signs.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + street_signs.update_sign(pos) + end, + number_of_lines = 6, + horiz_scaling = 2, + vert_scaling = 0.915, + line_spacing = 2, + font_size = 31, + x_offset = 12, + y_offset = 11, + chars_per_line = 25, + entity_info = { + mesh = "street_signs_highway_large_entity.obj", + yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, + } + } + }) +end + +cbox = { + type = "fixed", + fixed = { -0.5, -0.5, 0.4375, 0.5, 0.5, 0.5 } +} + +minetest.register_node("street_signs:sign_us_route", { + description = "Basic \"US Route\" sign", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "mesh", + node_box = cbox, + selection_box = cbox, + mesh = "street_signs_us_route.obj", + tiles = { "street_signs_us_route.png" }, + inventory_image = "street_signs_us_route_inv.png", + groups = {choppy=2, dig_immediate=2}, + default_color = "0", + on_construct = function(pos) + street_signs.construct_sign(pos) + end, + on_destruct = function(pos) + street_signs.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + street_signs.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + street_signs.update_sign(pos) + end, + number_of_lines = 1, + horiz_scaling = 3.5, + vert_scaling = 1.4, + line_spacing = 6, + font_size = 31, + x_offset = 8, + y_offset = 12, + chars_per_line = 3, + entity_info = { + mesh = "street_signs_us_route_entity.obj", + yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, + } + } +}) + +cbox = { + type = "fixed", + fixed = { -0.45, -0.45, 0.4375, 0.45, 0.45, 0.5 } +} + +minetest.register_node("street_signs:sign_us_interstate", { + description = "Basic US \"Interstate\" sign", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "mesh", + node_box = cbox, + selection_box = cbox, + mesh = "street_signs_us_interstate.obj", + tiles = { "street_signs_us_interstate.png" }, + inventory_image = "street_signs_us_interstate_inv.png", + groups = {choppy=2, dig_immediate=2}, + default_color = "f", + on_construct = function(pos) + street_signs.construct_sign(pos) + end, + on_destruct = function(pos) + street_signs.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + street_signs.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + street_signs.update_sign(pos) + end, + number_of_lines = 1, + horiz_scaling = 4.5, + vert_scaling = 1.4, + line_spacing = 6, + font_size = 31, + x_offset = 8, + y_offset = 14, + chars_per_line = 3, + entity_info = { + mesh = "street_signs_us_interstate_entity.obj", + yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, + } + } +}) + + +cbox = { + type = "fixed", + fixed = { -0.5, -0.5, 0.4375, 0.5, 0.5, 0.5 } +} + +minetest.register_node("street_signs:sign_warning", { + description = "Basic US diamond-shaped \"warning\" sign", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "mesh", + node_box = cbox, + selection_box = cbox, + mesh = "street_signs_warning.obj", + tiles = { "street_signs_warning.png" }, + inventory_image = "street_signs_warning_inv.png", + groups = {choppy=2, dig_immediate=2}, + default_color = "0", + on_construct = function(pos) + street_signs.construct_sign(pos) + end, + on_destruct = function(pos) + street_signs.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + street_signs.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + street_signs.update_sign(pos) + end, + number_of_lines = 3, + horiz_scaling = 1.75, + vert_scaling = 1.4, + line_spacing = 1, + font_size = 15, + x_offset = 6, + y_offset = 10, + chars_per_line = 15, + entity_info = { + mesh = "street_signs_warning_entity.obj", + yaw = { + 0, + math.pi / -2, + math.pi, + math.pi / 2, + } + } +}) + local signs_text_on_activate signs_text_on_activate = function(self) @@ -510,9 +847,7 @@ minetest.register_entity("street_signs:text", { on_activate = signs_text_on_activate, }) -build_char_db() - --- craft it! +-- crafts minetest.register_craft({ output = "street_signs:sign_basic", @@ -532,18 +867,6 @@ minetest.register_craft({ } }) -if minetest.get_modpath("signs_lib") then - minetest.register_craft({ - output = "street_signs:sign_basic", - recipe = { - { "", "signs:sign_wall_green", "" }, - { "", "default:steel_ingot", "" }, - { "", "default:steel_ingot", "" }, - } - }) -end - - minetest.register_craft({ output = "street_signs:sign_basic_top_only", recipe = { @@ -561,7 +884,68 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "street_signs:sign_basic", + recipe = { + { "street_signs:sign_basic_top_only" }, + { "default:steel_ingot" } + } +}) + +for _, c in ipairs(colors) do + + local color = c[1] + local defc = c[2] + local dye1 = c[3] + local dye2 = c[4] + + minetest.register_craft({ + output = "street_signs:sign_highway_small_"..color, + recipe = { + { dye1, dye2, dye1 }, + { dye1, dye2, dye1 }, + { "default:sign_wall_steel", "default:sign_wall_steel", "" } + } + }) + + minetest.register_craft({ + output = "street_signs:sign_highway_small_"..color, + recipe = { + { dye1, dye2, dye1 }, + { dye1, dye2, dye1 }, + { "", "default:sign_wall_steel", "default:sign_wall_steel" } + } + }) + + minetest.register_craft({ + output = "street_signs:sign_highway_medium_"..color, + recipe = { + { "street_signs:sign_highway_small_"..color }, + { "street_signs:sign_highway_small_"..color } + } + }) + + minetest.register_craft({ + output = "street_signs:sign_highway_large_"..color, + recipe = { + { "street_signs:sign_highway_small_"..color }, + { "street_signs:sign_highway_small_"..color }, + { "street_signs:sign_highway_small_"..color } + } + }) +end + if minetest.get_modpath("signs_lib") then + + minetest.register_craft({ + output = "street_signs:sign_basic", + recipe = { + { "", "signs:sign_wall_green", "" }, + { "", "default:steel_ingot", "" }, + { "", "default:steel_ingot", "" }, + } + }) + minetest.register_craft({ output = "street_signs:sign_basic_top_only", recipe = { @@ -569,16 +953,39 @@ if minetest.get_modpath("signs_lib") then { "default:steel_ingot" }, } }) -end -minetest.register_craft({ - output = "street_signs:sign_basic", - recipe = { - { "street_signs:sign_basic_top_only" }, - { "default:steel_ingot" } - } -}) + for _, c in ipairs(colors) do + + local color = c[1] + local defc = c[2] + + minetest.register_craft({ + output = "street_signs:sign_highway_small_"..color, + recipe = { + { "signs:sign_wall_"..color, "signs:sign_wall_"..color }, + } + }) + + minetest.register_craft({ + output = "street_signs:sign_highway_medium_"..color, + recipe = { + { "signs:sign_wall_"..color, "signs:sign_wall_"..color }, + { "signs:sign_wall_"..color, "signs:sign_wall_"..color } + } + }) + + minetest.register_craft({ + output = "street_signs:sign_highway_large_"..color, + recipe = { + { "signs:sign_wall_"..color, "signs:sign_wall_"..color, "signs:sign_wall_"..color }, + { "signs:sign_wall_"..color, "signs:sign_wall_"..color, "signs:sign_wall_"..color } + } + }) + + end +end +-- crafts, highway signs -- restore signs' text after /clearobjects and the like, the next time |