improved refueler everything logic

This commit is contained in:
mamoniot
2022-12-23 10:22:08 -05:00
parent 2a5b4543d4
commit 13eefd8f16
9 changed files with 46 additions and 31 deletions

1
TODO
View File

@@ -12,7 +12,6 @@ major:
minor: minor:
railloader compat railloader compat
refuelers set to everything should check for new signals
close gui when the combinator is destroyed close gui when the combinator is destroyed
do not play close sound when a different gui is opened 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 gui can desync if settings are changed outside of it while it is open

View File

@@ -283,7 +283,7 @@ local function tick_dispatch(map_data, mod_settings)
local r_station = stations[r_station_id] local r_station = stations[r_station_id]
---@type string ---@type string
local network_name local network_name
if r_station.network_name == NETWORK_ANY then if r_station.network_name == NETWORK_EVERY then
--TODO: here --TODO: here
_, _, network_name = string.find(item_network_name, "(^.*):") _, _, network_name = string.find(item_network_name, "(^.*):")
else else
@@ -310,8 +310,8 @@ local function tick_dispatch(map_data, mod_settings)
goto p_continue goto p_continue
end 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 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_ANY and (r_station.network_flag[item_name] or 0) or r_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) local netand = band(p_flag, r_flag)
if netand == 0 then if netand == 0 then
goto p_continue goto p_continue
@@ -487,7 +487,7 @@ local function tick_poll_station(map_data, mod_settings)
station.priority = 0 station.priority = 0
station.item_priority = nil station.item_priority = nil
station.locked_slots = 0 station.locked_slots = 0
if station.network_name == NETWORK_ANY then if station.network_name == NETWORK_EVERY then
station.network_flag = {} station.network_flag = {}
else else
station.network_flag = mod_settings.network_flag 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) station.r_threshold = abs(item_count)
elseif item_name == LOCKED_SLOTS then elseif item_name == LOCKED_SLOTS then
station.locked_slots = max(item_count, 0) 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 station.network_flag[item_name] = item_count
end end
comb1_signals[k] = nil comb1_signals[k] = nil
@@ -560,7 +560,7 @@ local function tick_poll_station(map_data, mod_settings)
is_not_requesting = false is_not_requesting = false
is_requesting_nothing = false is_requesting_nothing = false
local f, a 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}]]) f, a = pairs(station.network_flag--[[@as {[string]: int}]])
else else
f, a = once, station.network_name 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 is_not_requesting then
if station.is_p and effective_item_count > 0 and item_count > 0 then if station.is_p and effective_item_count > 0 and item_count > 0 then
local f, a 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}]]) f, a = pairs(station.network_flag--[[@as {[string]: int}]])
else else
f, a = once, station.network_name f, a = once, station.network_name
@@ -624,15 +624,20 @@ local function tick_poll_train(map_data, mod_settings)
end end
end end
---@param map_data MapData ---@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 local tick_data = map_data.tick_data
--NOTE: the following has undefined behavior if last_comb is deleted --NOTE: the following has undefined behavior if last_comb is deleted
local comb_id, comb = next(map_data.to_comb, tick_data.last_comb) local comb_id, comb = next(map_data.to_comb, tick_data.last_comb)
tick_data.last_comb = comb_id 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 if comb and comb.valid then
combinator_update(map_data, comb, true) combinator_update(map_data, comb, true)
end end
if refueler_id then
set_refueler_from_comb(map_data, mod_settings, refueler_id)
end
end end
---@param map_data MapData ---@param map_data MapData
---@param mod_settings CybersynModSettings ---@param mod_settings CybersynModSettings

View File

@@ -23,7 +23,7 @@ MODE_WAGON_MANIFEST = "-"
MODE_REFUELER = ">>" MODE_REFUELER = ">>"
NETWORK_SIGNAL_DEFAULT = {name="signal-A", type="virtual"} NETWORK_SIGNAL_DEFAULT = {name="signal-A", type="virtual"}
NETWORK_ANY = "signal-everything" NETWORK_EVERY = "signal-everything"
INACTIVITY_TIME = 100 INACTIVITY_TIME = 100
LOCK_TRAIN_TIME = 60*60*60*24*7 LOCK_TRAIN_TIME = 60*60*60*24*7

View File

@@ -1,7 +1,9 @@
--By Mami --By Mami
local get_distance = require("__flib__.misc").get_distance local get_distance = require("__flib__.misc").get_distance
local floor = math.floor
local table_insert = table.insert local table_insert = table.insert
local bit_extract = bit32.extract
local bit_replace = bit32.replace
local DEFINES_WORKING = defines.entity_status.working local DEFINES_WORKING = defines.entity_status.working
local DEFINES_LOW_POWER = defines.entity_status.low_power local DEFINES_LOW_POWER = defines.entity_status.low_power
local DEFINES_COMBINATOR_INPUT = defines.circuit_connector_id.combinator_input 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 signal = params.first_signal
local f, a 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}]]) f, a = pairs(refueler.network_flag--[[@as {[string]: int}]])
else else
f, a = once, refueler.network_name f, a = once, refueler.network_name
@@ -329,15 +331,18 @@ function set_refueler_from_comb(map_data, mod_settings, id)
end end
refueler.network_name = signal and signal.name or nil refueler.network_name = signal and signal.name or nil
refueler.allows_all_trains = (bits%2 == 1) or nil refueler.allows_all_trains = bit_extract(bits, 2) > 0
local signals = refueler.entity_comb.get_merged_signals(DEFINES_COMBINATOR_INPUT)
refueler.priority = 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 = {} refueler.network_flag = {}
else else
map_data.everything_refuelers[id] = nil
refueler.network_flag = mod_settings.network_flag refueler.network_flag = mod_settings.network_flag
end end
local signals = refueler.entity_comb.get_merged_signals(DEFINES_COMBINATOR_INPUT)
if not signals then return end if not signals then return end
for k, v in pairs(signals) do for k, v in pairs(signals) do
local item_name = v.signal.name 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_type == "virtual" then
if item_name == SIGNAL_PRIORITY then if item_name == SIGNAL_PRIORITY then
refueler.priority = item_count 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 refueler.network_flag[item_name] = item_count
end end
end end
@@ -357,7 +362,7 @@ function set_refueler_from_comb(map_data, mod_settings, id)
end end
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}]]) f, a = pairs(refueler.network_flag--[[@as {[string]: int}]])
else else
f, a = once, refueler.network_name f, a = once, refueler.network_name
@@ -401,9 +406,9 @@ function set_station_from_comb_state(station)
local signal = params.first_signal local signal = params.first_signal
local bits = params.second_constant or 0 local bits = params.second_constant or 0
local is_pr_state = bit32.extract(bits, 0, 2) local is_pr_state = bit_extract(bits, 0, 2)
local allows_all_trains = bit32.extract(bits, 2) > 0 local allows_all_trains = bit_extract(bits, 2) > 0
local is_stack = bit32.extract(bits, 3) > 0 local is_stack = bit_extract(bits, 3) > 0
station.network_name = signal and signal.name or nil station.network_name = signal and signal.name or nil
station.allows_all_trains = allows_all_trains station.allows_all_trains = allows_all_trains
@@ -419,9 +424,9 @@ function get_comb_gui_settings(comb)
local selected_index = 0 local selected_index = 0
local switch_state = "none" local switch_state = "none"
local bits = params.second_constant or 0 local bits = params.second_constant or 0
local is_pr_state = bit32.extract(bits, 0, 2) local is_pr_state = bit_extract(bits, 0, 2)
local allows_all_trains = bit32.extract(bits, 2) > 0 local allows_all_trains = bit_extract(bits, 2) > 0
local is_stack = bit32.extract(bits, 3) > 0 local is_stack = bit_extract(bits, 3) > 0
if is_pr_state == 0 then if is_pr_state == 0 then
switch_state = "none" switch_state = "none"
elseif is_pr_state == 1 then 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 param = control.parameters
local bits = param.second_constant or 0 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 control.parameters = param
end end
---@param comb LuaEntity ---@param comb LuaEntity
@@ -460,7 +465,7 @@ function set_comb_allows_all_trains(comb, allows_all_trains)
local param = control.parameters local param = control.parameters
local bits = param.second_constant or 0 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 control.parameters = param
end end
---@param comb LuaEntity ---@param comb LuaEntity
@@ -470,7 +475,7 @@ function set_comb_is_stack(comb, is_stack)
local param = control.parameters local param = control.parameters
local bits = param.second_constant or 0 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 control.parameters = param
end end
---@param comb LuaEntity ---@param comb LuaEntity

View File

@@ -19,6 +19,7 @@
---@field public tick_state uint ---@field public tick_state uint
---@field public tick_data {} ---@field public tick_data {}
---@field public economy Economy ---@field public economy Economy
---@field public everything_refuelers {[uint]: true}
---@field public active_alerts {[LuaTrain]: int}? ---@field public active_alerts {[LuaTrain]: int}?
---@field public se_tele_old_id {[string]: uint} ---@field public se_tele_old_id {[string]: uint}
@@ -146,6 +147,7 @@ function init_global()
global.layout_top_id = 1 global.layout_top_id = 1
global.refuelers = {} global.refuelers = {}
global.to_refuelers = {} global.to_refuelers = {}
global.everything_refuelers = {}
IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil
if IS_SE_PRESENT then if IS_SE_PRESENT then

View File

@@ -191,8 +191,8 @@ function register_gui_actions()
local signal = element.elem_value local signal = element.elem_value
if signal and (signal.name == "signal-everything" or signal.name == "signal-anything" or signal.name == "signal-each") then 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 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 signal.name = NETWORK_EVERY
element.elem_value.name = NETWORK_ANY element.elem_value.name = NETWORK_EVERY
else else
signal = nil signal = nil
element.elem_value = nil element.elem_value = nil

View File

@@ -76,7 +76,7 @@ local function on_refueler_broken(map_data, refueler_id, refueler)
end end
end end
local f, a 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}]]) f, a = pairs(refueler.network_flag--[[@as {[string]: int}]])
else else
f, a = once, refueler.network_name f, a = once, refueler.network_name
@@ -90,6 +90,7 @@ local function on_refueler_broken(map_data, refueler_id, refueler)
end end
end end
end end
map_data.everything_refuelers[refueler_id] = nil
map_data.refuelers[refueler_id] = nil map_data.refuelers[refueler_id] = nil
interface_raise_refueler_removed(refueler_id, refueler) interface_raise_refueler_removed(refueler_id, refueler)
end end

View File

@@ -119,6 +119,9 @@ local migrations_table = {
local map_data = global local map_data = global
map_data.tick_state = STATE_INIT map_data.tick_state = STATE_INIT
map_data.tick_data = {} map_data.tick_data = {}
map_data.everything_refuelers = {}
for k, comb in pairs(map_data.to_comb) do for k, comb in pairs(map_data.to_comb) do
local control = get_comb_control(comb) local control = get_comb_control(comb)
local params = control.parameters local params = control.parameters

View File

@@ -332,7 +332,7 @@ local function on_train_leaves_stop(map_data, mod_settings, train_id, train)
local refueler = map_data.refuelers[id] local refueler = map_data.refuelers[id]
set_refueler_from_comb(map_data, mod_settings, 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 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 accepted = false
local dist = nil local dist = nil