diff --git a/.luarc.json b/.luarc.json index 7b1d9ce..d672eb8 100644 --- a/.luarc.json +++ b/.luarc.json @@ -26,6 +26,7 @@ "Lua.runtime.special": { "__object_name": "type" }, + "Lua.workspace.checkThirdParty": false, "Lua.workspace.library": [ "~/.steam/steam/steamapps/common/Factorio/data", "~/.steam/steam/steamapps/common/Factorio/data/core/lualib", diff --git a/cybersyn/changelog.txt b/cybersyn/changelog.txt index 14da236..fd9c78d 100644 --- a/cybersyn/changelog.txt +++ b/cybersyn/changelog.txt @@ -3,7 +3,7 @@ Version: 1.1.8 Date: 2022-12-22 Changes: - Fixed depot priority - - Prioritized a train's distance from the provide station over train cargo capacity + - Prioritized a train's distance from the provide station over the train's cargo capacity - Forced provide stations to wait until they can service the highest priority request station - Added more detailed missing train alerts - Provide stations now override request thresholds with the per-item thresholds set by their station info combinator diff --git a/cybersyn/scripts/central-planning.lua b/cybersyn/scripts/central-planning.lua index 6f50ec5..012c8c2 100644 --- a/cybersyn/scripts/central-planning.lua +++ b/cybersyn/scripts/central-planning.lua @@ -24,8 +24,8 @@ function remove_manifest(map_data, station, manifest, sign) end set_comb2(map_data, station) station.deliveries_total = station.deliveries_total - 1 - if station.deliveries_total == 0 and station.display_state >= 2 then - station.display_state = station.display_state - 2 + if station.deliveries_total == 0 and band(station.display_state, 4) > 0 then + station.display_state = station.display_state - 4 update_display(map_data, station) end end @@ -81,12 +81,12 @@ function create_delivery(map_data, r_station_id, p_station_id, train_id, manifes set_comb2(map_data, p_station) set_comb2(map_data, r_station) - if p_station.display_state < 2 then - p_station.display_state = 2 + if band(p_station.display_state, 4) == 0 then + p_station.display_state = p_station.display_state + 4 update_display(map_data, p_station) end - if r_station.display_state < 2 then - r_station.display_state = 2 + if band(r_station.display_state, 4) == 0 then + r_station.display_state = r_station.display_state + 4 update_display(map_data, r_station) end interface_raise_train_status_changed(train_id, old_status, STATUS_TO_P) @@ -225,7 +225,7 @@ local function tick_dispatch(map_data, mod_settings) else for i, id in ipairs(r_stations) do local station = stations[id] - if station and station.display_state%2 == 0 then + if station and band(station.display_state, 1) == 0 then station.display_state = station.display_state + 1 update_display(map_data, station) end @@ -271,7 +271,7 @@ local function tick_dispatch(map_data, mod_settings) if not r_station_i then for _, id in ipairs(r_stations) do local station = stations[id] - if station and station.display_state%2 == 0 then + if station and band(station.display_state, 1) == 0 then station.display_state = station.display_state + 1 update_display(map_data, station) end @@ -405,7 +405,16 @@ local function tick_dispatch(map_data, mod_settings) --this p station should have serviced the current r station, lock it so it can't serve any others --this will lock stations even when the r station manages to find a p station, this not a problem because all stations will be unlocked before it could be an issue table_remove(p_stations, j) + if band(p_station.display_state, 2) == 0 then + p_station.display_state = p_station.display_state + 2 + update_display(map_data, p_station) + end goto p_continue_remove + else + if band(p_station.display_state, 2) == 1 then + p_station.display_state = p_station.display_state - 2 + update_display(map_data, p_station) + end end p_prior = p_station.priority @@ -445,7 +454,7 @@ local function tick_dispatch(map_data, mod_settings) elseif correctness == 4 then send_alert_no_train_matches_p_layout(r_station.entity_stop, closest_to_correct_p_station.entity_stop) end - if r_station.display_state%2 == 0 then + if band(r_station.display_state, 1) == 0 then r_station.display_state = r_station.display_state + 1 update_display(map_data, r_station) end @@ -602,7 +611,7 @@ local function tick_poll_station(map_data, mod_settings) end end end - if is_requesting_nothing and station.display_state%2 == 1 then + if is_requesting_nothing and band(station.display_state, 1) == 1 then station.display_state = station.display_state - 1 update_display(map_data, station) end diff --git a/cybersyn/scripts/factorio-api.lua b/cybersyn/scripts/factorio-api.lua index ce939ef..1ebce55 100644 --- a/cybersyn/scripts/factorio-api.lua +++ b/cybersyn/scripts/factorio-api.lua @@ -313,22 +313,7 @@ function set_refueler_from_comb(map_data, mod_settings, id) local params = get_comb_params(refueler.entity_comb) local bits = params.second_constant or 0 local signal = params.first_signal - - local f, a - if refueler.network_name == NETWORK_EVERY then - f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) - else - f, a = once, refueler.network_name - end - for network_name, _ in f, a do - local network = map_data.to_refuelers[network_name] - if network then - network[id] = nil - if next(network) == nil then - map_data.to_refuelers[network_name] = nil - end - end - end + local old_network = refueler.network_name refueler.network_name = signal and signal.name or nil refueler.allows_all_trains = bit_extract(bits, 2) > 0 @@ -343,29 +328,50 @@ function set_refueler_from_comb(map_data, mod_settings, id) 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 - local item_type = v.signal.type - local item_count = v.count - if item_name then - if item_type == "virtual" then - if item_name == SIGNAL_PRIORITY then - refueler.priority = item_count - elseif refueler.network_name == NETWORK_EVERY then - refueler.network_flag[item_name] = item_count + if signals then + for k, v in pairs(signals) do + local item_name = v.signal.name + local item_type = v.signal.type + local item_count = v.count + if item_name then + if item_type == "virtual" then + if item_name == SIGNAL_PRIORITY then + refueler.priority = item_count + elseif refueler.network_name == NETWORK_EVERY then + refueler.network_flag[item_name] = item_count + end + end + if item_name == refueler.network_name then + refueler.network_flag = item_count end end - if item_name == refueler.network_name then - refueler.network_flag = item_count + end + end + + local f, a + if old_network == NETWORK_EVERY then + f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) + elseif old_network ~= refueler.network_name then + f, a = once, old_network + else + f, a = once, nil + end + for network_name, _ in f, a do + local network = map_data.to_refuelers[network_name] + if network then + network[id] = nil + if next(network) == nil then + map_data.to_refuelers[network_name] = nil end end end if refueler.network_name == NETWORK_EVERY then f, a = pairs(refueler.network_flag--[[@as {[string]: int}]]) - else + elseif old_network ~= refueler.network_name then f, a = once, refueler.network_name + else + f, a = once, nil end for network_name, _ in f, a do local network = map_data.to_refuelers[network_name] @@ -386,9 +392,9 @@ function update_display(map_data, station) local params = control.parameters --NOTE: the following check can cause a bug where the display desyncs if the player changes the operation of the combinator and then changes it back before the mod can notice, however removing it causes a bug where the user's change is overwritten and ignored. Everything's bad we need an event to catch copy-paste by blueprint. if params.operation == MODE_PRIMARY_IO or params.operation == MODE_PRIMARY_IO_ACTIVE or params.operation == MODE_PRIMARY_IO_FAILED_REQUEST then - if station.display_state >= 2 then + if station.display_state >= 4 then params.operation = MODE_PRIMARY_IO_ACTIVE - elseif station.display_state == 1 then + elseif station.display_state >= 1 then params.operation = MODE_PRIMARY_IO_FAILED_REQUEST else params.operation = MODE_PRIMARY_IO diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index 3a8d442..69597c5 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -46,7 +46,7 @@ ---@field public tick_signals {[uint]: Signal}? --transient ---@field public item_p_counts {[string]: int} --transient ---@field public item_thresholds {[string]: int}? --transient ----@field public display_state 0|1|2|3 --low bit is if this station's request has failed, high bit is if a train is heading to this station +---@field public display_state int ---@class Depot ---@field public entity_stop LuaEntity diff --git a/cybersyn/scripts/gui.lua b/cybersyn/scripts/gui.lua index 6edc7f3..753f260 100644 --- a/cybersyn/scripts/gui.lua +++ b/cybersyn/scripts/gui.lua @@ -95,11 +95,11 @@ function gui_opened(comb, player) ---choose-elem-button {type="line", style_mods={top_padding=10}}, {type="label", name="network_label", ref={"network_label"}, style="heading_3_label", caption={"cybersyn-gui.network"}, style_mods={top_padding=8}}, - {type="flow", name="bottom", direction="horizontal", style_mods={vertical_align="center"}, children={ + {type="flow", name="bottom", direction="horizontal", style_mods={vertical_align="center", top_margin=0, top_padding=0}, children={ {type="choose-elem-button", name="network", style="slot_button_in_shallow_frame", ref={"network"}, elem_type="signal", tooltip={"cybersyn-gui.network-tooltip"}, signal=signal, style_mods={bottom_margin=1, right_margin=6}, actions={ on_elem_changed={"choose-elem-button", comb.unit_number} }}, - {type="flow", name="right", direction="vertical", style_mods={horizontal_align="left"}, children={ + {type="flow", name="right", direction="vertical", style_mods={horizontal_align="left", top_margin=0, top_padding=0}, children={ {type="flow", name="allow_list", direction="horizontal", style_mods={vertical_align="center"}, children={ {type="checkbox", name="allow_list", ref={"allow_list"}, state=allow_list, tooltip={"cybersyn-gui.allow-list-tooltip"}, actions={ on_checked_state_changed={"allow_list", comb.unit_number} diff --git a/cybersyn/scripts/migrations.lua b/cybersyn/scripts/migrations.lua index 9e66fad..7329a30 100644 --- a/cybersyn/scripts/migrations.lua +++ b/cybersyn/scripts/migrations.lua @@ -134,6 +134,9 @@ local migrations_table = { control.parameters = params end + for id, station in pairs(map_data.stations) do + station.display_state = (station.display_state >= 2 and 4) + station.display_state%2 + end end, } --STATUS_R_TO_D = 5