mirror of
https://github.com/Xevion/project-cybersyn.git
synced 2025-12-08 16:08:07 -06:00
improved refueler everything logic
This commit is contained in:
1
TODO
1
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user