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