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:
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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

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]
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