Factorio: energy link bridge improvements (#4182)
* improve energy link performance on large surfaces * Add Energy link bridge storage table to initialization. * Fix event based energy link for Factorio 2.0 * Adjust energy link bridge for quality.
This commit is contained in:
parent
7eb12174b7
commit
a3d6036939
|
@ -134,40 +134,96 @@ end
|
|||
|
||||
script.on_event(defines.events.on_player_changed_position, on_player_changed_position)
|
||||
{% endif %}
|
||||
|
||||
function count_energy_bridges()
|
||||
local count = 0
|
||||
for i, bridge in pairs(storage.energy_link_bridges) do
|
||||
if validate_energy_link_bridge(i, bridge) then
|
||||
count = count + 1 + (bridge.quality.level * 0.3)
|
||||
end
|
||||
end
|
||||
return count
|
||||
end
|
||||
function get_energy_increment(bridge)
|
||||
return ENERGY_INCREMENT + (ENERGY_INCREMENT * 0.3 * bridge.quality.level)
|
||||
end
|
||||
function on_check_energy_link(event)
|
||||
--- assuming 1 MJ increment and 5MJ battery:
|
||||
--- first 2 MJ request fill, last 2 MJ push energy, middle 1 MJ does nothing
|
||||
if event.tick % 60 == 30 then
|
||||
local surface = game.get_surface(1)
|
||||
local force = "player"
|
||||
local bridges = surface.find_entities_filtered({name="ap-energy-bridge", force=force})
|
||||
local bridgecount = table_size(bridges)
|
||||
local bridges = storage.energy_link_bridges
|
||||
local bridgecount = count_energy_bridges()
|
||||
storage.forcedata[force].energy_bridges = bridgecount
|
||||
if storage.forcedata[force].energy == nil then
|
||||
storage.forcedata[force].energy = 0
|
||||
end
|
||||
if storage.forcedata[force].energy < ENERGY_INCREMENT * bridgecount * 5 then
|
||||
for i, bridge in ipairs(bridges) do
|
||||
if bridge.energy > ENERGY_INCREMENT*3 then
|
||||
storage.forcedata[force].energy = storage.forcedata[force].energy + (ENERGY_INCREMENT * ENERGY_LINK_EFFICIENCY)
|
||||
bridge.energy = bridge.energy - ENERGY_INCREMENT
|
||||
for i, bridge in pairs(bridges) do
|
||||
if validate_energy_link_bridge(i, bridge) then
|
||||
energy_increment = get_energy_increment(bridge)
|
||||
if bridge.energy > energy_increment*3 then
|
||||
storage.forcedata[force].energy = storage.forcedata[force].energy + (energy_increment * ENERGY_LINK_EFFICIENCY)
|
||||
bridge.energy = bridge.energy - energy_increment
|
||||
end
|
||||
end
|
||||
end
|
||||
for i, bridge in ipairs(bridges) do
|
||||
if storage.forcedata[force].energy < ENERGY_INCREMENT then
|
||||
end
|
||||
for i, bridge in pairs(bridges) do
|
||||
if validate_energy_link_bridge(i, bridge) then
|
||||
energy_increment = get_energy_increment(bridge)
|
||||
if storage.forcedata[force].energy < energy_increment and bridge.quality.level == 0 then
|
||||
break
|
||||
end
|
||||
if bridge.energy < ENERGY_INCREMENT*2 and storage.forcedata[force].energy > ENERGY_INCREMENT then
|
||||
storage.forcedata[force].energy = storage.forcedata[force].energy - ENERGY_INCREMENT
|
||||
bridge.energy = bridge.energy + ENERGY_INCREMENT
|
||||
if bridge.energy < energy_increment*2 and storage.forcedata[force].energy > energy_increment then
|
||||
storage.forcedata[force].energy = storage.forcedata[force].energy - energy_increment
|
||||
bridge.energy = bridge.energy + energy_increment
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function string_starts_with(str, start)
|
||||
return str:sub(1, #start) == start
|
||||
end
|
||||
function validate_energy_link_bridge(unit_number, entity)
|
||||
if not entity then
|
||||
if storage.energy_link_bridges[unit_number] == nil then return false end
|
||||
storage.energy_link_bridges[unit_number] = nil
|
||||
return false
|
||||
end
|
||||
if not entity.valid then
|
||||
if storage.energy_link_bridges[unit_number] == nil then return false end
|
||||
storage.energy_link_bridges[unit_number] = nil
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
function on_energy_bridge_constructed(entity)
|
||||
if entity and entity.valid then
|
||||
if string_starts_with(entity.prototype.name, "ap-energy-bridge") then
|
||||
storage.energy_link_bridges[entity.unit_number] = entity
|
||||
end
|
||||
end
|
||||
end
|
||||
function on_energy_bridge_removed(entity)
|
||||
if string_starts_with(entity.prototype.name, "ap-energy-bridge") then
|
||||
if storage.energy_link_bridges[entity.unit_number] == nil then return end
|
||||
storage.energy_link_bridges[entity.unit_number] = nil
|
||||
end
|
||||
end
|
||||
if (ENERGY_INCREMENT) then
|
||||
script.on_event(defines.events.on_tick, on_check_energy_link)
|
||||
|
||||
script.on_event({defines.events.on_built_entity}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||
script.on_event({defines.events.on_robot_built_entity}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||
script.on_event({defines.events.on_entity_cloned}, function(event) on_energy_bridge_constructed(event.destination) end)
|
||||
|
||||
script.on_event({defines.events.script_raised_revive}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||
script.on_event({defines.events.script_raised_built}, function(event) on_energy_bridge_constructed(event.entity) end)
|
||||
|
||||
script.on_event({defines.events.on_entity_died}, function(event) on_energy_bridge_removed(event.entity) end)
|
||||
script.on_event({defines.events.on_player_mined_entity}, function(event) on_energy_bridge_removed(event.entity) end)
|
||||
script.on_event({defines.events.on_robot_mined_entity}, function(event) on_energy_bridge_removed(event.entity) end)
|
||||
end
|
||||
|
||||
{% if not imported_blueprints -%}
|
||||
|
@ -410,6 +466,7 @@ script.on_init(function()
|
|||
{% if not imported_blueprints %}set_permissions(){% endif %}
|
||||
storage.forcedata = {}
|
||||
storage.playerdata = {}
|
||||
storage.energy_link_bridges = {}
|
||||
-- Fire dummy events for all currently existing forces.
|
||||
local e = {}
|
||||
for name, _ in pairs(game.forces) do
|
||||
|
|
Loading…
Reference in New Issue