88 lines
3.3 KiB
Lua
88 lines
3.3 KiB
Lua
local Circuit = {}
|
|
|
|
Circuit.color = {r = 255/255, g = 61/255, b = 61/255}
|
|
Circuit.entity_types = {'factory-circuit-connector'}
|
|
Circuit.unlocked = function(force) return force.technologies['factory-connection-type-circuit'].researched end
|
|
|
|
Circuit.connect = function(factory, cid, cpos, outside_entity, inside_entity)
|
|
if outside_entity.name ~= 'factory-circuit-connector' or inside_entity.name ~= 'factory-circuit-connector' then return nil end
|
|
|
|
local n
|
|
if outside_entity.surface == inside_entity.surface then
|
|
global.middleman_circuit_connectors = global.middleman_circuit_connectors or {}
|
|
local middle = global.middleman_circuit_connectors
|
|
n = #middle + 1
|
|
for i, pole in ipairs(middle) do if pole == 0 then n = i end end
|
|
|
|
local surface = remote_api.power_middleman_surface()
|
|
local middleman = surface.create_entity{name = 'factory-power-connection', position = {-2*(n%32)-2, 2*math.floor(n/32)}, force = 'neutral'}
|
|
middleman.destructible = false
|
|
middle[n] = middleman
|
|
|
|
middleman.connect_neighbour{wire = defines.wire_type.red, target_entity = inside_entity}
|
|
middleman.connect_neighbour{wire = defines.wire_type.green, target_entity = inside_entity}
|
|
middleman.connect_neighbour{wire = defines.wire_type.red, target_entity = outside_entity}
|
|
middleman.connect_neighbour{wire = defines.wire_type.green, target_entity = outside_entity}
|
|
else
|
|
outside_entity.connect_neighbour{wire = defines.wire_type.red, target_entity = inside_entity}
|
|
outside_entity.connect_neighbour{wire = defines.wire_type.green, target_entity = inside_entity}
|
|
end
|
|
|
|
return {inside_entity = inside_entity, outside_entity = outside_entity, do_tick_update = false, middleman_id = n}
|
|
end
|
|
|
|
local function are_connected(pole_1, pole_2)
|
|
local red, green = false, false
|
|
for _, neighbour in pairs(pole_1.neighbours.red) do
|
|
if neighbour == pole_2 then red = true break end
|
|
end
|
|
for _, neighbour in pairs(pole_1.neighbours.green) do
|
|
if neighbour == pole_2 then green = true break end
|
|
end
|
|
return red and green
|
|
end
|
|
|
|
Circuit.recheck = function(conn)
|
|
if not conn.outside_entity.valid or not conn.inside_entity.valid then return false end
|
|
|
|
if conn.middleman_id then
|
|
local middleman = global.middleman_circuit_connectors[conn.middleman_id]
|
|
if not middleman or middleman == 0 or not middleman.valid then return false end
|
|
return are_connected(conn.outside_entity, middleman) and are_connected(conn.inside_entity, middleman)
|
|
else
|
|
return are_connected(conn.outside_entity, conn.inside_entity)
|
|
end
|
|
end
|
|
|
|
Circuit.indicator_settings = {'b0'}
|
|
|
|
Circuit.direction = function(conn)
|
|
return 'b0', defines.direction.north
|
|
end
|
|
|
|
Circuit.rotate = Connections.beep
|
|
|
|
Circuit.adjust = Connections.beep
|
|
|
|
Circuit.destroy = function(conn)
|
|
local id = conn.middleman_id
|
|
if id then
|
|
local middle = global.middleman_circuit_connectors
|
|
local middleman = middle[id]
|
|
if #middle == id then middle[id] = nil else middle[id] = 0 end
|
|
if middleman and middleman ~= 0 and middleman.valid then middleman.destroy() return end
|
|
else
|
|
if not Circuit.recheck(conn) then return end
|
|
conn.inside_entity.disconnect_neighbour{
|
|
wire = defines.wire_type.red,
|
|
target_entity = conn.outside_entity
|
|
}
|
|
conn.inside_entity.disconnect_neighbour{
|
|
wire = defines.wire_type.green,
|
|
target_entity = conn.outside_entity
|
|
}
|
|
end
|
|
end
|
|
|
|
return Circuit
|