diff --git a/cybersyn/changelog.txt b/cybersyn/changelog.txt index f3b7db6..06125b2 100644 --- a/cybersyn/changelog.txt +++ b/cybersyn/changelog.txt @@ -112,7 +112,7 @@ Date: 2022-12-3 Features: - Fixed a bug with SE compat preventing players from joining multiplayer games --------------------------------------------------------------------------------------------------- -Version: 1.0.10 +Version: 1.1.0 Date: 2022-12-5 Features: - Added the ability to use the priority signal as input to optional station control so one can override priority on items with optional station control thresholds diff --git a/cybersyn/info.json b/cybersyn/info.json index 3744a23..c928d5c 100644 --- a/cybersyn/info.json +++ b/cybersyn/info.json @@ -1,6 +1,6 @@ { "name": "cybersyn", - "version": "1.0.10", + "version": "1.1.0", "title": "Project Cybersyn", "author": "Mami", "factorio_version": "1.1", diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index 2502286..5dd482f 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -56,6 +56,7 @@ ---@field public trains_total int ---@field public accepted_layouts {[uint]: true?} ---@field public layout_pattern (0|1|2|3)[]? +---@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 allows_all_trains boolean ---@field public priority int ---@field public network_name string? diff --git a/cybersyn/scripts/layout.lua b/cybersyn/scripts/layout.lua index a04f617..bb0a060 100644 --- a/cybersyn/scripts/layout.lua +++ b/cybersyn/scripts/layout.lua @@ -17,13 +17,19 @@ local function table_compare(t0, t1) return true end +---@param a any[] +---@param i uint local function iterr(a, i) i = i + 1 if i <= #a then - return i, a[#a - i + 1] + local r = a[#a - i + 1] + return i, r + else + return nil, nil end end +---@param a any[] local function irpairs(a) return iterr, a, 0 end @@ -327,20 +333,83 @@ function set_r_wagon_combs(map_data, station, train) end end ----@param map_data MapData ----@param station Station -function unset_wagon_combs(map_data, station) - if not station.wagon_combs then return end - for i, comb in pairs(station.wagon_combs) do +---@param map_data MapData +---@param refueler Refueler +---@param train Train +function set_refueler_combs(map_data, refueler, train) + if not refueler.wagon_combs then return end + local carriages = train.entity.carriages + + local signals = {} + + local is_reversed = get_train_direction(refueler.entity_stop, train.entity) + local ivpairs = is_reversed and irpairs or ipairs + for carriage_i, carriage in ivpairs(carriages) do + ---@type LuaEntity? + local comb = refueler.wagon_combs[carriage_i] + if comb and not comb.valid then + comb = nil + refueler.wagon_combs[carriage_i] = nil + if next(refueler.wagon_combs) == nil then + refueler.wagon_combs = nil + break + end + end + local inv = carriage.get_fuel_inventory() + if inv then + local wagon_signals + if comb then + wagon_signals = {} + local array = carriage.prototype.items_to_place_this + if array then + local a = array[1] + local name + if type(a) == "string" then + name = a + else + name = a.name + end + if game.item_prototypes[name] then + wagon_signals[1] = {index = 1, signal = {type = "item", name = a.name}, count = 1} + end + end + end + for stack_i = 1, #inv do + local stack = inv[stack_i] + if stack.valid_for_read then + if comb then + local i = #wagon_signals + 1 + wagon_signals[i] = {index = i, signal = {type = "item", name = stack.name}, count = stack.count} + end + local j = #signals + 1 + signals[j] = {index = j, signal = {type = "item", name = stack.name}, count = stack.count} + end + end + if comb then + set_combinator_output(map_data, comb, wagon_signals) + end + end + end + + set_combinator_output(map_data, refueler.entity_comb, signals) +end + + +---@param map_data MapData +---@param stop Station|Refueler +function unset_wagon_combs(map_data, stop) + if not stop.wagon_combs then return end + + for i, comb in pairs(stop.wagon_combs) do if comb.valid then set_combinator_output(map_data, comb, nil) else - station.wagon_combs[i] = nil + stop.wagon_combs[i] = nil end end - if next(station.wagon_combs) == nil then - station.wagon_combs = nil + if next(stop.wagon_combs) == nil then + stop.wagon_combs = nil end end @@ -448,7 +517,7 @@ function reset_stop_layout(map_data, stop, is_station_or_refueler, forbidden_ent supports_fluid = true end end - elseif entity.name == COMBINATOR_NAME and is_station_or_refueler then + elseif entity.name == COMBINATOR_NAME then local param = map_data.to_comb_params[entity.unit_number] if param.operation == OPERATION_WAGON_MANIFEST then local pos = entity.position @@ -484,8 +553,14 @@ function reset_stop_layout(map_data, stop, is_station_or_refueler, forbidden_ent end end stop.layout_pattern = layout_pattern - for id, layout in pairs(map_data.layouts) do - stop.accepted_layouts[id] = is_layout_accepted(layout_pattern, layout) or nil + if is_station_or_refueler then + for id, layout in pairs(map_data.layouts) do + stop.accepted_layouts[id] = is_layout_accepted(layout_pattern, layout) or nil + end + else + for id, layout in pairs(map_data.layouts) do + stop.accepted_layouts[id] = is_refuel_layout_accepted(layout_pattern, layout) or nil + end end end diff --git a/cybersyn/scripts/migrations.lua b/cybersyn/scripts/migrations.lua index 5573110..0a3a17e 100644 --- a/cybersyn/scripts/migrations.lua +++ b/cybersyn/scripts/migrations.lua @@ -68,7 +68,7 @@ local migrations_table = { station.update_display = nil end end, - ["1.0.10"] = function() + ["1.1.0"] = function() ---@type MapData local map_data = global map_data.tick_state = STATE_INIT diff --git a/cybersyn/scripts/train-events.lua b/cybersyn/scripts/train-events.lua index cb40ef7..d904e78 100644 --- a/cybersyn/scripts/train-events.lua +++ b/cybersyn/scripts/train-events.lua @@ -248,8 +248,9 @@ end ---@param train Train local function on_train_arrives_refueler(map_data, refueler_id, train_id, train) if train.status == STATUS_TO_F then - --local refueler = map_data.refuelers[refueler_id] + local refueler = map_data.refuelers[refueler_id] train.status = STATUS_F + set_refueler_combs(map_data, refueler, train) end end @@ -357,6 +358,8 @@ local function on_train_leaves_stop(map_data, mod_settings, train_id, train) train.refueler_id = nil refueler.trains_total = refueler.trains_total - 1 add_available_train(map_data, train_id, train) + unset_wagon_combs(map_data, refueler) + set_combinator_output(map_data, refueler.entity_comb, nil) elseif train.status == STATUS_D then --The train is leaving the depot without a manifest, the player likely intervened local depot = map_data.depots[train.parked_at_depot_id--[[@as uint]]]