From f0232cd14ff505ba3366292bca37fd402154a53b Mon Sep 17 00:00:00 2001 From: notnotmelon Date: Wed, 20 Oct 2021 16:56:56 -0500 Subject: [PATCH 1/6] Electric network overhaul! --- changelog.txt | 8 + control.lua | 501 ++++++++++++++++++------------------ data.lua | 3 +- info.json | 2 +- layout.lua | 12 - locale/en/factorissimo2.cfg | 43 +--- prototypes/component.lua | 199 ++++++-------- settings.lua | 9 - updates.lua | 61 ++--- 9 files changed, 358 insertions(+), 480 deletions(-) diff --git a/changelog.txt b/changelog.txt index 9012b76..8951b44 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,11 @@ +--------------------------------------------------------------------------------------------------- +Version: 2.5.4 +Date: 2021.10.20 + Changes: + - Reworked electric system to use cross-surface wires + - Reworked lamp system to work with new electric system + - Acculumulators now work inside factory buildings + --------------------------------------------------------------------------------------------------- Version: 2.5.3 Date: 2021.10.19 diff --git a/control.lua b/control.lua index 2682a9f..35f408e 100644 --- a/control.lua +++ b/control.lua @@ -32,22 +32,20 @@ factory = { +force = *, +layout = *, +building = *, - +outside_energy_sender = *, +outside_energy_receiver = *, +outside_overlay_displays = {*}, +outside_fluid_dummy_connectors = {*}, +outside_port_markers = {*}, (+)outside_other_entities = {*}, - +inside_energy_sender = *, - +inside_energy_receiver = *, +inside_overlay_controller = *, +inside_fluid_dummy_connectors = {*}, - (+)inside_other_entities = {*}, - +energy_indicator = *, + +inside_power_poles = {*}, + (+)outside_power_pole = *, + + (+)middleman_id = *, + (+)direct_connection = *, - +transfer_rate = *, - +transfers_outside = *, +stored_pollution = *, +connections = {*}, @@ -58,7 +56,6 @@ factory = { } ]]-- - -- INITIALIZATION -- local function init_globals() @@ -80,10 +77,14 @@ local function init_globals() global.last_player_teleport = global.last_player_teleport or {} -- Map: Player index -> Whether preview is activated global.player_preview_active = global.player_preview_active or {} + -- List of all factory power pole middlemen + global.middleman_power_poles = global.middleman_power_poles or {} end local prepare_gui = 0 -- Function stub local update_hidden_techs = 0 -- Function stub +local power_middleman_surface = 0 -- Function stub +local cancel_creation = 0 -- Function stub local function init_gui() for _, player in pairs(game.players) do @@ -91,12 +92,12 @@ local function init_gui() end end - script.on_init(function() init_globals() Connections.init_data_structure() Updates.init() init_gui() + power_middleman_surface() for _, force in pairs(game.forces) do update_hidden_techs(force) end @@ -111,6 +112,7 @@ script.on_configuration_changed(function(config_changed_data) init_globals() Updates.run() init_gui() + power_middleman_surface() for surface_name, _ in pairs(global.surface_factories or {}) do if remote.interfaces["RSO"] then -- RSO compatibility pcall(remote.call, "RSO", "ignoreSurface", surface_name) @@ -156,151 +158,189 @@ end -- POWER MANAGEMENT -- --- Don't mess with this unless you mess with prototypes/entity/component.lua too. --- Every number needs to correspond to a valid indicator entity name -local VALID_POWER_TRANSFER_RATES = {1,2,5,10,20,50,100,200,500,1000,2000,5000,10000,20000,50000,100000} -- MW - -local function make_valid_transfer_rate(rate) - for _,v in pairs(VALID_POWER_TRANSFER_RATES) do - if v == rate then return v end +function power_middleman_surface() + if game.surfaces["factory-power-connection"] then + return game.surfaces["factory-power-connection"] + end + + if #game.surfaces == 256 then + error("Unfortunately you have no available surfaces left for Factorissimo2. You cannot use Factorissimo2 on this map.") end - return 0 -- Catchall + + local map_gen_settings = {height=1, width=1, property_expression_names={}} + map_gen_settings.autoplace_settings = { + ["decorative"] = {treat_missing_as_default=false, settings={}}, + ["entity"] = {treat_missing_as_default=false, settings={}}, + ["tile"] = {treat_missing_as_default=false, settings={["out-of-map"]={}}}, + } + + local surface = game.create_surface("factory-power-connection", map_gen_settings) + surface.set_chunk_generated_status({0, 0}, defines.chunk_generated_status.entities) + surface.set_chunk_generated_status({-1, 0}, defines.chunk_generated_status.entities) + surface.set_chunk_generated_status({0, -1}, defines.chunk_generated_status.entities) + surface.set_chunk_generated_status({-1, -1}, defines.chunk_generated_status.entities) + + return surface end -local function update_power_settings(factory) - if factory.built then - local layout = factory.layout - -- Inside sender - local new_ies = factory.inside_surface.create_entity{ - name = "factory-power-output-2-" .. factory.transfer_rate, - position = {factory.inside_x + layout.inside_energy_x, factory.inside_y + layout.inside_energy_y}, - force = factory.force - } - new_ies.destructible = false - new_ies.operable = false - new_ies.rotatable = false - if factory.inside_energy_sender.valid then - factory.inside_energy_sender.destroy() +local function remove_direct_connection(factory) + local dc = factory.direct_connection + if not dc or not dc.valid then return end + + for _, pole in pairs(factory.inside_power_poles) do + for _, neighbour in pairs(pole.neighbours.copper) do + if neighbour == dc then + local old = {} + for _, neighbour in ipairs(dc.neighbours.copper) do + if neighbour ~= pole then old[#old+1] = neighbour end + end + dc.disconnect_neighbour() + for _, neighbour in ipairs(old) do + dc.connect_neighbour(neighbour) + end + factory.direct_connection = nil + return + end end - factory.inside_energy_sender = new_ies + end +end - -- Inside receiver - local new_ier = factory.inside_surface.create_entity{ - name = "factory-power-input-2-" .. factory.transfer_rate, - position = {factory.inside_x + layout.inside_energy_x, factory.inside_y + layout.inside_energy_y}, - force = factory.force - } - new_ier.destructible = false - new_ier.operable = false - new_ier.rotatable = false - if factory.inside_energy_receiver.valid then - factory.inside_energy_receiver.destroy() - end - factory.inside_energy_receiver = new_ier +local function delete_middleman(i) + local pole = global.middleman_power_poles[i] + if pole == 0 then return end + global.middleman_power_poles[i] = i < #global.middleman_power_poles and 0 or nil + pole.destroy() +end - -- Outside sender - local new_oes = factory.outside_surface.create_entity{ - name = layout.outside_energy_sender_type .. "-" .. factory.transfer_rate, - position = {factory.outside_x, factory.outside_y}, - force = factory.force - } - new_oes.destructible = false - new_oes.operable = false - new_oes.rotatable = false - if factory.outside_energy_sender.valid then - factory.outside_energy_sender.destroy() - end - factory.outside_energy_sender = new_oes +local function cleanup_middlemen() + for i, pole in ipairs(global.middleman_power_poles) do + if pole ~= 0 and #pole.neighbours.copper<2 then delete_middleman(i) end + end +end - -- Outside receiver - local new_oer = factory.outside_surface.create_entity{ - name = layout.outside_energy_receiver_type .. "-" .. factory.transfer_rate, - position = {factory.outside_x, factory.outside_y}, - force = factory.force - } - new_oer.destructible = false - new_oer.operable = false - new_oer.rotatable = false - if factory.outside_energy_receiver.valid then - factory.outside_energy_receiver.destroy() - end - factory.outside_energy_receiver = new_oer - - local e = factory.transfer_rate*16667 -- conversion factor of MW to J/U - if factory.transfers_outside then - factory.inside_energy_sender.energy = 0--e - factory.inside_energy_receiver.energy = 0 - factory.outside_energy_sender.energy = 0 - factory.outside_energy_receiver.energy = 0--e - else - factory.inside_energy_sender.energy = 0 - factory.inside_energy_receiver.energy = 0--e - factory.outside_energy_sender.energy = 0--e - factory.outside_energy_receiver.energy = 0 +-- power poles can only connect to 5 other power poles. give priority to factory poles +local our_poles = {["factory-power-connection"] = true, ["factory-power-pole"] = true, ["factory-overflow-pole"] = true} +local function reduce_neighbours(pole) + local neighbours = pole.neighbours.copper + if #neighbours < 5 or #neighbours == 0 then return true end + + local n + for i, neighbour in ipairs(neighbours) do + if not our_poles[neighbour.name] and neighbour.surface == pole.surface then n = i break end + end + + if n == nil then + pole.surface.create_entity{name="flying-text", position=pole.position, text={"electric-pole-wire-limit-reached"}} + return false + end + + pole.disconnect_neighbour(neighbours[n]) + return true +end + +local function available_pole(factory) + local poles = factory.inside_power_poles + for i, pole in ipairs(poles) do + local next = poles[i+1] + if next then + next.connect_neighbour(pole) end end - if factory.energy_indicator and factory.energy_indicator.valid then - factory.energy_indicator.destroy() - factory.energy_indicator = nil + + for i, pole in ipairs(poles) do + if #pole.neighbours.copper < (i == #poles and 4 or 5) then return pole end end - local direction = (factory.transfers_outside and defines.direction.south) or defines.direction.north - local energy_indicator = factory.inside_surface.create_entity{ - name = "factory-connection-indicator-energy-d" .. make_valid_transfer_rate(factory.transfer_rate), - direction = direction, force = factory.force, - position = {x = factory.inside_x + factory.layout.energy_indicator_x, y = factory.inside_y + factory.layout.energy_indicator_y} - } - energy_indicator.destructible = false - factory.energy_indicator = energy_indicator + + local layout = factory.layout + local pole = factory.inside_surface.create_entity{name="factory-overflow-pole", position=poles[1].position, force=poles[1].force} + pole.destructible = false + pole.disconnect_neighbour() + pole.connect_neighbour(poles[#poles]) + table.insert(poles, pole) + return pole end --- For update 11 -function update_all_power_settings() - for _, factory in pairs(global.factories) do - update_power_settings(factory) + +local function connect_power(factory, pole) + if not reduce_neighbours(pole) then return end + factory.outside_power_pole = pole + + if factory.inside_surface.name ~= pole.surface.name then + available_pole(factory).connect_neighbour(pole) + factory.direct_connection = pole + return end + + local n + for i, pole in ipairs(global.middleman_power_poles) do + if pole == 0 then n = i break end + end + n = n or #global.middleman_power_poles + 1 + + local surface = power_middleman_surface() + local middleman = surface.create_entity{name = "factory-power-connection", position = {2*(n%32), 2*math.floor(n/32)}, force = "neutral"} + middleman.destructible = false + global.middleman_power_poles[n] = middleman + + middleman.connect_neighbour(available_pole(factory)) + middleman.connect_neighbour(pole) + + factory.middleman_id = n end -local function adjust_power_transfer_rate(factory, positive) - local transfer_rate = factory.transfer_rate - if positive then - for i = 1,#VALID_POWER_TRANSFER_RATES do - if transfer_rate < VALID_POWER_TRANSFER_RATES[i] then - transfer_rate = VALID_POWER_TRANSFER_RATES[i] - break - end - end - if transfer_rate > VALID_POWER_TRANSFER_RATES[#VALID_POWER_TRANSFER_RATES] then - transfer_rate = VALID_POWER_TRANSFER_RATES[#VALID_POWER_TRANSFER_RATES] - end - else - for i = #VALID_POWER_TRANSFER_RATES,1,-1 do - if transfer_rate > VALID_POWER_TRANSFER_RATES[i] then - transfer_rate = VALID_POWER_TRANSFER_RATES[i] - break - end - end - if transfer_rate < VALID_POWER_TRANSFER_RATES[1] then - transfer_rate = VALID_POWER_TRANSFER_RATES[1] +function update_power_connection(factory, pole) -- pole parameter is optional + local electric_network = factory.outside_energy_receiver.electric_network_id + if electric_network == nil then return end + local surface = factory.outside_surface + local x = factory.outside_x + local y = factory.outside_y + + if global.surface_factory_counters[surface.name] then + connect_power(factory, available_pole(find_surrounding_factory(surface, {x=x, y=y}))) + return + end + + -- find the nearest connected power pole + local D = game.max_electric_pole_supply_area_distance + factory.layout.outside_size / 2 + local canidates = {} + for _, entity in ipairs(surface.find_entities_filtered{type="electric-pole", area={{x-D, y-D}, {x+D,y+D}}}) do + if entity.electric_network_id == electric_network and entity ~= pole then + canidates[#canidates+1] = entity end end - factory.transfer_rate = transfer_rate - local power_string, transfer_text = "","" - if transfer_rate >= 1000 then - power_string = (transfer_rate / 1000) .. "GW" - else - power_string = transfer_rate .. "MW" + + if #canidates == 0 then return end + connect_power(factory, surface.get_closest({x, y}, canidates)) +end + +local function power_pole_placed(pole) + local D = pole.prototype.supply_area_distance + 10 + local position = pole.position + local x = position.x + local y = position.y + + for _, entity in ipairs(pole.surface.find_entities_filtered{type=BUILDING_TYPE, area={{x-D, y-D}, {x+D,y+D}}}) do + if not HasLayout(entity.name) then goto continue end + factory = get_factory_by_building(entity) + local electric_network = factory.outside_energy_receiver.electric_network_id + if electric_network == nil or electric_network ~= pole.electric_network_id then goto continue end + if electric_network == factory.inside_power_poles[1].electric_network_id then goto continue end + + connect_power(factory, pole) + + ::continue:: end - if positive then - transfer_text = "factory-connection-text.power-transfer-increased" - else - transfer_text = "factory-connection-text.power-transfer-decreased" +end + +local function power_pole_destroyed(pole) + pole.disconnect_neighbour() + + for _, factory in pairs(global.factories) do + if factory.built and factory.outside_power_pole and factory.outside_power_pole.valid and factory.outside_power_pole == pole then + update_power_connection(factory, pole) + end end - factory.inside_surface.create_entity{ - name = "flying-text", - position = {x = factory.inside_x + factory.layout.energy_indicator_x, y = factory.inside_y + factory.layout.energy_indicator_y}, color = {r = 228/255, g = 236/255, b = 0}, - text = {transfer_text, power_string}, - force = factory.force - } - update_power_settings(factory) + + cleanup_middlemen() end -- FACTORY UPGRADES -- @@ -308,13 +348,7 @@ end local function build_lights_upgrade(factory) if factory.upgrades.lights then return end factory.upgrades.lights = true - for _, pos in pairs(factory.layout.lights) do - local light = factory.inside_surface.create_entity{name = "factory-ceiling-light", position = {factory.inside_x + pos.x, factory.inside_y + pos.y}, force = factory.force} - light.destructible = false - light.operable = false - light.rotatable = false - table.insert(factory.inside_other_entities, light) - end + factory.inside_surface.daytime = 1 end function build_display_upgrade(factory) @@ -445,7 +479,6 @@ local function update_destructible(factory) end end - local function create_factory_position() global.next_factory_surface = global.next_factory_surface + 1 local max_surface_id = settings.global["Factorissimo2-max-surfaces"].value @@ -476,7 +509,7 @@ local function create_factory_position() local cx = 16*(n % 8) local cy = 16*math.floor(n / 8) - -- To make void chunks show up on the map, you need to tell them they've finished generating. + -- To make void chunks show up on the map, you need to tell them they"ve finished generating. surface.set_chunk_generated_status({cx-2, cy-2}, defines.chunk_generated_status.entities) surface.set_chunk_generated_status({cx-1, cy-2}, defines.chunk_generated_status.entities) surface.set_chunk_generated_status({cx+0, cy-2}, defines.chunk_generated_status.entities) @@ -551,26 +584,9 @@ local function create_factory_interior(layout, force) end factory.inside_surface.set_tiles(tiles) - local ier = factory.inside_surface.create_entity{name = "factory-power-input-2-10", position = {factory.inside_x + layout.inside_energy_x, factory.inside_y + layout.inside_energy_y}, force = force} - ier.destructible = false - ier.operable = false - ier.rotatable = false - factory.inside_energy_receiver = ier - - local ies = factory.inside_surface.create_entity{name = "factory-power-output-2-10", position = {factory.inside_x + layout.inside_energy_x, factory.inside_y + layout.inside_energy_y}, force = force} - ies.destructible = false - ies.operable = false - ies.rotatable = false - factory.inside_energy_sender = ies - - local iet = factory.inside_surface.create_entity{name = "factory-power-pole", position = {factory.inside_x + layout.inside_energy_x, factory.inside_y + layout.inside_energy_y}, force = force} - iet.destructible = false - - factory.inside_other_entities = {iet} - - --if force.technologies["factory-interior-upgrade-power"].researched then - -- build_power_upgrade(factory) - --end + local power_pole = factory.inside_surface.create_entity{name = "factory-power-pole", position = {factory.inside_x + layout.inside_energy_x, factory.inside_y + layout.inside_energy_y}, force = force} + power_pole.destructible = false + factory.inside_power_poles = {power_pole} if force.technologies["factory-interior-upgrade-lights"].researched then build_lights_upgrade(factory) @@ -593,9 +609,6 @@ local function create_factory_interior(layout, force) factory.inside_fluid_dummy_connectors[id] = connector end - factory.transfer_rate = factory.layout.default_power_transfer_rate or 10 -- MW - factory.transfers_outside = false - factory.connections = {} factory.connection_settings = {} factory.connection_indicators = {} @@ -612,18 +625,12 @@ local function create_factory_exterior(factory, building) factory.outside_door_y = factory.outside_y + layout.outside_door_y factory.outside_surface = building.surface - local oer = factory.outside_surface.create_entity{name = layout.outside_energy_receiver_type .. "-10", position = {factory.outside_x, factory.outside_y}, force = force} + local oer = factory.outside_surface.create_entity{name = layout.outside_energy_receiver_type, position = {factory.outside_x, factory.outside_y}, force = force} oer.destructible = false oer.operable = false oer.rotatable = false factory.outside_energy_receiver = oer - local oes = factory.outside_surface.create_entity{name = layout.outside_energy_sender_type .. "-10", position = {factory.outside_x, factory.outside_y}, force = force} - oes.destructible = false - oes.operable = false - oes.rotatable = false - factory.outside_energy_sender = oes - factory.outside_overlay_displays = {} factory.outside_fluid_dummy_connectors = {} @@ -650,8 +657,8 @@ local function create_factory_exterior(factory, building) factory.building = building factory.built = true - update_power_settings(factory) Connections.recheck_factory(factory, nil, nil) + update_power_connection(factory) update_overlay(factory) update_destructible(factory) return factory @@ -679,9 +686,11 @@ local function toggle_port_markers(factory) end local function cleanup_factory_exterior(factory, building) - Connections.disconnect_factory(factory) - factory.outside_energy_sender.destroy() factory.outside_energy_receiver.destroy() + if factory.middleman_id then delete_middleman(factory.middleman_id) factory.middleman_id = nil end + remove_direct_connection(factory) + + Connections.disconnect_factory(factory) for _, render_id in pairs(factory.outside_overlay_displays) do rendering.destroy(render_id) end factory.outside_overlay_displays = {} for _, entity in pairs(factory.outside_fluid_dummy_connectors) do entity.destroy() end @@ -838,19 +847,24 @@ script.on_event({defines.events.on_built_entity, defines.events.on_robot_built_e elseif is_invalid_save_slot(entity.name) then entity.surface.create_entity{name="flying-text", position=entity.position, text={"factory-connection-text.invalid-factory-data"}} entity.destroy() - else - if Connections.is_connectable(entity) then - recheck_nearby_connections(entity) - end - if entity.name == "factory-requester-chest" then - init_factory_requester_chest(entity) + elseif Connections.is_connectable(entity) then + recheck_nearby_connections(entity) + elseif entity.type == "electric-pole" then + power_pole_placed(entity) + elseif entity.type == "solar-panel" then + if global.surface_factory_counters[entity.surface.name] then + cancel_creation(entity, event.player_index, {"factory-connection-text.invalid-placement"}) + else + entity.force.technologies["factory-interior-upgrade-lights"].researched = true end + elseif entity.name == "factory-requester-chest" then + init_factory_requester_chest(entity) end end) -- How players pick up factories --- Working factory buildings don't return items, so we have to manually give the player an item +-- Working factory buildings don"t return items, so we have to manually give the player an item script.on_event(defines.events.on_pre_player_mined_item, function(event) local entity = event.entity if HasLayout(entity.name) then @@ -875,11 +889,13 @@ script.on_event(defines.events.on_pre_player_mined_item, function(event) end elseif Connections.is_connectable(entity) then recheck_nearby_connections(entity, true) -- Delay + elseif entity.type == 'electric-pole' then + power_pole_destroyed(entity) end end) -- How robots pick up factories --- Since you can't insert items into construction robots, we'll have to swap out factories for fake placeholder factories +-- Since you can"t insert items into construction robots, we"ll have to swap out factories for fake placeholder factories -- as soon as they are marked for deconstruction, and swap them back should they be unmarked. script.on_event(defines.events.on_marked_for_deconstruction, function(event) local entity = event.entity @@ -895,7 +911,7 @@ script.on_event(defines.events.on_marked_for_deconstruction, function(event) entity.destroy() else -- Not saved, so put it back - -- Don't cancel deconstruction (it'd cause another event), instead simply replace with new building + -- Don"t cancel deconstruction (it"d cause another event), instead simply replace with new building local newbuilding = entity.surface.create_entity{name=entity.name, position=entity.position, force=factory.force} entity.destroy() set_entity_to_factory(newbuilding, factory) @@ -926,25 +942,26 @@ script.on_event(defines.events.on_robot_pre_mined, function(event) local entity = event.entity if Connections.is_connectable(entity) then recheck_nearby_connections(entity, true) -- Delay + elseif entity.type == 'electric-pole' then + power_pole_destroyed(entity) end end) -script.on_event(defines.events.on_robot_mined, function(event) - local item = event.item -end) -- How biters pick up factories --- Too bad they don't have hands +-- Too bad they don"t have hands script.on_event({defines.events.on_entity_died, defines.events.script_raised_destroy}, function(event) local entity = event.entity if HasLayout(entity.name) then local factory = get_factory_by_building(entity) if factory then cleanup_factory_exterior(factory, entity) - -- Don't save it. It will be inaccessible from now on. + -- Don"t save it. It will be inaccessible from now on. --save_factory(factory) end elseif Connections.is_connectable(entity) then recheck_nearby_connections(entity, true) -- Delay + elseif entity.type == 'electric-pole' then + power_pole_destroyed(entity) end end) @@ -955,7 +972,6 @@ local clone_forbidden_prefixes = { "factory-2-", "factory-3-", "factory-power-input-", - "factory-power-output-", "factory-connection-indicator-", "factory-power-pole", "factory-ceiling-light", @@ -1168,21 +1184,6 @@ local function teleport_players() end end --- POWER MANAGEMENT -- - -local function transfer_power(from, to) - if not (from.valid and to.valid) then return end - local energy = from.energy+to.energy - local ebs = to.electric_buffer_size - if energy > ebs then - to.energy = ebs - from.energy = energy - ebs - else - to.energy = energy - from.energy = 0 - end -end - -- POLLUTION MANAGEMENT -- local function update_pollution(factory) @@ -1214,20 +1215,6 @@ end script.on_event(defines.events.on_tick, function(event) local factories = global.factories - -- Transfer power - local power_batch_size = settings.startup["Factorissimo2-power-batching"].value or 1 - local i = event.tick%power_batch_size + 1 - while i <= #factories do - local factory = factories[i] - if factory and factory.built then - if factory.transfers_outside then - transfer_power(factory.inside_energy_receiver, factory.outside_energy_sender) - else - transfer_power(factory.outside_energy_receiver, factory.inside_energy_sender) - end - end - i=i+power_batch_size - end -- Transfer pollution local fn = #factories @@ -1252,13 +1239,7 @@ for _,name in pairs(Connections.indicator_names) do CONNECTION_INDICATOR_NAMES["factory-connection-indicator-" .. name] = true end -CONNECTION_INDICATOR_NAMES["factory-connection-indicator-energy-d0"] = true -for _,rate in pairs(VALID_POWER_TRANSFER_RATES) do - CONNECTION_INDICATOR_NAMES["factory-connection-indicator-energy-d" .. rate] = true -end - script.on_event(defines.events.on_player_rotated_entity, function(event) - --game.print("Rotated!") local entity = event.entity if CONNECTION_INDICATOR_NAMES[entity.name] then -- Skip @@ -1284,19 +1265,7 @@ script.on_event("factory-rotate", function(event) elseif CONNECTION_INDICATOR_NAMES[entity.name] then local factory = find_surrounding_factory(entity.surface, entity.position) if factory then - if factory.energy_indicator and factory.energy_indicator.valid and factory.energy_indicator.unit_number == entity.unit_number then - factory.transfers_outside = not factory.transfers_outside - factory.inside_surface.create_entity{ - name = "flying-text", - position = entity.position, - color = {r = 228/255, g = 236/255, b = 0}, - text = (factory.transfers_outside and {"factory-connection-text.output-mode"}) or {"factory-connection-text.input-mode"}, - force = factory.force - } - update_power_settings(factory) - else - Connections.rotate(factory, entity) - end + Connections.rotate(factory, entity) end elseif entity.name == "factory-requester-chest" then init_factory_requester_chest(entity) @@ -1309,11 +1278,7 @@ script.on_event("factory-increase", function(event) if CONNECTION_INDICATOR_NAMES[entity.name] then local factory = find_surrounding_factory(entity.surface, entity.position) if factory then - if factory.energy_indicator and factory.energy_indicator.valid and factory.energy_indicator.unit_number == entity.unit_number then - adjust_power_transfer_rate(factory, true) - else - Connections.adjust(factory, entity, true) - end + Connections.adjust(factory, entity, true) end end end) @@ -1324,17 +1289,51 @@ script.on_event("factory-decrease", function(event) if CONNECTION_INDICATOR_NAMES[entity.name] then local factory = find_surrounding_factory(entity.surface, entity.position) if factory then - if factory.energy_indicator and factory.energy_indicator.valid and factory.energy_indicator.unit_number == entity.unit_number then - adjust_power_transfer_rate(factory, false) - else - Connections.adjust(factory, entity, false) - end + Connections.adjust(factory, entity, false) end end end) -- MISC -- +function cancel_creation(entity, player_index, message) + local inserted = 0 + local item_to_place = entity.prototype.items_to_place_this[1] + local surface = entity.surface + local position = entity.position + local force = entity.force + + if player_index then + local player = game.get_player(player_index) + if player.mine_entity(entity, false) then + inserted = 1 + elseif item_to_place then + inserted = player.insert(item_to_place) + end + end + + entity.destroy{raise_destroy = true} + + if inserted == 0 and item_to_place then + surface.spill_item_stack{ + enable_looted = true, + force = force, + allow_belts = false, + position = position, + items = item_to_place + } + end + + if message then + surface.create_entity{ + name = "flying-text", + position = position, + text = message, + render_player_index = player_index + } + end +end + update_hidden_techs = function(force) if settings.global["Factorissimo2-hide-recursion"] and settings.global["Factorissimo2-hide-recursion"].value then force.technologies["factory-recursion-t1"].enabled = false diff --git a/data.lua b/data.lua index 81081b7..89e4798 100644 --- a/data.lua +++ b/data.lua @@ -7,7 +7,6 @@ require("prototypes.technology") require("prototypes.tile") data:extend({ - { type = "item-subgroup", name = "factorissimo2", @@ -29,4 +28,4 @@ data:extend({ name = "factory-decrease", key_sequence = "CONTROL + R", }, -}) \ No newline at end of file +}) diff --git a/info.json b/info.json index bec62b0..a88ffe0 100644 --- a/info.json +++ b/info.json @@ -1,6 +1,6 @@ { "name": "Factorissimo2", - "version": "2.5.3", + "version": "2.5.4", "title": "Factorissimo2", "author": "MagmaMcFry", "description": "Factorissimo 2 adds factory buildings to Factorio. Place them down, walk in, build your factories inside!", diff --git a/layout.lua b/layout.lua index 2b8cd14..8ab17ae 100644 --- a/layout.lua +++ b/layout.lua @@ -28,17 +28,13 @@ local layout_generators = { tier = 1, inside_size = 30, outside_size = 8, - default_power_transfer_rate = 10, inside_door_x = 0, inside_door_y = 16, outside_door_x = 0, outside_door_y = 4, outside_energy_receiver_type = "factory-power-input-8", - outside_energy_sender_type = "factory-power-output-8", inside_energy_x = -4, inside_energy_y = 17, - energy_indicator_x = -3.5, - energy_indicator_y = 18.5, overlay_name = "factory-1-overlay", overlay_x = 0, overlay_y = 3, @@ -118,17 +114,13 @@ local layout_generators = { tier = 2, inside_size = 46, outside_size = 12, - default_power_transfer_rate = 20, inside_door_x = 0, inside_door_y = 24, outside_door_x = 0, outside_door_y = 6, outside_energy_receiver_type = "factory-power-input-12", - outside_energy_sender_type = "factory-power-output-12", inside_energy_x = -4, inside_energy_y = 25, - energy_indicator_x = -3.5, - energy_indicator_y = 26.5, overlay_name = "factory-2-overlay", overlay_x = 0, overlay_y = 5, @@ -227,17 +219,13 @@ local layout_generators = { tier = 3, inside_size = 60, outside_size = 16, - default_power_transfer_rate = 50, inside_door_x = 0, inside_door_y = 31, outside_door_x = 0, outside_door_y = 8, outside_energy_receiver_type = "factory-power-input-16", - outside_energy_sender_type = "factory-power-output-16", inside_energy_x = -4, inside_energy_y = 32, - energy_indicator_x = -3.5, - energy_indicator_y = 33.5, overlay_name = "factory-3-overlay", overlay_x = 0, overlay_y = 7, diff --git a/locale/en/factorissimo2.cfg b/locale/en/factorissimo2.cfg index 94ee0e4..6eca77d 100644 --- a/locale/en/factorissimo2.cfg +++ b/locale/en/factorissimo2.cfg @@ -12,16 +12,7 @@ factory-3-i=Factory building Mk3 (inactive) factory-3-s=Factory building Mk3 (inactive) factory-power-pole=Factory power monitor -factory-power-input-2=Factory power receiver -factory-power-output-2=Factory power supply -factory-power-input-8=Factory building Mk1 -factory-power-output-8=Factory building Mk1 -factory-power-input-12=Factory building Mk2 -factory-power-output-12=Factory building Mk2 -factory-power-input-16=Factory building Mk3 -factory-power-output-16=Factory building Mk3 - -factory-ceiling-light=Factory ceiling light + factory-overlay-controller=Factory overlay controller factory-circuit-input=Factory circuit connector (input) @@ -37,7 +28,6 @@ factory-connection-indicator-circuit=Connection settings (circuit) factory-connection-indicator-energy=Connection settings (energy) [entity-description] - factory-1=Interior space: 30x30\nConnections: 16\n\n__CONTROL__factory-rotate__ to toggle port markers (requires alt-view) factory-2=Interior space: 46x46\nConnections: 24\n\n__CONTROL__factory-rotate__ to toggle port markers (requires alt-view) factory-3=Interior space: 60x60\nConnections: 32\n\n__CONTROL__factory-rotate__ to toggle port markers (requires alt-view) @@ -78,29 +68,14 @@ factory-connection-indicator-circuit-d60=Update rate: Every 60 ticks\n\n__CONTRO factory-connection-indicator-circuit-d180=Update rate: Every 180 ticks\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase update rate\n__CONTROL__factory-decrease__ to decrease update rate factory-connection-indicator-circuit-d600=Update rate: Every 600 ticks\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase update rate\n__CONTROL__factory-decrease__ to decrease update rate -factory-connection-indicator-energy-d0=__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d1=Transfer rate: 1MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d2=Transfer rate: 2MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d5=Transfer rate: 5MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d10=Transfer rate: 10MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d20=Transfer rate: 20MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d50=Transfer rate: 50MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d100=Transfer rate: 100MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d200=Transfer rate: 200MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d500=Transfer rate: 500MW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d1000=Transfer rate: 1GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d2000=Transfer rate: 2GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d5000=Transfer rate: 5GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d10000=Transfer rate: 10GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d20000=Transfer rate: 20GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d50000=Transfer rate: 50GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput -factory-connection-indicator-energy-d100000=Transfer rate: 100GW\n\n__CONTROL__factory-rotate__ to change transfer direction\n__CONTROL__factory-increase__ to increase max throughput\n__CONTROL__factory-decrease__ to decrease max throughput - - factory-overlay-controller=Insert items to display them outside factory-requester-chest=Requests all initialized factories from the logistic system.\n__CONTROL__factory-rotate__ to change page. -[item-name] +[tile-name] +factory-wall-1=Factory wall +factory-wall-2=Factory wall +factory-wall-3=Factory wall +out-of-factory=Factory wall [factory-connection-text] input-mode=Input mode @@ -108,8 +83,6 @@ output-mode=Output mode balance-mode=Balance mode update-faster=Increased update rate (delay: __1__) update-slower=Decreased update rate (delay: __1__) -power-transfer-increased=Increased power limit to __1__ -power-transfer-decreased=Decreased power limit to __1__ invalid-placement-recursion-1=This won't work yet! Research Recursion 1 first. invalid-placement-recursion-2=This won't work yet! Research Recursion 2 first. invalid-placement=This won't work here! @@ -117,8 +90,6 @@ invalid-factory-data=Invalid factory data! [controls] factory-rotate=[Factorissimo2] Change connection direction -factory-increase=[Factorissimo2] Increase connection setting -factory-decrease=[Factorissimo2] Decrease connection setting [technology-name] factory-architecture-t1=Architecture 1 @@ -161,7 +132,6 @@ Factorissimo2-allied-players-may-enter=Buildings of allied players enterable Factorissimo2-enemy-players-may-enter=Buildings of enemy players enterable Factorissimo2-easy-research=Easy research Factorissimo2-easy-recipes=Cheap factory buildings -Factorissimo2-power-batching=Power transfer update rate Factorissimo2-preview-enabled=Enable factory preview Factorissimo2-preview-size=Factory preview window size Factorissimo2-preview-zoom=Factory preview zoom @@ -177,7 +147,6 @@ Factorissimo2-allied-players-may-enter=Allows players to enter factory buildings Factorissimo2-enemy-players-may-enter=Allows players to enter factory buildings of enemy forces. Factorissimo2-easy-research=Makes all Factorissimo2 research cost less. Factorissimo2-easy-recipes=Makes all factory buildings cost less. -Factorissimo2-power-batching=(Advanced) Power transfers every X updates (smoothly staggered between updates). Useful to save some UPS, but makes a mess of your power graphs if X > 1. Factorissimo2-preview-enabled=Enable the preview window that pops up when you hover over a factory building or its power monitor. Have you researched it yet? Factorissimo2-preview-size=Set the size of the preview window. Factorissimo2-preview-zoom=Set the zoom level of the preview window, in case it doesn't show the entire factory building. Use this when your GUI scale is lower than default. diff --git a/prototypes/component.lua b/prototypes/component.lua index 9a6663c..c196cb9 100644 --- a/prototypes/component.lua +++ b/prototypes/component.lua @@ -2,10 +2,8 @@ local F = "__Factorissimo2__"; require("circuit-connector-sprites") -local power_batch_size = settings.startup["Factorissimo2-power-batching"].value or 1 - local function cwc0c() - return {shadow = {red = {0,0},green = {0,0},copper = {0,0}}, wire = {red = {0,0},green = {0,0},copper = {0,0}}} + return {shadow = {red = {0,0}, green = {0,0}, copper = {0,0}}, wire = {red = {0,0}, green = {0,0}, copper = {0,0}}} end local function blank() @@ -27,6 +25,16 @@ local function ablank() } end +local function rblank() + return { + filename = F.."/graphics/nothing.png", + priority = "high", + width = 1, + height = 1, + direction_count = 1, + } +end + local function ps() return { filename = F.."/graphics/component/pipe-connection-south.png", @@ -98,73 +106,39 @@ end -- Factory power I/O -local VALID_POWER_TRANSFER_RATES = {1,2,5,10,20,50,100,200,500,1000,2000,5000,10000,20000,50000,100000} -- MW - -local function create_energy_interfaces(size, passive_input, passive_output, icon) +local function create_energy_interfaces(size, icon) local j = size/2-0.3 - local input_priority = (passive_input and "tertiary") or "secondary-input" - local output_priority = (passive_output and "tertiary") or "secondary-output" - for _, transfer_rate in pairs(VALID_POWER_TRANSFER_RATES) do - local buffer_size = transfer_rate*16667*power_batch_size - data:extend({ - { - type = "electric-energy-interface", - name = "factory-power-input-" .. size .. "-" .. transfer_rate, - localised_name = {"entity-name.factory-power-input-" .. size}, - icon = icon, - icon_size = 32, - flags = {"not-on-map"}, - minable = nil, - max_health = 1, - selectable_in_game = false, - energy_source = { - type = "electric", - usage_priority = input_priority, - input_flow_limit = transfer_rate .. "MW", - --output_flow_limit = "0MW", - buffer_capacity = buffer_size .. "J", - render_no_power_icon = false, - }, - energy_usage = "0MW", - energy_production = "0MW", - selection_box = {{-j,-j},{j,j}}, - collision_box = {{-j,-j},{j,j}}, - collision_mask = {}, - }, - { - type = "electric-energy-interface", - name = "factory-power-output-" .. size .. "-" .. transfer_rate, - localised_name = {"entity-name.factory-power-output-" .. size}, - icon = icon, - icon_size = 32, - flags = {"not-on-map"}, - minable = nil, - max_health = 1, - selectable_in_game = false, - energy_source = { - type = "electric", - usage_priority = output_priority, - --input_flow_limit = "0MW", - output_flow_limit = transfer_rate .. "MW", - buffer_capacity = buffer_size .. "J", - render_no_power_icon = false, - }, - energy_usage = "0MW", - energy_production = "0MW", - selection_box = {{-j,-j},{j,j}}, - collision_box = {{-j,-j},{j,j}}, - collision_mask = {}, + data:extend{ + { + type = "electric-energy-interface", + name = "factory-power-input-" .. size, + icon = icon, + icon_size = 32, + flags = {"not-on-map"}, + minable = nil, + max_health = 1, + selectable_in_game = false, + energy_source = { + type = "electric", + usage_priority = "tertiary", + input_flow_limit = "0W", + output_flow_limit = "0W", + buffer_capacity = "0J", + render_no_power_icon = false, }, - }) - end + energy_usage = "0MW", + energy_production = "0MW", + selection_box = {{-j,-j},{j,j}}, + collision_box = {{-j,-j},{j,j}}, + collision_mask = {}, + localised_name = '', + } + } end -create_energy_interfaces(2,true,true,"__base__/graphics/icons/substation.png") --- true,false would be optimal, but due to a bug it doesn't work. Maybe it'll be fixed. --- In the meantime we'll have to settle for true,true because that's how Factorissimo1 worked. -create_energy_interfaces(8,false,false,F.."/graphics/icon/factory-1.png") -create_energy_interfaces(12,false,false,F.."/graphics/icon/factory-2.png") -create_energy_interfaces(16,false,false,F.."/graphics/icon/factory-3.png") +create_energy_interfaces(8,F.."/graphics/icon/factory-1.png") +create_energy_interfaces(12,F.."/graphics/icon/factory-2.png") +create_energy_interfaces(16,F.."/graphics/icon/factory-3.png") -- Connection indicators @@ -213,7 +187,7 @@ end create_indicator("belt", "d0", "green-dir") -create_indicator("chest", "d0", "brown-dir") -- 0 is catchall for "There isn't an entity for this exact value" +create_indicator("chest", "d0", "brown-dir") -- 0 is catchall for "There isn"t an entity for this exact value" create_indicator("chest", "d10", "brown-dir") create_indicator("chest", "d20", "brown-dir") create_indicator("chest", "d60", "brown-dir") @@ -248,26 +222,6 @@ create_indicator("circuit", "d60", "red-dir") create_indicator("circuit", "d180", "red-dir") create_indicator("circuit", "d600", "red-dir") --- - -create_indicator("energy", "d0", "yellow-dir") -create_indicator("energy", "d1", "yellow-dir") -create_indicator("energy", "d2", "yellow-dir") -create_indicator("energy", "d5", "yellow-dir") -create_indicator("energy", "d10", "yellow-dir") -create_indicator("energy", "d20", "yellow-dir") -create_indicator("energy", "d50", "yellow-dir") -create_indicator("energy", "d100", "yellow-dir") -create_indicator("energy", "d200", "yellow-dir") -create_indicator("energy", "d500", "yellow-dir") -create_indicator("energy", "d1000", "yellow-dir") -create_indicator("energy", "d2000", "yellow-dir") -create_indicator("energy", "d5000", "yellow-dir") -create_indicator("energy", "d10000", "yellow-dir") -create_indicator("energy", "d20000", "yellow-dir") -create_indicator("energy", "d50000", "yellow-dir") -create_indicator("energy", "d100000", "yellow-dir") - -- Other auxiliary entities local j = 0.99 @@ -277,52 +231,49 @@ data:extend({ name = "factory-power-pole", minable = nil, max_health = 1, - selection_box = {{-j,-j},{j,j}}, - collision_box = {{-j,-j},{j,j}}, + selection_box = {{-j,-j}, {j,j}}, + collision_box = {{-j,-j}, {j,j}}, collision_mask = {}, - maximum_wire_distance = 0, + flags = {"not-on-map", "hidden"}, + maximum_wire_distance = 1, supply_area_distance = 63, pictures = table.deepcopy(data.raw["electric-pole"]["substation"].pictures), - radius_visualisation_picture = { - filename = "__base__/graphics/entity/small-electric-pole/electric-pole-radius-visualization.png", - width = 12, - height = 12, - priority = "extra-high-no-scale" - }, + drawing_box = table.deepcopy(data.raw["electric-pole"]["substation"].drawing_box), + radius_visualisation_picture = blank(), connection_points = {cwc0c(), cwc0c(), cwc0c(), cwc0c()}, }, { - type = "lamp", - name = "factory-ceiling-light", - icon = "__base__/graphics/icons/small-lamp.png", - icon_size = 32, - flags = {"not-on-map"}, + type = "electric-pole", + name = "factory-overflow-pole", minable = nil, - max_health = 55, - corpse = "small-remnants", - collision_box = {{-0.15, -0.15}, {0.15, 0.15}}, + max_health = 1, + selection_box = {{-j,-j}, {j,j}}, + collision_box = {{-j,-j}, {j,j}}, collision_mask = {}, - selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + flags = {"not-on-map", "hidden"}, + maximum_wire_distance = 1, + supply_area_distance = 63, + pictures = rblank(), + radius_visualisation_picture = blank(), + connection_points = {cwc0c()}, + localised_name = "", selectable_in_game = false, - vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, - energy_source = - { - type = "electric", - usage_priority = "secondary-input", - render_no_power_icon = false, - }, - energy_usage_per_tick = "5KW", - light = {intensity = 1, size = 50}, - light_when_colored = {intensity = 1, size = 6}, - glow_size = 6, - glow_color_intensity = 0.135, - picture_off = blank(), - picture_on = blank(), - signal_to_color_mapping = {}, - - circuit_wire_connection_point = circuit_connector_definitions["lamp"].points, - circuit_connector_sprites = circuit_connector_definitions["lamp"].sprites, - circuit_wire_max_distance = 0, + }, + { + type = "electric-pole", + name = "factory-power-connection", + pictures = table.deepcopy(data.raw["electric-pole"]["small-electric-pole"].pictures), + supply_area_distance = 0, + connection_points = {cwc0c(), cwc0c(), cwc0c(), cwc0c()}, + draw_copper_wires = false, + maximum_wire_distance = 1, + collision_box = table.deepcopy(data.raw["electric-pole"]["small-electric-pole"].collision_box), + selection_box = table.deepcopy(data.raw["electric-pole"]["small-electric-pole"].selection_box), + collision_mask = {}, + flags = {"not-on-map", "hidden"}, + max_health = 1, + radius_visualisation_picture = blank(), + localised_name = "", }, }) diff --git a/settings.lua b/settings.lua index 9c8bb2a..92d8925 100644 --- a/settings.lua +++ b/settings.lua @@ -15,15 +15,6 @@ data:extend({ default_value = false, order = "a-b" }, - { - type = "int-setting", - name = "Factorissimo2-power-batching", - setting_type = "startup", - minimum_value = 1, - default_value = 1, - maximum_value = 60, - order = "b-a" - }, -- Global diff --git a/updates.lua b/updates.lua index 880284b..c9eda46 100644 --- a/updates.lua +++ b/updates.lua @@ -1,7 +1,7 @@ Updates = {} Updates.init = function() - global.update_version = 12 + global.update_version = 13 end local function fix_common_issues() @@ -15,52 +15,25 @@ end Updates.run = function() fix_common_issues() - if global.update_version < 11 then + if global.update_version < 12 then error("This save is too old to be reloaded in this version of Factorissimo2. " - .. "To run this save, you will need to load and resave this map with Factorissimo2 version 2.4.5 or 2.4.6.") + .. "To run this save, you will need to load and resave this map with Factorissimo2 version 2.5.3") end - if global.update_version < 12 then - -- Due to an update script bug, this update may already have been applied - if #global.factories > 0 and global.factories[1].layout.overlays.nw then - -- Layout has not been updated yet, so this update has not been applied - - -- Begin overlay display rework - for _, surface in pairs(game.surfaces) do - for _, e in pairs(surface.find_entities_filtered{name = "factory-overlay-controller"}) do - e.destroy() - end + if global.update_version < 13 then + for _, factory in pairs(global.factories) do + if factory.built then + local oer = factory.outside_surface.create_entity{name = factory.layout.outside_energy_receiver_type, position = {factory.outside_x, factory.outside_y}, force = factory.force} + oer.destructible = false + oer.operable = false + oer.rotatable = false + factory.outside_energy_receiver = oer end - for _, factory in pairs(global.factories) do - for _, entity in pairs(factory.outside_overlay_displays) do - if entity.valid then entity.destroy() end - end - factory.outside_overlay_displays = {} - - for _, entity in pairs(factory.inside_overlay_controllers) do - if entity.valid then entity.destroy() end - end - factory.inside_overlay_controllers = nil - - factory.upgrades.display = nil - factory.layout.overlays = { - inside_x = factory.layout.overlays.nw.inside_x, - inside_y = factory.layout.overlays.nw.inside_y, - outside_x = 0, - outside_y = -1, - outside_w = factory.layout.outside_size, - outside_h = factory.layout.outside_size - 2, - } - build_display_upgrade(factory) - update_overlay(factory) - end - -- End overlay display rework - - -- Begin port marker rework - for _, factory in pairs(global.factories) do - factory.outside_port_markers = {} - end - -- End port marker rework + factory.inside_power_poles = {factory.inside_other_entities[1]} + if factory.upgrades.lights then factory.inside_surface.daytime = 1 end + end + for _, factory in pairs(global.factories) do + if factory.built then update_power_connection(factory) end end end - global.update_version = 12 + global.update_version = 13 end From f6d992ad488d293a1fc846a16686fbb5b89b96b5 Mon Sep 17 00:00:00 2001 From: notnotmelon Date: Sat, 23 Oct 2021 10:24:53 -0500 Subject: [PATCH 2/6] Electric network overhaul! --- control.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/control.lua b/control.lua index 35f408e..6810b96 100644 --- a/control.lua +++ b/control.lua @@ -288,15 +288,18 @@ local function connect_power(factory, pole) end function update_power_connection(factory, pole) -- pole parameter is optional - local electric_network = factory.outside_energy_receiver.electric_network_id + local electric_network = factory.outside_energy_receiver.electric_network_id game.print(factory.middleman_id) if electric_network == nil then return end local surface = factory.outside_surface local x = factory.outside_x local y = factory.outside_y - if global.surface_factory_counters[surface.name] then - connect_power(factory, available_pole(find_surrounding_factory(surface, {x=x, y=y}))) - return + if not script.active_mods['factorissimo-power-pole-addon'] and global.surface_factory_counters[surface.name] then + local surrounding = find_surrounding_factory(surface, {x=x, y=y}) + if surrounding then + connect_power(factory, available_pole(surrounding)) + return + end end -- find the nearest connected power pole From 392095a5840198af8e9b18133b83cede1850868d Mon Sep 17 00:00:00 2001 From: notnotmelon Date: Sat, 23 Oct 2021 10:26:57 -0500 Subject: [PATCH 3/6] Add files via upload --- prototypes/component.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/prototypes/component.lua b/prototypes/component.lua index c196cb9..ee971a8 100644 --- a/prototypes/component.lua +++ b/prototypes/component.lua @@ -252,12 +252,14 @@ data:extend({ collision_mask = {}, flags = {"not-on-map", "hidden"}, maximum_wire_distance = 1, - supply_area_distance = 63, + supply_area_distance = 0, pictures = rblank(), radius_visualisation_picture = blank(), connection_points = {cwc0c()}, localised_name = "", selectable_in_game = false, + draw_copper_wires = false, + draw_circuit_wires = false }, { type = "electric-pole", From fe00904f7f954a44375e1f3c15372ff72c562001 Mon Sep 17 00:00:00 2001 From: notnotmelon Date: Sat, 23 Oct 2021 10:27:10 -0500 Subject: [PATCH 4/6] Electric network overhaul! From 44bc1706d1ec8d2f1fa6f44a5cb9e4508aece2d1 Mon Sep 17 00:00:00 2001 From: notnotmelon Date: Sat, 23 Oct 2021 10:57:52 -0500 Subject: [PATCH 5/6] Electric network overhaul! --- control.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control.lua b/control.lua index 6810b96..13bb1fd 100644 --- a/control.lua +++ b/control.lua @@ -288,7 +288,7 @@ local function connect_power(factory, pole) end function update_power_connection(factory, pole) -- pole parameter is optional - local electric_network = factory.outside_energy_receiver.electric_network_id game.print(factory.middleman_id) + local electric_network = factory.outside_energy_receiver.electric_network_id if electric_network == nil then return end local surface = factory.outside_surface local x = factory.outside_x From ea8bd9dbf1d5ac6b98759c351813f6a5e4c73d06 Mon Sep 17 00:00:00 2001 From: notnotmelon Date: Tue, 26 Oct 2021 17:26:24 -0500 Subject: [PATCH 6/6] Fixed a edge case crash --- control.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/control.lua b/control.lua index 13bb1fd..bec8e18 100644 --- a/control.lua +++ b/control.lua @@ -210,6 +210,11 @@ local function delete_middleman(i) if pole == 0 then return end global.middleman_power_poles[i] = i < #global.middleman_power_poles and 0 or nil pole.destroy() + for _, factory in pairs(global.factories) do + if factory.middleman_id == i then + factory.middleman_id = nil + end + end end local function cleanup_middlemen() @@ -690,7 +695,7 @@ end local function cleanup_factory_exterior(factory, building) factory.outside_energy_receiver.destroy() - if factory.middleman_id then delete_middleman(factory.middleman_id) factory.middleman_id = nil end + if factory.middleman_id then delete_middleman(factory.middleman_id) end remove_direct_connection(factory) Connections.disconnect_factory(factory)