Sure! Here's what I have in my data.lua, I've removed parts unrelated to the lignumis compat
-- Load auxiliary functions
local IR2RB = require("code.functions")
--Load settings (alt base, arrow glow, belt glow)
local alternate_bases = (settings.startup["rail-style"].value == "ir3-alt")
local arrow_glow = settings.startup["arrow-glow"].value
local belt_glow = settings.startup["rail-glow"].value
-- Define each vanilla belt's parameters (tier color (as a hue), railing material, default arrows)
local belts = {
["transport"] = { hue = 0.11, base = alternate_bases and "copper" or "steel", arrows = "arrow" },
["fast-transport"] = { hue = 0, base = alternate_bases and "iron" or "steel", arrows = "arrow-doubled" },
["express-transport"] = { hue = 0.54, base = "steel", arrows = "arrow-doubled" },
}
-- Add space age compatibility (turbo belts)
if mods["space-age"] then
belts["turbo-transport"] = { hue = 0.23, base = alternate_bases and "tungsten" or "steel", arrows = "arrow-quadrupled" }
end
-- Lignumis compat
if mods["lignumis"] then
belts["wood-transport"] = { hue = 0.07, sat = 0.7, val = 0.6, base = alternate_bases and "wood" or "steel", arrows = "arrow" }
end
-- Procedurally generate each belt's new animations
for belt,beltdata in pairs(belts) do
-- Make belt tint, define arrow type, retrieve belt prototype
local tint = IR2RB.hsva2rgba(beltdata.hue, beltdata.sat or 0.8, beltdata.val or 1)
local arrows = (settings.startup["arrow-style"].value ~= "arrows") and settings.startup["arrow-style"].value or beltdata.arrows
local prototype = data.raw["transport-belt"][belt.."-belt"]
if prototype then
-- Change each belt entity's animations
prototype.belt_animation_set.animation_set = IR2RB.get_belt_animation_set(tint, beltdata.base, arrows, arrow_glow, belt_glow)
prototype.corpse = "small-remnants"
-- Change each belt icon, with alt rail texture if enabled
IR2RB.replace_item_icon(belt.."-belt", "rubber-belt-"..beltdata.base)
-- Add arrows if there's arrows
if (settings.startup["arrow-style"].value ~= "no-arrows") then
IR2RB.add_mask_to_item_icon(belt.."-belt", "rubber-belt-mask", tint, arrow_glow) end
-- Add colored rails if colored rails is on
if (settings.startup["rail-style"].value == "colored") then
IR2RB.add_mask_to_item_icon(belt.."-belt", "rubber-rail-mask", tint, belt_glow) end
-- Links each new belt's item icon to the belt's entity
IR2RB.copy_item_icons_to_entity("transport-belt", belt.."-belt")
end
end
The code uses functions defined in another file functions.lua
-- Compile the entirety of the code in a dictionnary of functions
local F = {}
F.graphics_path = "__black-rubber-belts-remastered__/graphics"
F.icons_path = F.graphics_path .. "/icons"
F.sprites_path = F.graphics_path .. "/entities"
F.setting_icons_path = F.icons_path .. "/settings"
-- Find the file path of an icon in the graphics folder
function F.get_icon_path(name, dir)
return string.format("%s/%s.png", F.graphics_path .. "/" .. (dir or "icons"), name)
end
-- Replaces old item icon (e.g. belt) with the new one (e.g. rubber belt)
function F.replace_item_icon(item_name, icon, entity_type, entity_name)
if not icon then icon = item_name end
local item = data.raw.item[item_name] or data.raw.fluid[item_name] or data.raw.tool[item_name] or data.raw.module[item_name]
item.icon = F.get_icon_path(icon)
item.icons = nil
item.icon_size = 64
item.icon_mipmaps = 4
item.pictures = nil
end
-- Adds a mask to an item's icon (e.g. belt arrow, colored railing)
function F.add_mask_to_item_icon(item_name, icon, tint)
local item = data.raw.item[item_name] or data.raw.fluid[item_name] or data.raw.tool[item_name] or data.raw.module[item_name]
if item.icons == nil then
item.icons = item.icon ~= nil and {{icon = item.icon, icon_size = item.icon_size, icon_mipmaps = item.icon_mipmaps }} or {}
end
table.insert(item.icons,
{ icon = F.get_icon_path(icon), icon_size = 64, icon_mipmaps = 4, tint = tint }
)
end
-- Adds a new icon to an existing entity
function F.copy_item_icons_to_entity(entity_type, name)
local entity = data.raw[entity_type][name]
local item = data.raw.item[name]
if entity and item then
entity.icon = item.icon
entity.icon_size = item.icon_size
entity.icon_mipmaps = item.icon_mipmaps
entity.icons = item.icons
end
end
-- Make a single layer of belt animation from a spritesheet, based on its suffix ("base-[]", "arrow-[]", "rails") and frame count.
-- The sprite can be tinted (for arrows or colored railing).
function F.get_belt_animation(suffix,tint,frame_count,repeat_count, glow)
frame_count = frame_count or 16
return {
filename = F.sprites_path.."/rubber-belt-"..suffix..".png",
priority = "extra-high",
width = 128,
height = 128,
frame_count = frame_count,
repeat_count = repeat_count,
direction_count = 20,
scale = 0.5,
tint = tint,
draw_as_glow = glow,
}
end
-- Make a belt's animation set from the associated tint, base and arrows used.
function F.get_belt_animation_set(tint, base, arrows, arrow_glow, rail_glow)
local a = arrows
local frame_arrows = { ["arrow"] = 16, ["arrow-doubled"] = 32, ["arrow-quadrupled"] = 64, ["no-arrows"] = 16 }
local f = frame_arrows[a] or 16
local layers = {
layers = {
F.get_belt_animation("base-"..base, nil, 8, f/8),
}
}
if settings.startup["arrow-style"].value ~= "no-arrows" then
table.insert(layers.layers, F.get_belt_animation(a, tint, f, nil, arrow_glow))
end
if settings.startup["rail-style"].value == "colored" then
table.insert(layers.layers, F.get_belt_animation("rails", tint, 8, f/8, rail_glow))
end
return #layers.layers > 1 and layers or layers.layers[1]
end
-- Convert color formats from %HSVa to %RGBa
function F.hsva2rgba(h, s, v, a)
if a == nil then a = 1 end
local r, g, b
local i = math.floor(h * 6);
local f = h * 6 - i;
local p = v * (1 - s);
local q = v * (1 - f * s);
local t = v * (1 - (1 - f) * s);
i = i % 6
if i == 0 then r, g, b = v, t, p
elseif i == 1 then r, g, b = q, v, p
elseif i == 2 then r, g, b = p, v, t
elseif i == 3 then r, g, b = p, q, v
elseif i == 4 then r, g, b = t, p, v
elseif i == 5 then r, g, b = v, p, q
end
return { r = r, g = g, b = b, a = a }
end
return F