From bca5b664f893cffdf11b793ea9b6543ef91dbb4b Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Sat, 7 Sep 2024 13:59:45 +0200 Subject: [PATCH] Propagate electricity transfers across servers --- module/edge/power_link.lua | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/module/edge/power_link.lua b/module/edge/power_link.lua index 8dd41f1..986a4bc 100644 --- a/module/edge/power_link.lua +++ b/module/edge/power_link.lua @@ -59,6 +59,44 @@ local function poll_links(id, edge, ticks_left) end ::continue:: end + + -- Balance links in the same power network + local networks = {} + for _, edge in pairs(global.universal_edges.edges) do + if not edge.linked_power then + goto continue + end + for _offset, link in pairs(edge.linked_power) do + if not link then + log("FATAL: Received power for non-existant link at offset " .. link.offset) + goto continue2 + end + if not link.eei then + log("FATAL: received power for a link that does not have an eei " .. link.offset) + goto continue2 + end + if link.eei.valid then + local network = link.eei.electric_network_id + if not networks[network] then + networks[network] = {} + end + networks[network][#networks[network] + 1] = link + end + ::continue2:: + end + ::continue:: + end + for _id, network in pairs(networks) do + local total_energy = 0 + for _, link in pairs(network) do + total_energy = total_energy + link.eei.energy + (link.lua_buffered_energy or 0) + end + local average_energy = total_energy / #network + for _, link in pairs(network) do + link.eei.electric_buffer_size = math.max(link.eei.electric_buffer_size, link.eei.energy + (link.lua_buffered_energy or 0), average_energy) + link.eei.energy = average_energy + end + end end local function receive_transfers(edge, power_transfers)