Merge pull request #86 from mamoniot/beta

1.2.15
This commit is contained in:
Monica Moniot
2023-05-01 06:45:19 -04:00
committed by GitHub
11 changed files with 144 additions and 85 deletions

View File

@@ -1,4 +1,12 @@
--------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------
Version: 1.2.15
Date: 2023-4-30
Bugfixes:
- Fixed UPS spikes in Space Exploration related to expensive remote calls into their modding interface.
- Added a fix for a crash related to using the beta branch of cybersyn
- Fixed missing cybersyn manager translation key.
- Improved several tooltips
---------------------------------------------------------------------------------------------------
Version: 1.2.14 Version: 1.2.14
Date: 2023-4-30 Date: 2023-4-30
Features: Features:

View File

@@ -1,6 +1,6 @@
{ {
"name": "cybersyn", "name": "cybersyn",
"version": "1.2.14", "version": "1.2.15",
"title": "Project Cybersyn", "title": "Project Cybersyn",
"author": "Mami", "author": "Mami",
"factorio_version": "1.1", "factorio_version": "1.1",

View File

@@ -13,7 +13,7 @@ cybersyn-stuck-train-time=Zeitüberschreitung bei festgefahrenem Zug in Sekunden
cybersyn-allow-cargo-in-depot=Erlaube Züge mit Fracht in Depots cybersyn-allow-cargo-in-depot=Erlaube Züge mit Fracht in Depots
cybersyn-invert-sign=Invertieren der Kombinatorausgabe (veraltet) cybersyn-invert-sign=Invertieren der Kombinatorausgabe (veraltet)
#cybersyn-manager-enabled= #cybersyn-manager-enabled=
#cybersyn-manager-update-rate= #cybersyn-manager-updates-per-second=
#cybersyn-manager-result-limit= #cybersyn-manager-result-limit=
[mod-setting-description] [mod-setting-description]

View File

@@ -12,9 +12,9 @@ cybersyn-warmup-time=Station warmup time (sec)
cybersyn-stuck-train-time=Stuck train timeout (sec) cybersyn-stuck-train-time=Stuck train timeout (sec)
cybersyn-allow-cargo-in-depot=Allow cargo in depots cybersyn-allow-cargo-in-depot=Allow cargo in depots
cybersyn-invert-sign=Invert combinator output (deprecated) cybersyn-invert-sign=Invert combinator output (deprecated)
cybersyn-manager-enabled=Enable the Cybersyn GUI. cybersyn-manager-enabled=Preview the Indev Cybersyn Manager
cybersyn-manager-update-rate=Manager refresh tick interval cybersyn-manager-updates-per-second=Manager updates per second
cybersyn-manager-result-limit=Max entities displayed on GUI pages. cybersyn-manager-result-limit=Max entities displayed on GUI pages
[mod-setting-description] [mod-setting-description]
cybersyn-enable-planner=Enable or disable the central planning algorithm. If disabled no new trains will be dispatched. cybersyn-enable-planner=Enable or disable the central planning algorithm. If disabled no new trains will be dispatched.
@@ -30,6 +30,8 @@ cybersyn-warmup-time=How many seconds a cybernetic combinator will wait before c
cybersyn-stuck-train-time=After this many seconds from a train's dispatch, an alert will be sent to let you know a train is probably stuck and has not completed its delivery. The player will likely have to debug their network to get the train unstuck. cybersyn-stuck-train-time=After this many seconds from a train's dispatch, an alert will be sent to let you know a train is probably stuck and has not completed its delivery. The player will likely have to debug their network to get the train unstuck.
cybersyn-allow-cargo-in-depot=If checked, trains will be allowed to have cargo in depots; no alerts will be generated and the train will not be held. In addition, trains with orders to visit requester stations with "Inactivity condition" checked will wait for inactivity instead of waiting for empty cargo. Useful for creating train systems where depots handle excess cargo. For advanced users only. cybersyn-allow-cargo-in-depot=If checked, trains will be allowed to have cargo in depots; no alerts will be generated and the train will not be held. In addition, trains with orders to visit requester stations with "Inactivity condition" checked will wait for inactivity instead of waiting for empty cargo. Useful for creating train systems where depots handle excess cargo. For advanced users only.
cybersyn-invert-sign=Flip the sign of the output of cybernetic combinators to be the same as it is in LTN or in earlier versions of Project Cybersyn. cybersyn-invert-sign=Flip the sign of the output of cybernetic combinators to be the same as it is in LTN or in earlier versions of Project Cybersyn.
cybersyn-manager-enabled=Allows viewing of all trains and stations connected to the Cybersyn network. This GUI is currently in development and is likely to have many crashes.
cybersyn-manager-updates-per-second=Controls how frequently the Cybersyn manager gui refreshes. The Cybersyn manager must be set to active for this setting to have an effect.
cybersyn-manager-result-limit=Caps the number of matching enitities (e.g. stations, trains) to limit the amount of update time consumed when the list is refreshed.\n-1 means return all results. cybersyn-manager-result-limit=Caps the number of matching enitities (e.g. stations, trains) to limit the amount of update time consumed when the list is refreshed.\n-1 means return all results.
[item-name] [item-name]
@@ -85,9 +87,9 @@ switch-request-tooltip=Lock this station to only request items from the network.
network=Network network=Network
network-tooltip=A signal is used to identify which network this combinator is a member of. Trains will only be dispatched from depots to provider and requester stations if they are all identified with the same signal. network-tooltip=A signal is used to identify which network this combinator is a member of. Trains will only be dispatched from depots to provider and requester stations if they are all identified with the same signal.
allow-list-description=Automatic allow-list allow-list-description=Automatic allow-list
allow-list-tooltip=When checked trains in the network are automatically added to the allow-list if every wagon of the train is able to be loaded or unloaded by this station. When unchecked the allow-list is not used and all trains are allowed to park here. allow-list-tooltip=Normally when a delivery is requested, any train with a large enough cargo capacity may fulfill it. When this setting is checked trains must also be on this station's "allow-list". Trains are automatically added to the allow-list if each of its wagons are able to be loaded or unloaded by inserters or pumps along this station.
is-stack-description=Stack thresholds is-stack-description=Stack thresholds
is-stack-tooltip=When checked all request thresholds for this station are interpretted as a count of item stacks rather than a count of total items. Thresholds for fluids are unaffected. is-stack-tooltip=When checked all request thresholds for this station are interpreted as a count of item stacks rather than a count of total items. Thresholds for fluids are unaffected.
enable-inactive-description=Inactivity condition enable-inactive-description=Inactivity condition
enable-inactive-tooltip=When checked a train at a provider is required to wait for inactivity even if its order has been fulfilled. This is frequently useful for preventing inserters from getting items stuck in their hands. enable-inactive-tooltip=When checked a train at a provider is required to wait for inactivity even if its order has been fulfilled. This is frequently useful for preventing inserters from getting items stuck in their hands.
use-same-depot-description=Require same depot use-same-depot-description=Require same depot

View File

@@ -13,7 +13,7 @@ cybersyn-stuck-train-time=Tren atascado tiempo de espera (seg)
cybersyn-allow-cargo-in-depot=Permitir carga en depositos cybersyn-allow-cargo-in-depot=Permitir carga en depositos
cybersyn-invert-sign=Invertir salida del combinador (obsoleto) cybersyn-invert-sign=Invertir salida del combinador (obsoleto)
cybersyn-manager-enabled=Habilitar la GUI de Cybersyn. cybersyn-manager-enabled=Habilitar la GUI de Cybersyn.
cybersyn-manager-update-rate=Actualizar manager intervalo de tick cybersyn-manager-updates-per-second=Actualizar manager intervalo de tick
cybersyn-manager-result-limit=Máxima cantidad de entidades mostradas en las páginas GUI. cybersyn-manager-result-limit=Máxima cantidad de entidades mostradas en las páginas GUI.
[mod-setting-description] [mod-setting-description]

View File

@@ -13,7 +13,7 @@ cybersyn-stuck-train-time=Таймаут застревания поезда (с
cybersyn-allow-cargo-in-depot=Разрешить поезда с грузом в депо cybersyn-allow-cargo-in-depot=Разрешить поезда с грузом в депо
cybersyn-invert-sign=Инвертировать вывод комбинатора (устаревший параметр) cybersyn-invert-sign=Инвертировать вывод комбинатора (устаревший параметр)
#cybersyn-manager-enabled= #cybersyn-manager-enabled=
#cybersyn-manager-update-rate= #cybersyn-manager-updates-per-second=
#cybersyn-manager-result-limit= #cybersyn-manager-result-limit=
[mod-setting-description] [mod-setting-description]

View File

@@ -13,7 +13,7 @@ cybersyn-stuck-train-time=卡住火车超时(秒)
cybersyn-allow-cargo-in-depot=允许仓库中的货物 cybersyn-allow-cargo-in-depot=允许仓库中的货物
cybersyn-invert-sign=反转组合器输出(已弃用) cybersyn-invert-sign=反转组合器输出(已弃用)
#cybersyn-manager-enabled= #cybersyn-manager-enabled=
#cybersyn-manager-update-rate= #cybersyn-manager-updates-per-second=
#cybersyn-manager-result-limit= #cybersyn-manager-result-limit=
[mod-setting-description] [mod-setting-description]

View File

@@ -3,6 +3,8 @@ local get_distance = require("__flib__.position").distance
local table_insert = table.insert local table_insert = table.insert
local bit_extract = bit32.extract local bit_extract = bit32.extract
local bit_replace = bit32.replace local bit_replace = bit32.replace
local string_sub = string.sub
local string_len = string.len
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
@@ -33,19 +35,67 @@ function get_dist(entity0, entity1)
end end
---@param cache PerfCache
---@param surface LuaSurface ---@param surface LuaSurface
function se_get_space_elevator_name(surface) function se_get_space_elevator_name(cache, surface)
--TODO: check how expensive the following is and potentially cache it's results ---@type LuaEntity?
local entity = surface.find_entities_filtered({ local entity = nil
local cache_idx = surface.index
if cache.se_get_space_elevator_name then
entity = cache.se_get_space_elevator_name[cache_idx]
else
cache.se_get_space_elevator_name = {}
end
if not entity or not entity.valid then
--Chaching failed, default to expensive lookup
entity = surface.find_entities_filtered({
name = SE_ELEVATOR_STOP_PROTO_NAME, name = SE_ELEVATOR_STOP_PROTO_NAME,
type = "train-stop", type = "train-stop",
limit = 1, limit = 1,
})[1] })[1]
if entity then
cache.se_get_space_elevator_name[cache_idx] = entity
end
end
if entity and entity.valid then if entity and entity.valid then
return string.sub(entity.backer_name, 1, string.len(entity.backer_name) - SE_ELEVATOR_SUFFIX_LENGTH) return string_sub(entity.backer_name, 1, string_len(entity.backer_name) - SE_ELEVATOR_SUFFIX_LENGTH)
else
return nil
end end
end end
---@param cache PerfCache
---@param surface_index uint
local function se_get_zone_from_surface_index(cache, surface_index)
---@type uint?
local zone_index = nil
---@type uint?
local zone_orbit_index = nil
local cache_idx = 2*surface_index
if cache.se_get_zone_from_surface_index then
zone_index = cache.se_get_zone_from_surface_index[cache_idx - 1]--[[@as uint]]
--zones may not have an orbit_index
zone_orbit_index = cache.se_get_zone_from_surface_index[cache_idx]--[[@as uint?]]
else
cache.se_get_zone_from_surface_index = {}
end
if not zone_index then
zone = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = surface_index})
if zone and type(zone.index) == "number" then
zone_index = zone.index--[[@as uint]]
zone_orbit_index = zone.orbit_index--[[@as uint?]]
--NOTE: caching these indices could be a problem if SE is not deterministic in choosing them
cache.se_get_zone_from_surface_index[cache_idx - 1] = zone_index
cache.se_get_zone_from_surface_index[cache_idx] = zone_orbit_index
end
end
return zone_index, zone_orbit_index
end
---@param train LuaTrain ---@param train LuaTrain
---@return LuaEntity? ---@return LuaEntity?
@@ -249,12 +299,12 @@ function set_manifest_schedule(map_data, train, depot_stop, same_depot, p_stop,
elseif IS_SE_PRESENT then elseif IS_SE_PRESENT then
local other_surface_i = (not is_p_on_t and p_surface_i) or (not is_r_on_t and r_surface_i) or d_surface_i local other_surface_i = (not is_p_on_t and p_surface_i) or (not is_r_on_t and r_surface_i) or d_surface_i
if (is_p_on_t or p_surface_i == other_surface_i) and (is_r_on_t or r_surface_i == other_surface_i) and (is_d_on_t or d_surface_i == other_surface_i) then if (is_p_on_t or p_surface_i == other_surface_i) and (is_r_on_t or r_surface_i == other_surface_i) and (is_d_on_t or d_surface_i == other_surface_i) then
local t_zone = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = t_surface_i})--[[@as {}]] local t_zone_index, t_zone_orbit_index = se_get_zone_from_surface_index(map_data.perf_cache, t_surface_i)
local other_zone = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = other_surface_i})--[[@as {}]] local other_zone_index, other_zone_orbit_index = se_get_zone_from_surface_index(map_data.perf_cache, other_surface_i)
if t_zone and other_zone then if t_zone_index and other_zone_index then
local is_train_in_orbit = other_zone.orbit_index == t_zone.index local is_train_in_orbit = other_zone_orbit_index == t_zone_index
if is_train_in_orbit or t_zone.orbit_index == other_zone.index then if is_train_in_orbit or t_zone_orbit_index == other_zone_index then
local elevator_name = se_get_space_elevator_name(t_surface) local elevator_name = se_get_space_elevator_name(map_data.perf_cache, t_surface)
if elevator_name then if elevator_name then
local records = {create_inactivity_order(depot_stop.backer_name)} local records = {create_inactivity_order(depot_stop.backer_name)}
if t_surface_i == p_surface_i then if t_surface_i == p_surface_i then
@@ -329,11 +379,13 @@ function add_refueler_schedule(map_data, train, stop)
train.schedule = schedule train.schedule = schedule
return true return true
elseif IS_SE_PRESENT then elseif IS_SE_PRESENT then
local t_zone = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = t_surface_i})--[[@as {}]] local t_zone_index, t_zone_orbit_index = se_get_zone_from_surface_index(map_data.perf_cache, t_surface_i)
local other_zone = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = f_surface_i})--[[@as {}]] local other_zone_index, other_zone_orbit_index = se_get_zone_from_surface_index(map_data.perf_cache, f_surface_i)
local is_train_in_orbit = other_zone.orbit_index == t_zone.index if t_zone_index and other_zone_index then
if is_train_in_orbit or t_zone.orbit_index == other_zone.index then local is_train_in_orbit = other_zone_orbit_index == t_zone_index
local elevator_name = se_get_space_elevator_name(t_surface) if is_train_in_orbit or t_zone_orbit_index == other_zone_index then
local elevator_name = se_get_space_elevator_name(map_data.perf_cache, t_surface)
if elevator_name then
local cur_order = schedule.records[i] local cur_order = schedule.records[i]
local is_elevator_in_orders_already = cur_order and cur_order.station == elevator_name..(is_train_in_orbit and SE_ELEVATOR_ORBIT_SUFFIX or SE_ELEVATOR_PLANET_SUFFIX) local is_elevator_in_orders_already = cur_order and cur_order.station == elevator_name..(is_train_in_orbit and SE_ELEVATOR_ORBIT_SUFFIX or SE_ELEVATOR_PLANET_SUFFIX)
if not is_elevator_in_orders_already then if not is_elevator_in_orders_already then
@@ -353,11 +405,14 @@ function add_refueler_schedule(map_data, train, stop)
return true return true
end end
end end
end
end
--create an order that probably cannot be fulfilled and alert the player --create an order that probably cannot be fulfilled and alert the player
table_insert(schedule.records, i, create_inactivity_order(stop.backer_name)) table_insert(schedule.records, i, create_inactivity_order(stop.backer_name))
lock_train(train) lock_train(train)
train.schedule = schedule train.schedule = schedule
send_alert_cannot_path_between_surfaces(map_data, train) send_alert_cannot_path_between_surfaces(map_data, train)
return false
end end

View File

@@ -24,6 +24,11 @@
---@field public each_refuelers {[uint]: true} ---@field public each_refuelers {[uint]: true}
---@field public active_alerts {[uint]: {[1]: LuaTrain, [2]: int}}? ---@field public active_alerts {[uint]: {[1]: LuaTrain, [2]: int}}?
---@field public manager Manager ---@field public manager Manager
---@field public perf_cache PerfCache -- This gets reset to an empty table on migration change
---@class PerfCache
---@field public se_get_space_elevator_name {}?
---@field public se_get_zone_from_surface_index {}?
---@class Station ---@class Station
---@field public entity_stop LuaEntity ---@field public entity_stop LuaEntity
@@ -161,6 +166,7 @@ function init_global()
global.refuelers = {} global.refuelers = {}
global.to_refuelers = {} global.to_refuelers = {}
global.each_refuelers = {} global.each_refuelers = {}
global.perf_cache = {}
IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil
end end

View File

@@ -147,6 +147,9 @@ end
function manager_gui.on_migration() function manager_gui.on_migration()
for i, v in pairs(global.manager.players) do
manager_gui.reset_player(i, v)
end
init_items(global.manager) init_items(global.manager)
end end

View File

@@ -296,29 +296,37 @@ local migrations_table = {
end end
end end
end, end,
["1.2.14"] = function() ["1.2.15"] = function()
---@type MapData ---@type MapData
local map_data = global local map_data = global
map_data.manager = { if not global.manager then
global.manager = {
players = {}, players = {},
} }
for i, v in pairs(game.players) do for i, v in pairs(game.players) do
manager_gui.on_player_created({player_index = i}) manager_gui.on_player_created({player_index = i})
end end
end
for _, e in pairs(map_data.refuelers) do for _, e in pairs(map_data.refuelers) do
if e.network_flag then
e.network_mask = e.network_flag e.network_mask = e.network_flag
e.network_flag = nil e.network_flag = nil
end end
end
for _, e in pairs(map_data.stations) do for _, e in pairs(map_data.stations) do
if e.network_flag then
e.network_mask = e.network_flag e.network_mask = e.network_flag
e.network_flag = nil e.network_flag = nil
end end
end
for _, e in pairs(map_data.trains) do for _, e in pairs(map_data.trains) do
if e.network_flag then
e.network_mask = e.network_flag e.network_mask = e.network_flag
e.network_flag = nil e.network_flag = nil
end end
end
end, end,
} }
--STATUS_R_TO_D = 5 --STATUS_R_TO_D = 5
@@ -326,11 +334,9 @@ local migrations_table = {
function on_config_changed(data) function on_config_changed(data)
global.tick_state = STATE_INIT global.tick_state = STATE_INIT
global.tick_data = {} global.tick_data = {}
flib_migration.on_config_changed(data, migrations_table) global.perf_cache = {}
for i, v in pairs(global.manager.players) do flib_migration.on_config_changed(data, migrations_table)
manager_gui.reset_player(i, v)
end
IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil IS_SE_PRESENT = remote.interfaces["space-exploration"] ~= nil
if IS_SE_PRESENT and not global.se_tele_old_id then if IS_SE_PRESENT and not global.se_tele_old_id then
@@ -349,25 +355,4 @@ end
---NOTE 2: Everything in this section must be idempotent ---NOTE 2: Everything in this section must be idempotent
function on_debug_revision_change() function on_debug_revision_change()
local map_data = global local map_data = global
if debug_revision == 1 then
for _, e in pairs(map_data.refuelers) do
if e.network_flag ~= nil then
e.network_mask = e.network_flag
e.network_flag = nil
end
end
for _, e in pairs(map_data.stations) do
if e.network_flag ~= nil then
e.network_mask = e.network_flag
e.network_flag = nil
end
end
for _, e in pairs(map_data.trains) do
if e.network_flag ~= nil then
e.network_mask = e.network_flag
e.network_flag = nil
end
end
end
end end