diff --git a/.vscode/settings.json b/.vscode/settings.json index 9c05daa..d678b89 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,12 +13,9 @@ "~/.steam/steam/steamapps/common/Factorio/data/core/lualib", "./.vscode/factorio", "./.vscode/flib", - "/home/mami/.config/Code/User/workspaceStorage/fdae937c5189f993d370b36f3104188f/justarandomgeek.factoriomod-debug/sumneko-3rd/factorio/library", - "/home/mami/.config/Code/User/workspaceStorage/95c2a8450056100ba3db30ac2a468857/justarandomgeek.factoriomod-debug/sumneko-3rd/factorio/library" + "/home/mami/.config/Code/User/workspaceStorage/4e7db8f77e7d31cf7af01a542e707dfb/justarandomgeek.factoriomod-debug/sumneko-3rd" ], "Lua.workspace.userThirdParty": [ - "/home/mami/.config/Code/User/workspaceStorage/fdae937c5189f993d370b36f3104188f/justarandomgeek.factoriomod-debug/sumneko-3rd", - "/home/mami/.config/Code/User/workspaceStorage/95c2a8450056100ba3db30ac2a468857/justarandomgeek.factoriomod-debug/sumneko-3rd", "/home/mami/.config/Code/User/workspaceStorage/4e7db8f77e7d31cf7af01a542e707dfb/justarandomgeek.factoriomod-debug/sumneko-3rd" ], "Lua.diagnostics.globals": [ @@ -36,7 +33,7 @@ "Lua.runtime.special": { "__object_name": "type" }, - "Lua.runtime.plugin": "/home/mami/.config/Code/User/workspaceStorage/95c2a8450056100ba3db30ac2a468857/justarandomgeek.factoriomod-debug/sumneko-3rd/factorio/plugin.lua", + "Lua.runtime.plugin": "/home/mami/.config/Code/User/workspaceStorage/4e7db8f77e7d31cf7af01a542e707dfb/justarandomgeek.factoriomod-debug/sumneko-3rd/factorio/plugin.lua", "Lua.diagnostics.disable": [ "lowercase-global" ], diff --git a/cybersyn/scripts/central-planning.lua b/cybersyn/scripts/central-planning.lua index 497e5f6..9428d4d 100644 --- a/cybersyn/scripts/central-planning.lua +++ b/cybersyn/scripts/central-planning.lua @@ -93,17 +93,17 @@ function create_delivery(map_data, r_station_id, p_station_id, train_id, manifes if item_i > 1 or r_is_each or p_is_each then local f, a if r_is_each then - f, a = pairs(r_station.network_flag--[[@as {[string]: int}]]) + f, a = pairs(r_station.network_mask--[[@as {[string]: int}]]) if p_is_each then for network_name, _ in f, a do local item_network_name = network_name..":"..item.name economy.all_r_stations[item_network_name] = nil economy.all_p_stations[item_network_name] = nil end - f, a = pairs(p_station.network_flag--[[@as {[string]: int}]]) + f, a = pairs(p_station.network_mask--[[@as {[string]: int}]]) end elseif p_is_each then - f, a = pairs(p_station.network_flag--[[@as {[string]: int}]]) + f, a = pairs(p_station.network_mask--[[@as {[string]: int}]]) else f, a = once, r_station.network_name end @@ -350,8 +350,8 @@ local function tick_dispatch(map_data, mod_settings) goto p_continue end - p_flag = get_network_flag(p_station, network_name) - r_flag = get_network_flag(r_station, network_name) + p_flag = get_network_mask(p_station, network_name) + r_flag = get_network_mask(r_station, network_name) netand = band(p_flag, r_flag) if netand == 0 then goto p_continue @@ -413,7 +413,7 @@ local function tick_dispatch(map_data, mod_settings) if trains then for train_id, _ in pairs(trains) do local train = map_data.trains[train_id] - local train_flag = get_network_flag(train, network_name) + local train_flag = get_network_mask(train, network_name) if not btest(netand, train_flag) or train.se_is_being_teleported then goto train_continue end @@ -551,9 +551,9 @@ local function tick_poll_station(map_data, mod_settings) station.locked_slots = mod_settings.locked_slots local is_each = station.network_name == NETWORK_EACH if is_each then - station.network_flag = {} + station.network_mask = {} else - station.network_flag = mod_settings.network_flag + station.network_mask = mod_settings.network_mask end local comb1_signals, comb2_signals = get_signals(station) station.tick_signals = comb1_signals @@ -594,12 +594,12 @@ local function tick_poll_station(map_data, mod_settings) elseif item_name == LOCKED_SLOTS then station.locked_slots = max(item_count, 0) elseif is_each then - station.network_flag[item_name] = item_count + station.network_mask[item_name] = item_count end comb1_signals[k] = nil end if item_name == station.network_name then - station.network_flag = item_count + station.network_mask = item_count comb1_signals[k] = nil end else @@ -624,7 +624,7 @@ local function tick_poll_station(map_data, mod_settings) is_requesting_nothing = false local f, a if station.network_name == NETWORK_EACH then - f, a = pairs(station.network_flag--[[@as {[string]: int}]]) + f, a = pairs(station.network_mask--[[@as {[string]: int}]]) else f, a = once, station.network_name end @@ -645,7 +645,7 @@ local function tick_poll_station(map_data, mod_settings) if station.is_p and effective_item_count > 0 and item_count > 0 then local f, a if station.network_name == NETWORK_EACH then - f, a = pairs(station.network_flag--[[@as {[string]: int}]]) + f, a = pairs(station.network_mask--[[@as {[string]: int}]]) else f, a = once, station.network_name end diff --git a/cybersyn/scripts/factorio-api.lua b/cybersyn/scripts/factorio-api.lua index c4c2c38..1c060bc 100644 --- a/cybersyn/scripts/factorio-api.lua +++ b/cybersyn/scripts/factorio-api.lua @@ -57,8 +57,8 @@ end ---@param e Station|Refueler|Train ---@param network_name string ---@return int -function get_network_flag(e, network_name) - return e.network_name == NETWORK_EACH and (e.network_flag[network_name] or 0) or e.network_flag--[[@as int]] +function get_network_mask(e, network_name) + return e.network_name == NETWORK_EACH and (e.network_mask[network_name] or 0) or e.network_mask--[[@as int]] end @@ -400,9 +400,9 @@ function set_station_from_comb(station) if station.network_name ~= new_name then station.network_name = new_name if station.network_name == NETWORK_EACH then - station.network_flag = {} + station.network_mask = {} else - station.network_flag = 0 + station.network_mask = 0 end end end @@ -426,9 +426,9 @@ function set_train_from_comb(mod_settings, train, comb) local is_each = train.network_name == NETWORK_EACH if is_each then - train.network_flag = {} + train.network_mask = {} else - train.network_flag = mod_settings.network_flag + train.network_mask = mod_settings.network_mask end train.priority = mod_settings.priority local signals = comb.get_merged_signals(defines.circuit_connector_id.combinator_input) @@ -443,12 +443,12 @@ function set_train_from_comb(mod_settings, train, comb) train.priority = item_count elseif is_each then if item_name ~= REQUEST_THRESHOLD and item_name ~= LOCKED_SLOTS then - train.network_flag[item_name] = item_count + train.network_mask[item_name] = item_count end end end if item_name == network_name then - train.network_flag = item_count + train.network_mask = item_count end end end @@ -464,7 +464,7 @@ function set_refueler_from_comb(map_data, mod_settings, id, refueler) local bits = params.second_constant or 0 local signal = params.first_signal local old_network = refueler.network_name - local old_network_flag = refueler.network_flag + local old_network_mask = refueler.network_mask refueler.network_name = signal and signal.name or nil refueler.allows_all_trains = bit_extract(bits, SETTING_DISABLE_ALLOW_LIST) > 0 @@ -473,10 +473,10 @@ function set_refueler_from_comb(map_data, mod_settings, id, refueler) local is_each = refueler.network_name == NETWORK_EACH if is_each then map_data.each_refuelers[id] = true - refueler.network_flag = {} + refueler.network_mask = {} else map_data.each_refuelers[id] = nil - refueler.network_flag = mod_settings.network_flag + refueler.network_mask = mod_settings.network_mask end local signals = refueler.entity_comb.get_merged_signals(DEFINES_COMBINATOR_INPUT) @@ -491,12 +491,12 @@ function set_refueler_from_comb(map_data, mod_settings, id, refueler) refueler.priority = item_count elseif is_each then if item_name ~= REQUEST_THRESHOLD and item_name ~= LOCKED_SLOTS then - refueler.network_flag[item_name] = item_count + refueler.network_mask[item_name] = item_count end end end if item_name == refueler.network_name then - refueler.network_flag = item_count + refueler.network_mask = item_count end end end @@ -504,7 +504,7 @@ function set_refueler_from_comb(map_data, mod_settings, id, refueler) local f, a if old_network == NETWORK_EACH then - f, a = pairs(old_network_flag--[[@as {[string]: int}]]) + f, a = pairs(old_network_mask--[[@as {[string]: int}]]) elseif old_network ~= refueler.network_name then f, a = once, old_network else @@ -521,7 +521,7 @@ function set_refueler_from_comb(map_data, mod_settings, id, refueler) end if refueler.network_name == NETWORK_EACH then - f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) + f, a = pairs(refueler.network_mask--[[@as {[string]: int}]]) elseif old_network ~= refueler.network_name then f, a = once, refueler.network_name else diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index 0d0c749..4e668bf 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -42,7 +42,7 @@ ---@field public r_threshold int >= 0 --transient ---@field public locked_slots int >= 0 --transient ---@field public network_name string? ----@field public network_flag int|{[string]: int} --transient +---@field public network_mask int|{[string]: int} --transient ---@field public wagon_combs {[int]: LuaEntity}?--NOTE: allowed to be invalid entities or combinators with the wrong operation, these must be checked and lazy deleted when found ---@field public deliveries {[string]: int} ---@field public accepted_layouts {[uint]: true?} @@ -68,7 +68,7 @@ ---@field public allows_all_trains true? ---@field public priority int ---@field public network_name string? ----@field public network_flag int|{[string]: int} +---@field public network_mask int|{[string]: int} ---@class Train ---@field public entity LuaTrain --should only be invalid if se_is_being_teleported is true @@ -86,7 +86,7 @@ ---@field public use_any_depot true? ---@field public disable_bypass true? ---@field public network_name string? --can only be nil when the train is parked at a depot ----@field public network_flag int|{[string]: int} --transient +---@field public network_mask int|{[string]: int} --transient ---@field public priority int ---@field public refueler_id uint? ---@field public se_is_being_teleported true? --se only @@ -114,7 +114,7 @@ ---@field public r_threshold int ---@field public priority int ---@field public locked_slots int ----@field public network_flag int +---@field public network_mask int ---@field public warmup_time double ---@field public stuck_train_time double ---@field public fuel_threshold double @@ -125,7 +125,7 @@ ---@field public react_to_train_at_incorrect_station boolean --interface setting ---@field public react_to_train_early_to_depot boolean --interface setting ---@field public enable_manager boolean ----@field public manager_update_rate int +---@field public manager_ups double --if this is uncommented it means there are migrations to write diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index 8540d07..04ef2a6 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -39,14 +39,14 @@ function inventory_tab.build(map_data, player_data) local search_network_name = player_data.search_network_name local search_network_mask = player_data.search_network_mask local search_surface_idx = player_data.search_surface_idx - + local inventory_provided = {} local inventory_in_transit = {} local inventory_requested = {} local stations_sorted = {} - + for id, station in pairs(map_data.stations) do local entity = station.entity_stop @@ -61,12 +61,9 @@ function inventory_tab.build(map_data, player_data) end -- move surface comparison up higher in query to short circuit query earlier if surface doesn't match if search_surface_idx then - if search_surface_idx == -1 then - goto has_match - elseif entity.surface.index ~= search_surface_idx then + if entity.surface.index ~= search_surface_idx then goto continue end - ::has_match:: end if search_network_name then if search_network_name == (NETWORK_EACH or NETWORK_ANYTHING) then @@ -76,21 +73,21 @@ function inventory_tab.build(map_data, player_data) goto continue end ::has_match:: - local train_flag = get_network_flag(station, station.network_name) + local train_flag = get_network_mask(station, station.network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue end elseif search_network_mask ~= -1 then if station.network_name == NETWORK_EACH then - local masks = station.network_flag--[[@as {}]] - for _, network_flag in pairs(masks) do - if bit32.btest(search_network_mask, network_flag) then + local masks = station.network_mask--[[@as {}]] + for _, network_mask in pairs(masks) do + if bit32.btest(search_network_mask, network_mask) then goto has_match end end goto continue ::has_match:: - elseif not bit32.btest(search_network_mask, station.network_flag) then + elseif not bit32.btest(search_network_mask, station.network_mask) then goto continue end end diff --git a/cybersyn/scripts/gui/main.lua b/cybersyn/scripts/gui/main.lua index 7992002..e7826d0 100644 --- a/cybersyn/scripts/gui/main.lua +++ b/cybersyn/scripts/gui/main.lua @@ -9,7 +9,7 @@ local manager = require("scripts.gui.manager") --- @class PlayerData --- @field is_manager_open boolean ---- @field refs {[string]: LuaGuiElement}? +--- @field refs {[string]: LuaGuiElement} --- @field search_query string? --- @field search_network_name string? --- @field search_network_mask int @@ -63,6 +63,7 @@ function manager_gui.on_player_created(e) trains_orderings_invert = {}, pinning = false, refs = manager.create(player), + selected_tab = "stations_tab", } global.manager.players[e.player_index] = player_data @@ -95,7 +96,7 @@ end commands.add_command("cybersyn_rebuild_manager_windows", nil, function(command) local manager_data = global.manager if manager_data then - + ---@param v PlayerData for i, v in pairs(manager_data.players) do local player = game.get_player(i) diff --git a/cybersyn/scripts/gui/manager.lua b/cybersyn/scripts/gui/manager.lua index 2e2926f..2623dd2 100644 --- a/cybersyn/scripts/gui/manager.lua +++ b/cybersyn/scripts/gui/manager.lua @@ -67,7 +67,7 @@ function manager.create(player) name = "manager_text_search_field", type = "textfield", clear_and_focus_on_right_click = true, - handler = manager.handle.manager_update_text_search, --on_gui_text_changed + handler = { [defines.events.on_gui_text_changed] = manager.handle.manager_update_text_search }, }, { type = "label", style = "subheader_caption_label", caption = { "cybersyn-gui.search-item-label" } }, { type= "choose-elem-button", name="manager_item_filter", style="slot_button_in_shallow_frame", elem_type="signal", handler=manager.handle.manager_update_item_search, }, @@ -83,13 +83,13 @@ function manager.create(player) allow_negative = true, clear_and_focus_on_right_click = true, text = "-1", - handler = manager.handle.manager_update_network_mask, --on_gui_text_changed + handler = { [defines.events.on_gui_text_changed] = manager.handle.manager_update_network_mask }, }, { type = "label", style = "caption_label", caption = { "cybersyn-gui.surface-label" } }, { name = "manager_surface_dropdown", type = "drop-down", - handler = manager.handle.manager_update_surface, --on_gui_selection_state_changed + handler = { [defines.events.on_gui_selection_state_changed] = manager.handle.manager_update_surface }, }, }, }, @@ -116,13 +116,13 @@ function manager.create(player) return refs end +--- @param player_data PlayerData function manager.build(player_data) local refs = player_data.refs - -- Surface dropdown + -- Surface dropdown --- @type LuaGuiElement - local surface_dropdown = refs.manager_surface_dropdown - local surfaces = game.surfaces - local selected_surface_id = player_data.search_surface_idx + local surface_dropdown = refs.manager_surface_dropdown + local surfaces = game.surfaces local currently_selected_index = surface_dropdown.selected_index local currently_selected_surface = nil if currently_selected_index ~= (nil or 0) then @@ -130,26 +130,23 @@ function manager.build(player_data) end surface_dropdown.clear_items() surface_dropdown.add_item("all", 1) - i = 1 + local i = 1 for name, _ in pairs(surfaces) do i = i + 1 surface_dropdown.add_item(name, i) --reselect same surface if name == currently_selected_surface then - refs.manager_surface_dropdown.selected_index = i + refs.manager_surface_dropdown.selected_index = i--[[@as uint]] end end - -- Validate that the selected index still exist - if selected_surface_id then - local selected_surface = game.get_surface(selected_surface_id) - -- If the surface was invalidated since last update, reset to all + -- Validate that the selected index still exist + if player_data.search_surface_idx then + local selected_surface = game.get_surface(player_data.search_surface_idx) + -- If the surface was invalidated since last update, reset to all if not selected_surface then - player_data.search_surface_idx = -1 + player_data.search_surface_idx = nil end - else - player_data.search_surface_idx = -1 end - end --- @param map_data MapData @@ -271,7 +268,8 @@ end --- @param e GuiEventData function manager.handle.manager_update_item_search(player, player_data, refs, e) local element = e.element - local signal = element.elem_value + if not element then return end + local signal = e.element.elem_value if signal then player_data.search_item = signal.name else @@ -283,8 +281,10 @@ end --- @param player LuaPlayer --- @param player_data PlayerData --- @param refs table +--- @param e GuiEventData function manager.handle.manager_update_network_name(player, player_data, refs, e) local element = e.element + if not element then return end local signal = element.elem_value if signal then player_data.search_network_name = signal.name @@ -295,23 +295,28 @@ end --- @param player LuaPlayer --- @param player_data PlayerData --- @param refs table +--- @param e GuiEventData function manager.handle.manager_update_network_mask(player, player_data, refs, e) player_data.search_network_mask = tonumber(e.text) or -1 + e.text = tostring(player_data.search_network_mask) end --- @param player LuaPlayer --- @param player_data PlayerData --- @param refs table +--- @param e GuiEventData function manager.handle.manager_update_surface(player, player_data, refs, e) - --- @type LuaGuiElement local element = e.element + if not element then return end local i = element.selected_index - local refs = player_data.refs - local surface_id = -1 + ---@type uint? + local surface_id = nil --all surfaces should always be the first entry with an index of 1 if i > 1 then local surface_name = refs.manager_surface_dropdown.get_item(i) local surface = game.get_surface(surface_name) - surface_id = surface.index + if surface then + surface_id = surface.index + end end player_data.search_surface_idx = surface_id diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index c8ee7c7..6f1b4c1 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -56,7 +56,6 @@ end --- @param map_data MapData --- @param player_data PlayerData ---- @return GuiElemDef function stations_tab.build(map_data, player_data, query_limit) local widths = constants.gui["en"] @@ -87,7 +86,7 @@ function stations_tab.build(map_data, player_data, query_limit) goto continue end end - + -- move surface comparison up higher in query to short circuit query earlier if surface doesn't match; this can exclude hundreds of stations instantly in SE if search_surface_idx then if search_surface_idx == -1 then @@ -102,21 +101,21 @@ function stations_tab.build(map_data, player_data, query_limit) if search_network_name ~= station.network_name then goto continue end - local train_flag = get_network_flag(station, station.network_name) + local train_flag = get_network_mask(station, station.network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue end elseif search_network_mask ~= -1 then if station.network_name == NETWORK_EACH then - local masks = station.network_flag--[[@as {}]] - for _, network_flag in pairs(masks) do - if bit32.btest(search_network_mask, network_flag) then + local masks = station.network_mask--[[@as {}]] + for _, network_mask in pairs(masks) do + if bit32.btest(search_network_mask, network_mask) then goto has_match end end goto continue ::has_match:: - elseif not bit32.btest(search_network_mask, station.network_flag) then + elseif not bit32.btest(search_network_mask, station.network_mask) then goto continue end end @@ -222,10 +221,11 @@ function stations_tab.build(map_data, player_data, query_limit) for i, station_id in pairs(stations_sorted) do --- @type Station local station = stations[station_id] - local network_sprite = "utility/close_black" + local network_sprite = "utility/close_black" local network_name = station.network_name - local network_flag = get_network_flag(station, network_name) - if network_name ~= nil then + local network_mask = -1; + if network_name then + network_mask = get_network_mask(station, network_name) network_sprite, _, _ = util.generate_item_references(network_name) end local color = i % 2 == 0 and "dark" or "light" @@ -242,7 +242,7 @@ function stations_tab.build(map_data, player_data, query_limit) }, --templates.status_indicator(widths.stations.status, true), --repurposing status column for network name { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = network_sprite, }, - { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = network_flag }, + { type = "label", style_mods = { width = widths.stations.network_id, horizontal_align = "center" }, caption = network_mask }, templates.small_slot_table(widths.stations, color, "provided_requested"), templates.small_slot_table(widths.stations, color, "shipments"), templates.small_slot_table(widths.stations, color, "control_signals"), @@ -287,17 +287,17 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) local station_comb1 = station.entity_comb1 local station_comb2 = station.entity_comb2 - if not station_entity or not station_entity.valid then - util.error_flying_text(player, { "message.ltnm-error-station-is-invalid" }) - return - end + if not station_entity or not station_entity.valid then + util.error_flying_text(player, { "message.ltnm-error-station-is-invalid" }) + return + end - if e.shift then + if e.shift then if station_entity.surface ~= player.surface then util.error_flying_text(player, { "cybersyn-message.error-cross-surface-camera-invalid" }) else player.zoom_to_world(station_entity.position, 1, station_entity) - + rendering.draw_circle({ color = constants.colors.red.tbl, target = station_entity.position, @@ -311,7 +311,7 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) if not player_data.pinning then util.close_manager_window(player, player_data, refs) end end - elseif e.control then + elseif e.control then if station_comb1 ~= nil and station_comb1.valid then player.opened = station_comb1 else @@ -324,15 +324,15 @@ function stations_tab.handle.open_station_gui(player, player_data, refs, e) else util.error_flying_text(player, { "cybersyn-message.error-station-control-combinator-not-found" }) end - else - player.opened = station_entity - end + else + player.opened = station_entity + end end ---@param player LuaPlayer ---@param player_data PlayerData function stations_tab.handle.on_stations_tab_selected(player, player_data) - player_data.selected_tab = "stations_tab" + player_data.selected_tab = "stations_tab" end gui.add_handlers(stations_tab.handle, stations_tab.wrapper) diff --git a/cybersyn/scripts/gui/trains.lua b/cybersyn/scripts/gui/trains.lua index cc9c850..b8c22c6 100644 --- a/cybersyn/scripts/gui/trains.lua +++ b/cybersyn/scripts/gui/trains.lua @@ -47,7 +47,6 @@ end --- @param map_data MapData --- @param player_data PlayerData ---- @return GuiElemDef function trains_tab.build(map_data, player_data, query_limit) local widths = constants.gui["en"] local refs = player_data.refs @@ -57,7 +56,7 @@ function trains_tab.build(map_data, player_data, query_limit) local search_network_name = player_data.search_network_name local search_network_mask = player_data.search_network_mask local search_surface_idx = player_data.search_surface_idx - + local trains = map_data.trains local trains_sorted = {} @@ -73,29 +72,26 @@ function trains_tab.build(map_data, player_data, query_limit) if search_network_name ~= train.network_name then goto continue end - local train_flag = get_network_flag(train, search_network_name) + local train_flag = get_network_mask(train, search_network_name) if not bit32.btest(search_network_mask, train_flag) then goto continue end elseif search_network_mask ~= -1 then if train.network_name == NETWORK_EACH then - local masks = train.network_flag--[[@as {}]] - for _, network_flag in pairs(masks) do - if bit32.btest(search_network_mask, network_flag) then + local masks = train.network_mask--[[@as {}]] + for _, network_mask in pairs(masks) do + if bit32.btest(search_network_mask, network_mask) then goto has_match end end goto continue ::has_match:: - elseif not bit32.btest(search_network_mask, train.network_flag) then + elseif not bit32.btest(search_network_mask, train.network_mask) then goto continue end end if search_surface_idx then - if search_surface_idx == -1 then - goto has_match - end local entity = get_any_train_entity(train.entity) if not entity then goto continue @@ -103,7 +99,6 @@ function trains_tab.build(map_data, player_data, query_limit) if entity.surface.index ~= search_surface_idx then goto continue end - ::has_match:: end if search_item then @@ -203,70 +198,73 @@ function trains_tab.build(map_data, player_data, query_limit) else locomotive = train_entity.locomotives["back_movers"][1] end - local manifest = {} - if train.manifest ~= nil then - manifest = train.manifest - end + local manifest = train.manifest local network_sprite = "utility/close_black" local network_name = train.network_name - local network_id = train.network_flag + ---@type int? + local network_id = nil if network_name then + if network_name == NETWORK_EACH then + network_id = train.network_mask[search_network_name]--[[@as int?]] + else + network_id = train.network_mask--[[@as int]] + end network_sprite, _, _ = util.generate_item_references(network_name) end local color = idx % 2 == 0 and "dark" or "light" gui.add(scroll_pane, { type = "frame", style = "ltnm_table_row_frame_" .. color, + { + type = "frame", + style = "ltnm_table_inset_frame_" .. color, { - type = "frame", - style = "ltnm_table_inset_frame_" .. color, - { - type = "minimap", - name = "train_minimap", - style = "ltnm_train_minimap", + type = "minimap", + name = "train_minimap", + style = "ltnm_train_minimap", - { type = "label", style = "ltnm_minimap_label", caption = train_id }, - { - type = "button", - style = "ltnm_train_minimap_button", - tooltip = { "cybersyn-gui.open-train-gui" }, - tags = { train_id = train_id }, - handler = trains_tab.handle.open_train_gui, --on_click - }, + { type = "label", style = "ltnm_minimap_label", caption = train_id }, + { + type = "button", + style = "ltnm_train_minimap_button", + tooltip = { "cybersyn-gui.open-train-gui" }, + tags = { train_id = train_id }, + handler = trains_tab.handle.open_train_gui, --on_click }, }, + }, + { + type = "frame", + style = "ltnm_table_row_frame_" .. color, + style_mods = { width = widths.trains.status }, + { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = network_sprite, number = network_id }, + }, + { + type = "label", + style_mods = { width = widths.trains.layout }, + caption = layouts_table[train.layout_id], + }, + { + type = "label", + style_mods = { width = widths.trains.depot }, + caption = depot_name, + }, + { + type = "frame", + name = "shipment_frame", + style = "ltnm_small_slot_table_frame_" .. color, + style_mods = { width = widths.trains.shipment }, { - type = "frame", - style = "ltnm_table_row_frame_" .. color, - style_mods = { width = widths.trains.status }, - { type = "sprite-button", style = "ltnm_small_slot_button_default", enabled = false, sprite = network_sprite, number = network_id }, + type = "table", + name = "shipment_table", + style = "slot_table", + column_count = widths.trains.shipment_columns, + { }, }, - { - type = "label", - style_mods = { width = widths.trains.layout }, - caption = layouts_table[train.layout_id], - }, - { - type = "label", - style_mods = { width = widths.trains.depot }, - caption = depot_name, - }, - { - type = "frame", - name = "shipment_frame", - style = "ltnm_small_slot_table_frame_" .. color, - style_mods = { width = widths.trains.shipment }, - { - type = "table", - name = "shipment_table", - style = "slot_table", - column_count = widths.trains.shipment_columns, - { }, - }, - }, - }, refs) - refs.train_minimap.entity = locomotive - gui.add(refs.shipment_table, util.slot_table_build_from_manifest(manifest, "default")) + }, + }, refs) + refs.train_minimap.entity = locomotive + gui.add(refs.shipment_table, util.slot_table_build_from_manifest(manifest, "default")) end end end @@ -289,17 +287,17 @@ function trains_tab.handle.open_train_gui(player, player_data, refs, e) local train = global.trains[train_id] local train_entity = train.entity - if not train_entity or not train_entity.valid then - util.error_flying_text(gui.player, { "message.ltnm-error-train-is-invalid" }) - return - end + if not train_entity or not train_entity.valid then + util.error_flying_text(player, { "message.ltnm-error-train-is-invalid" }) + return + end train_util.open_gui(player.index, train_entity) end ---@param player LuaPlayer ---@param player_data PlayerData function trains_tab.handle.on_trains_tab_selected(player, player_data) - player_data.selected_tab = "trains_tab" + player_data.selected_tab = "trains_tab" end gui.add_handlers(trains_tab.handle, trains_tab.wrapper) diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index 2728383..6d2bbd8 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -58,7 +58,7 @@ end --- Updates a slot table based on the passed criteria. ---- @param manifest Manifest +--- @param manifest Manifest? --- @param color string --- @return GuiElemDef[] function util.slot_table_build_from_manifest(manifest, color) @@ -138,9 +138,9 @@ function util.slot_table_build_from_deliveries(station) ---@type GuiElemDef[] local children = {} local deliveries = station.deliveries - + for item, count in pairs(deliveries) do - + local sprite, img_path, item_string = util.generate_item_references(item) if sprite ~= nil then local color @@ -182,7 +182,7 @@ function util.slot_table_build_from_control_signals(station) local name = item.name local sprite = "" local color = "default" - if item.type ~= "virtual" then + if item.type ~= "virtual" then goto continue else sprite = "virtual-signal" .. "/" .. name @@ -258,7 +258,7 @@ function util.build_train_layout_table(map_data) end return layouts_table - + end return util diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index 869dcdc..6f7f6c9 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -65,7 +65,7 @@ local function on_refueler_built(map_data, stop, comb) --allows_all_trains = set_refueler_from_comb, --priority = set_refueler_from_comb, --network_name = set_refueler_from_comb, - --network_flag = set_refueler_from_comb, + --network_mask = set_refueler_from_comb, } local id = stop.unit_number--[[@as uint]] map_data.refuelers[id] = refueler @@ -94,7 +94,7 @@ function on_refueler_broken(map_data, refueler_id, refueler) end local f, a if refueler.network_name == NETWORK_EACH then - f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) + f, a = pairs(refueler.network_mask--[[@as {[string]: int}]]) else f, a = once, refueler.network_name end @@ -133,7 +133,7 @@ local function on_station_built(map_data, stop, comb1, comb2) r_threshold = 0, locked_slots = 0, --network_name = set_station_from_comb, - network_flag = 0, + network_mask = 0, wagon_combs = nil, deliveries = {}, accepted_layouts = {}, @@ -752,7 +752,7 @@ local function setup_se_compat() if train.is_available then local f, a if train.network_name == NETWORK_EACH then - f, a = next, train.network_flag + f, a = next, train.network_mask else f, a = once, train.network_name end @@ -836,26 +836,34 @@ local function grab_all_settings() mod_settings.r_threshold = settings.global["cybersyn-request-threshold"].value--[[@as int]] mod_settings.priority = settings.global["cybersyn-priority"].value--[[@as int]] mod_settings.locked_slots = settings.global["cybersyn-locked-slots"].value--[[@as int]] - mod_settings.network_flag = settings.global["cybersyn-network-flag"].value--[[@as int]] + mod_settings.network_mask = settings.global["cybersyn-network-flag"].value--[[@as int]] mod_settings.fuel_threshold = settings.global["cybersyn-fuel-threshold"].value--[[@as double]] mod_settings.warmup_time = settings.global["cybersyn-warmup-time"].value--[[@as double]] mod_settings.stuck_train_time = settings.global["cybersyn-stuck-train-time"].value--[[@as double]] mod_settings.allow_cargo_in_depot = settings.global["cybersyn-allow-cargo-in-depot"].value--[[@as boolean]] mod_settings.invert_sign = settings.global["cybersyn-invert-sign"].value--[[@as boolean]] + mod_settings.manager_ups = settings.global["cybersyn-manager-updates-per-second"].value--[[@as int]] mod_settings.manager_enabled = settings.startup["cybersyn-manager-enabled"].value--[[@as boolean]] - mod_settings.manager_update_rate = settings.startup["cybersyn-manager-update-rate"].value--[[@as int]] +end +local function register_tick() + script.on_nth_tick(nil) + if mod_settings.tps > DELTA then + local nth_tick_main = ceil(60/mod_settings.tps)--[[@as uint]] + script.on_nth_tick(nth_tick_main, function() + tick(global, mod_settings) + end) + end + if mod_settings.manager_enabled and mod_settings.manager_ups > DELTA then + local nth_tick_manager = ceil(60/mod_settings.manager_ups)--[[@as uint]] + script.on_nth_tick(nth_tick_manager, function() + manager.tick(global) + end) + end end local function on_settings_changed(event) grab_all_settings() - if event.setting == "cybersyn-ticks-per-second" then - if mod_settings.tps > DELTA then - local nth_tick = ceil(60/mod_settings.tps)--[[@as uint]]; - script.on_nth_tick(nth_tick, function() - tick(global, mod_settings) - end) - else - script.on_nth_tick(nil) - end + if event.setting == "cybersyn-ticks-per-second" or event.setting == "cybersyn-manager-updates-per-second" then + register_tick() end manager.on_runtime_mod_setting_changed(event) interface_raise_on_mod_settings_changed(event) @@ -912,15 +920,6 @@ local function main() register_gui_actions() - if mod_settings.tps > DELTA then - local nth_tick = ceil(60/mod_settings.tps)--[[@as uint]]; - script.on_nth_tick(nth_tick, function() - tick(global, mod_settings) - end) - else - script.on_nth_tick(nil) - end - local MANAGER_ENABLED = mod_settings.manager_enabled @@ -954,13 +953,10 @@ local function main() script.on_event(defines.events.on_player_removed, manager.on_player_removed) script.on_event(defines.events.on_player_created, manager.on_player_created) script.on_event(defines.events.on_lua_shortcut, manager.on_lua_shortcut) - script.on_event("cybersyn-toggle-gui", manager.on_lua_shortcut) - -- TODO: rework this to work as a per-player runtime setting - script.on_nth_tick(mod_settings.manager_update_rate, function() - manager.tick(global) - end) + script.on_event("cybersyn-toggle-gui", manager.on_lua_shortcut) end + register_tick() end diff --git a/cybersyn/scripts/migrations.lua b/cybersyn/scripts/migrations.lua index 18a194b..3fe4897 100644 --- a/cybersyn/scripts/migrations.lua +++ b/cybersyn/scripts/migrations.lua @@ -295,16 +295,35 @@ local migrations_table = { end end, ["1.2.14"] = function() + ---@type MapData + local map_data = global + manager_gui.on_init() for i, v in pairs(game.players) do manager_gui.on_player_created({player_index = i}) end + + for _, e in pairs(map_data.refuelers) do + e.network_mask = e.network_flag + e.network_flag = nil + end + for _, e in pairs(map_data.stations) do + e.network_mask = e.network_flag + e.network_flag = nil + end + for _, e in pairs(map_data.trains) do + e.network_mask = e.network_flag + e.network_flag = nil + end end, } --STATUS_R_TO_D = 5 ---@param data ConfigurationChangedData function on_config_changed(data) + for i, v in pairs(game.players) do + manager_gui.reset_player(i, v) + end global.tick_state = STATE_INIT global.tick_data = {} flib_migration.on_config_changed(data, migrations_table) diff --git a/cybersyn/scripts/train-events.lua b/cybersyn/scripts/train-events.lua index e20fd14..d4e4521 100644 --- a/cybersyn/scripts/train-events.lua +++ b/cybersyn/scripts/train-events.lua @@ -80,7 +80,7 @@ function add_available_train(map_data, train_id, train) if train.network_name then local f, a if train.network_name == NETWORK_EACH then - f, a = next, train.network_flag + f, a = next, train.network_mask else f, a = once, train.network_name end @@ -121,7 +121,7 @@ function remove_available_train(map_data, train_id, train) train.is_available = nil local f, a if train.network_name == NETWORK_EACH then - f, a = next, train.network_flag + f, a = next, train.network_mask else f, a = once, train.network_name end @@ -195,7 +195,7 @@ local function on_train_arrives_depot(map_data, depot_id, depot, train_entity) --use_any_depot = add_available_train_to_depot, --disable_bypass = add_available_train_to_depot, --network_name = add_available_train_to_depot, - --network_flag = add_available_train_to_depot, + --network_mask = add_available_train_to_depot, --priority = add_available_train_to_depot, }--[[@as Train]] set_train_layout(map_data, train) @@ -311,7 +311,7 @@ local function on_train_leaves_stop(map_data, mod_settings, train_id, train) else local f, a if train.network_name == NETWORK_EACH then - f, a = next, train.network_flag + f, a = next, train.network_mask else f, a = once, train.network_name end @@ -328,9 +328,9 @@ local function on_train_leaves_stop(map_data, mod_settings, train_id, train) else set_refueler_from_comb(map_data, mod_settings, id, refueler) - local refueler_network_flag = get_network_flag(refueler, network_name) - local train_network_flag = get_network_flag(train, network_name) - 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 refueler_network_mask = get_network_mask(refueler, network_name) + local train_network_mask = get_network_mask(train, network_name) + if btest(train_network_mask, refueler_network_mask) and (refueler.allows_all_trains or refueler.accepted_layouts[train.layout_id]) and refueler.trains_total < refueler.entity_stop.trains_limit then if refueler.priority >= best_prior then local t = get_any_train_entity(train.entity) local dist = t and get_dist(t, refueler.entity_stop) or INF diff --git a/cybersyn/settings.lua b/cybersyn/settings.lua index f6c3bd3..1859860 100644 --- a/cybersyn/settings.lua +++ b/cybersyn/settings.lua @@ -104,12 +104,12 @@ data:extend({ }, { type = "int-setting", - name = "cybersyn-manager-update-rate", + name = "cybersyn-manager-updates-per-second", order = "ad", - setting_type = "startup", - default_value = 60, - minimum_value = 1, - maximum_value = 2147483647, + setting_type = "runtime-global", + default_value = 30, + minimum_value = 0, + maximum_value = 60, }, { type = "bool-setting",