diff --git a/TODO b/TODO index ce9a2c0..aa08128 100644 --- a/TODO +++ b/TODO @@ -12,7 +12,6 @@ major: minor: railloader compat - refuelers set to everything should check for new signals close gui when the combinator is destroyed do not play close sound when a different gui is opened gui can desync if settings are changed outside of it while it is open diff --git a/cybersyn/scripts/central-planning.lua b/cybersyn/scripts/central-planning.lua index 40d3870..bc43d0e 100644 --- a/cybersyn/scripts/central-planning.lua +++ b/cybersyn/scripts/central-planning.lua @@ -283,7 +283,7 @@ local function tick_dispatch(map_data, mod_settings) local r_station = stations[r_station_id] ---@type string local network_name - if r_station.network_name == NETWORK_ANY then + if r_station.network_name == NETWORK_EVERY then --TODO: here _, _, network_name = string.find(item_network_name, "(^.*):") else @@ -310,8 +310,8 @@ local function tick_dispatch(map_data, mod_settings) goto p_continue end - local p_flag = p_station.network_name == NETWORK_ANY and (p_station.network_flag[item_name] or 0) or p_station.network_flag - local r_flag = r_station.network_name == NETWORK_ANY and (r_station.network_flag[item_name] or 0) or r_station.network_flag + local p_flag = p_station.network_name == NETWORK_EVERY and (p_station.network_flag[item_name] or 0) or p_station.network_flag + local r_flag = r_station.network_name == NETWORK_EVERY and (r_station.network_flag[item_name] or 0) or r_station.network_flag local netand = band(p_flag, r_flag) if netand == 0 then goto p_continue @@ -487,7 +487,7 @@ local function tick_poll_station(map_data, mod_settings) station.priority = 0 station.item_priority = nil station.locked_slots = 0 - if station.network_name == NETWORK_ANY then + if station.network_name == NETWORK_EVERY then station.network_flag = {} else station.network_flag = mod_settings.network_flag @@ -529,7 +529,7 @@ local function tick_poll_station(map_data, mod_settings) station.r_threshold = abs(item_count) elseif item_name == LOCKED_SLOTS then station.locked_slots = max(item_count, 0) - elseif station.network_name == NETWORK_ANY then + elseif station.network_name == NETWORK_EVERY then station.network_flag[item_name] = item_count end comb1_signals[k] = nil @@ -560,7 +560,7 @@ local function tick_poll_station(map_data, mod_settings) is_not_requesting = false is_requesting_nothing = false local f, a - if station.network_name == NETWORK_ANY then + if station.network_name == NETWORK_EVERY then f, a = pairs(station.network_flag--[[@as {[string]: int}]]) else f, a = once, station.network_name @@ -581,7 +581,7 @@ local function tick_poll_station(map_data, mod_settings) if is_not_requesting then if station.is_p and effective_item_count > 0 and item_count > 0 then local f, a - if station.network_name == NETWORK_ANY then + if station.network_name == NETWORK_EVERY then f, a = pairs(station.network_flag--[[@as {[string]: int}]]) else f, a = once, station.network_name @@ -624,15 +624,20 @@ local function tick_poll_train(map_data, mod_settings) end end ---@param map_data MapData -local function tick_poll_comb(map_data) +local function tick_poll_comb(map_data, mod_settings) local tick_data = map_data.tick_data --NOTE: the following has undefined behavior if last_comb is deleted local comb_id, comb = next(map_data.to_comb, tick_data.last_comb) tick_data.last_comb = comb_id + local refueler_id, _ = next(map_data.everything_refuelers, tick_data.last_refueler) + tick_data.last_refueler = refueler_id if comb and comb.valid then combinator_update(map_data, comb, true) end + if refueler_id then + set_refueler_from_comb(map_data, mod_settings, refueler_id) + end end ---@param map_data MapData ---@param mod_settings CybersynModSettings diff --git a/cybersyn/scripts/constants.lua b/cybersyn/scripts/constants.lua index ee51318..50f750a 100644 --- a/cybersyn/scripts/constants.lua +++ b/cybersyn/scripts/constants.lua @@ -23,7 +23,7 @@ MODE_WAGON_MANIFEST = "-" MODE_REFUELER = ">>" NETWORK_SIGNAL_DEFAULT = {name="signal-A", type="virtual"} -NETWORK_ANY = "signal-everything" +NETWORK_EVERY = "signal-everything" INACTIVITY_TIME = 100 LOCK_TRAIN_TIME = 60*60*60*24*7 diff --git a/cybersyn/scripts/factorio-api.lua b/cybersyn/scripts/factorio-api.lua index 0849e82..ce939ef 100644 --- a/cybersyn/scripts/factorio-api.lua +++ b/cybersyn/scripts/factorio-api.lua @@ -1,7 +1,9 @@ --By Mami local get_distance = require("__flib__.misc").get_distance -local floor = math.floor local table_insert = table.insert +local bit_extract = bit32.extract +local bit_replace = bit32.replace + local DEFINES_WORKING = defines.entity_status.working local DEFINES_LOW_POWER = defines.entity_status.low_power local DEFINES_COMBINATOR_INPUT = defines.circuit_connector_id.combinator_input @@ -313,7 +315,7 @@ function set_refueler_from_comb(map_data, mod_settings, id) local signal = params.first_signal local f, a - if refueler.network_name == NETWORK_ANY then + if refueler.network_name == NETWORK_EVERY then f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) else f, a = once, refueler.network_name @@ -329,15 +331,18 @@ function set_refueler_from_comb(map_data, mod_settings, id) end refueler.network_name = signal and signal.name or nil - refueler.allows_all_trains = (bits%2 == 1) or nil - - local signals = refueler.entity_comb.get_merged_signals(DEFINES_COMBINATOR_INPUT) + refueler.allows_all_trains = bit_extract(bits, 2) > 0 refueler.priority = 0 - if refueler.network_name == NETWORK_ANY then + + if refueler.network_name == NETWORK_EVERY then + map_data.everything_refuelers[id] = true refueler.network_flag = {} else + map_data.everything_refuelers[id] = nil refueler.network_flag = mod_settings.network_flag end + + local signals = refueler.entity_comb.get_merged_signals(DEFINES_COMBINATOR_INPUT) if not signals then return end for k, v in pairs(signals) do local item_name = v.signal.name @@ -347,7 +352,7 @@ function set_refueler_from_comb(map_data, mod_settings, id) if item_type == "virtual" then if item_name == SIGNAL_PRIORITY then refueler.priority = item_count - elseif refueler.network_name == NETWORK_ANY then + elseif refueler.network_name == NETWORK_EVERY then refueler.network_flag[item_name] = item_count end end @@ -357,7 +362,7 @@ function set_refueler_from_comb(map_data, mod_settings, id) end end - if refueler.network_name == NETWORK_ANY then + if refueler.network_name == NETWORK_EVERY then f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) else f, a = once, refueler.network_name @@ -401,9 +406,9 @@ function set_station_from_comb_state(station) local signal = params.first_signal local bits = params.second_constant or 0 - local is_pr_state = bit32.extract(bits, 0, 2) - local allows_all_trains = bit32.extract(bits, 2) > 0 - local is_stack = bit32.extract(bits, 3) > 0 + local is_pr_state = bit_extract(bits, 0, 2) + local allows_all_trains = bit_extract(bits, 2) > 0 + local is_stack = bit_extract(bits, 3) > 0 station.network_name = signal and signal.name or nil station.allows_all_trains = allows_all_trains @@ -419,9 +424,9 @@ function get_comb_gui_settings(comb) local selected_index = 0 local switch_state = "none" local bits = params.second_constant or 0 - local is_pr_state = bit32.extract(bits, 0, 2) - local allows_all_trains = bit32.extract(bits, 2) > 0 - local is_stack = bit32.extract(bits, 3) > 0 + local is_pr_state = bit_extract(bits, 0, 2) + local allows_all_trains = bit_extract(bits, 2) > 0 + local is_stack = bit_extract(bits, 3) > 0 if is_pr_state == 0 then switch_state = "none" elseif is_pr_state == 1 then @@ -450,7 +455,7 @@ function set_comb_is_pr_state(comb, is_pr_state) local param = control.parameters local bits = param.second_constant or 0 - param.second_constant = bit32.replace(bits, is_pr_state, 0, 2) + param.second_constant = bit_replace(bits, is_pr_state, 0, 2) control.parameters = param end ---@param comb LuaEntity @@ -460,7 +465,7 @@ function set_comb_allows_all_trains(comb, allows_all_trains) local param = control.parameters local bits = param.second_constant or 0 - param.second_constant = bit32.replace(bits, allows_all_trains and 1 or 0, 2) + param.second_constant = bit_replace(bits, allows_all_trains and 1 or 0, 2) control.parameters = param end ---@param comb LuaEntity @@ -470,7 +475,7 @@ function set_comb_is_stack(comb, is_stack) local param = control.parameters local bits = param.second_constant or 0 - param.second_constant = bit32.replace(bits, is_stack and 1 or 0, 3) + param.second_constant = bit_replace(bits, is_stack and 1 or 0, 3) control.parameters = param end ---@param comb LuaEntity diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index 1b192b6..3a8d442 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -19,6 +19,7 @@ ---@field public tick_state uint ---@field public tick_data {} ---@field public economy Economy +---@field public everything_refuelers {[uint]: true} ---@field public active_alerts {[LuaTrain]: int}? ---@field public se_tele_old_id {[string]: uint} @@ -146,6 +147,7 @@ function init_global() global.layout_top_id = 1 global.refuelers = {} global.to_refuelers = {} + global.everything_refuelers = {} IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil if IS_SE_PRESENT then diff --git a/cybersyn/scripts/gui.lua b/cybersyn/scripts/gui.lua index 773efaf..ccc9bf2 100644 --- a/cybersyn/scripts/gui.lua +++ b/cybersyn/scripts/gui.lua @@ -191,8 +191,8 @@ function register_gui_actions() local signal = element.elem_value if signal and (signal.name == "signal-everything" or signal.name == "signal-anything" or signal.name == "signal-each") then if param.operation == MODE_PRIMARY_IO or param.operation == MODE_PRIMARY_IO_ACTIVE or param.operation == MODE_PRIMARY_IO_FAILED_REQUEST or param.operation == MODE_REFUELER then - signal.name = NETWORK_ANY - element.elem_value.name = NETWORK_ANY + signal.name = NETWORK_EVERY + element.elem_value.name = NETWORK_EVERY else signal = nil element.elem_value = nil diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index fcb211d..7cf274a 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -76,7 +76,7 @@ local function on_refueler_broken(map_data, refueler_id, refueler) end end local f, a - if refueler.network_name == NETWORK_ANY then + if refueler.network_name == NETWORK_EVERY then f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) else f, a = once, refueler.network_name @@ -90,6 +90,7 @@ local function on_refueler_broken(map_data, refueler_id, refueler) end end end + map_data.everything_refuelers[refueler_id] = nil map_data.refuelers[refueler_id] = nil interface_raise_refueler_removed(refueler_id, refueler) end diff --git a/cybersyn/scripts/migrations.lua b/cybersyn/scripts/migrations.lua index d9b3951..9e66fad 100644 --- a/cybersyn/scripts/migrations.lua +++ b/cybersyn/scripts/migrations.lua @@ -119,6 +119,9 @@ local migrations_table = { local map_data = global map_data.tick_state = STATE_INIT map_data.tick_data = {} + + map_data.everything_refuelers = {} + for k, comb in pairs(map_data.to_comb) do local control = get_comb_control(comb) local params = control.parameters diff --git a/cybersyn/scripts/train-events.lua b/cybersyn/scripts/train-events.lua index c2da022..76c38ab 100644 --- a/cybersyn/scripts/train-events.lua +++ b/cybersyn/scripts/train-events.lua @@ -332,7 +332,7 @@ local function on_train_leaves_stop(map_data, mod_settings, train_id, train) local refueler = map_data.refuelers[id] set_refueler_from_comb(map_data, mod_settings, id) - local refueler_network_flag = refueler.network_name == NETWORK_ANY and refueler.network_flag[train.network_name] or refueler.network_flag + local refueler_network_flag = refueler.network_name == NETWORK_EVERY and refueler.network_flag[train.network_name] or refueler.network_flag if btest(train.network_flag, refueler_network_flag) and (refueler.allows_all_trains or refueler.accepted_layouts[train.layout_id]) and refueler.trains_total < refueler.entity_stop.trains_limit then local accepted = false local dist = nil