223 lines
5.8 KiB
Lua

require("util")
local copy = table.deepcopy
local offset = 0.234375 -- 15/64
local width = 3
local radius = width * 1.25 / 32
local color = {1, 1, 0}
-- color = {0.5, 0.5, 0, 0.5}
local connectables = {
["transport-belt"] = true,
["underground-belt"] = true,
["splitter"] = true,
["loader"] = true,
["loader-1x1"] = true,
["linked-belt"] = true,
}
local lane_cycle = {
{true, true},
{[1] = true},
{[2] = true},
}
local side_cycle = {
both = {left = true, right = true},
left = {left = true},
right = {right = true},
}
local function empty_offsets(splitter)
local t = splitter and {left = {}, right = {}} or {}
return {{
[0] = copy(t),
[2] = copy(t),
[4] = copy(t),
[6] = copy(t),
},{
[0] = copy(t),
[2] = copy(t),
[4] = copy(t),
[6] = copy(t),
}}
end
local function offsets(data)
local t = empty_offsets()
for name, distance in pairs(data) do
t[1][0][name] = {-offset, -distance}
t[1][2][name] = {distance, -offset}
t[1][4][name] = {offset, distance}
t[1][6][name] = {-distance, offset}
t[2][0][name] = {offset, -distance}
t[2][2][name] = {distance, offset}
t[2][4][name] = {-offset, distance}
t[2][6][name] = {-distance, -offset}
end
return t
end
local function splitter_offsets(data)
local t = empty_offsets(true)
for name, v in pairs(data) do
local distance = v[1]
local offset_1 = v[2]
local offset_2 = v[3]
t[1][0].left[name] = {-offset_1, -distance}
t[1][0].right[name] = {-offset_2, -distance}
t[1][2].left[name] = {distance, -offset_1}
t[1][2].right[name] = {distance, -offset_2}
t[1][4].left[name] = {offset_1, distance}
t[1][4].right[name] = {offset_2, distance}
t[1][6].left[name] = {-distance, offset_1}
t[1][6].right[name] = {-distance, offset_2}
t[2][0].left[name] = {offset_2, -distance}
t[2][0].right[name] = {offset_1, -distance}
t[2][2].left[name] = {distance, offset_2}
t[2][2].right[name] = {distance, offset_1}
t[2][4].left[name] = {-offset_2, distance}
t[2][4].right[name] = {-offset_1, distance}
t[2][6].left[name] = {-distance, -offset_2}
t[2][6].right[name] = {-distance, -offset_1}
end
return t
end
local function rectangle(offsets, data)
local t = empty_offsets()
for name, v in pairs(data) do
local offset_name = v[1]
local size = v[2]
for lane, directions in pairs(offsets) do
for direction, lane_offsets in pairs(directions) do
local offset = lane_offsets[offset_name]
t[lane][direction][name] = {
left_top = {offset[1] - size, offset[2] - size},
right_bottom = {offset[1] + size, offset[2] + size},
}
end
end
end
return t
end
local sideload = 1 - offset
local straight = offsets{
input = -0.5,
output = 0.5,
sideload = sideload,
}
local curved = {
[0] = {-0.5, -0.5},
[2] = {0.5, -0.5},
[4] = {0.5, 0.5},
[6] = {-0.5, 0.5},
}
local half_pixel_width = width / 64
local inner_min = 0.5 - offset - half_pixel_width
local inner_max = 0.5 - offset + half_pixel_width
local outer_min = 0.5 + offset - half_pixel_width
local outer_max = 0.5 + offset + half_pixel_width
local arc_radius = {
{min = inner_min, max = inner_max},
{min = outer_min, max = outer_max},
}
local dash_length = 3/16
local dash_offset = 0.5 - dash_length / 2
local gap_length = 0.5 - dash_length
local endpoint = 0.5 - (dash_length / 2 + gap_length)
local underground = offsets{
input = endpoint,
output = -endpoint,
}
local dash = offsets{
input = dash_offset,
output = -dash_offset,
}
local outer_offset = 0.5 + offset
local inner_offset = -0.5 + offset
local outer_line = outer_offset + width / 64
local inner_line = inner_offset - width / 64
local splitter = splitter_offsets{
input = {-0.5, outer_offset, inner_offset},
output = {0.5, outer_offset, inner_offset},
middle = {0, outer_offset, inner_offset},
sideload = {sideload, outer_offset, inner_offset},
line = {0, outer_line, inner_line},
}
local size = width * 1.125 / 32
local loader = offsets{
input = -1,
output = 1,
sideload = sideload + 0.5,
}
loader.rectangle = rectangle(loader, {
input = {"output", size},
output = {"input", size},
})
local loader_1x1 = offsets{
input = -0.5,
output = 0.5,
sideload = sideload,
}
loader_1x1.rectangle = rectangle(loader_1x1, {
input = {"output", size},
output = {"input", size},
})
local linked_belt = offsets{
input = -0.5,
output = 0.5,
middle = 0,
sideload = sideload,
}
-- local speeds = {
-- default = {1, 1, 1},
-- [15/480] = {1, 1, 0},
-- [30/480] = {1, 0, 0},
-- [45/480] = {0, 0.75, 1},
-- }
-- local function generate_colors()
-- local colors = {}
-- local filters = {}
-- local i = 1
-- for ptype in pairs(connectables) do
-- filters[i] = ptype
-- i = i + 1
-- end
-- for name, prototype in pairs(game.get_filtered_entity_prototypes{{filter = "type", type = filters}}) do
-- colors[name] = speeds[prototype.belt_speed] or speeds.default
-- end
-- return colors
-- end
return {
width = width,
color = color,
radius = radius,
connectables = connectables,
lane_cycle = lane_cycle,
side_cycle = side_cycle,
straight = straight,
curved = curved,
arc_radius = arc_radius,
underground = underground,
dash = dash,
dash_length = dash_length,
gap_length = gap_length,
splitter = splitter,
loader = loader,
loader_1x1 = loader_1x1,
linked_belt = linked_belt,
-- generate_colors = generate_colors,
}