From a3a226886fc9a157d51878c068eb294d4f20918f Mon Sep 17 00:00:00 2001 From: Tetlanesh Date: Tue, 22 Oct 2024 19:30:16 +0200 Subject: [PATCH 1/6] updated the changelog --- cybersyn/changelog.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cybersyn/changelog.txt b/cybersyn/changelog.txt index ba999b2..abf8a18 100644 --- a/cybersyn/changelog.txt +++ b/cybersyn/changelog.txt @@ -1,4 +1,8 @@ --------------------------------------------------------------------------------------------------- +Version: 2.0.1 + Bugfixes: + - Migrate the get_rail_segment_entity function call that no longer exists in 2.0 +--------------------------------------------------------------------------------------------------- Version: 2.0.0 Changes: - Initial version of 2.0 compatibility From b46f7b209a85b50fe0f286239f735538c7611e68 Mon Sep 17 00:00:00 2001 From: Tetlanesh Date: Tue, 22 Oct 2024 19:36:36 +0200 Subject: [PATCH 2/6] bump version --- cybersyn/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cybersyn/info.json b/cybersyn/info.json index 36a6f2d..6fe5248 100644 --- a/cybersyn/info.json +++ b/cybersyn/info.json @@ -1,6 +1,6 @@ { "name": "cybersyn", - "version": "2.0.0", + "version": "2.0.1", "title": "Project Cybersyn", "author": "Mami", "factorio_version": "2.0", From dc4f82a5137f76e7056aa4d855d60cbc93c880bd Mon Sep 17 00:00:00 2001 From: Harag Date: Tue, 22 Oct 2024 19:48:57 +0200 Subject: [PATCH 3/6] quality must be set from deliveries Circuit network signals can only have exact qualities and can only set exact filters on inserters. Ultimately this means Cybersyn must handle each quality separately. For now the quality is hardcoded to comparator "=", quality "normal". Cybercyn's output constant combinators won't send signals otherwise. --- cybersyn/scripts/factorio-api.lua | 39 +++------------------------- cybersyn/scripts/global.lua | 1 + cybersyn/scripts/layout.lua | 42 ++++++++++++------------------- cybersyn/scripts/train-events.lua | 2 +- 4 files changed, 22 insertions(+), 62 deletions(-) diff --git a/cybersyn/scripts/factorio-api.lua b/cybersyn/scripts/factorio-api.lua index 005fbfc..bb710af 100644 --- a/cybersyn/scripts/factorio-api.lua +++ b/cybersyn/scripts/factorio-api.lua @@ -689,40 +689,8 @@ end function set_combinator_output(map_data, comb, signals) local out = map_data.to_output[comb.unit_number] if out.valid then - --out.get_or_create_control_behavior().parameters = signals - local constBehaviour = out.get_or_create_control_behavior() - - if constBehaviour.sections == nil or constBehaviour.sections_count == 0 then - constBehaviour.add_section() - end - - if constBehaviour.sections and constBehaviour.sections_count > 0 then - if constBehaviour.sections_count > 1 then - --only the default section, messy but whatever - local i = 1 - for _,v in pairs(constBehaviour.sections) do - if i ~= 1 then - constBehaviour.removeSection(i) - end - i = i + 1 - end - end - - local primarySection = constBehaviour.get_section(1) - local filters = {} - if signals ~= nil then - for _,v in pairs(signals) do - local filt = { - type = v.signal.type, - name = v.signal.name, - quality = nil, - comparator = nil - } - table.insert(filters, filt) - end - end - primarySection.filters = filters - end + -- out is a non-interactable, invisible combinator whiche means players cannot change the number of sections + out.get_or_create_control_behavior().get_section(1).filters = signals or {} end end @@ -757,7 +725,8 @@ function set_comb2(map_data, station) for item_name, count in pairs(deliveries) do local i = #signals + 1 local is_fluid = prototypes.item[item_name] == nil--NOTE: this is expensive - signals[i] = {index = i, signal = {type = is_fluid and "fluid" or "item", name = item_name}, count = sign*count} + -- FIXME: the circuit network can only carry exact qualities, so deliveries must provide each quality separately + signals[i] = {value = {type = is_fluid and "fluid" or "item", name = item_name, quality = "normal", comparator = "="}, min = sign*count} -- constant combinator cannot have quality = nil (any) end set_combinator_output(map_data, station.entity_comb2, signals) end diff --git a/cybersyn/scripts/global.lua b/cybersyn/scripts/global.lua index fd49746..4cdecbc 100644 --- a/cybersyn/scripts/global.lua +++ b/cybersyn/scripts/global.lua @@ -102,6 +102,7 @@ ---@class ManifestEntry ---@field public type string ---@field public name string +---@field public quality string ---@field public count int ---@class Economy diff --git a/cybersyn/scripts/layout.lua b/cybersyn/scripts/layout.lua index 5d44a4b..f9eab52 100644 --- a/cybersyn/scripts/layout.lua +++ b/cybersyn/scripts/layout.lua @@ -228,7 +228,8 @@ function set_p_wagon_combs(map_data, station, train) local count_to_fill = min(item_slots_capacity*stack_size, item_count) local slots_to_fill = ceil(count_to_fill/stack_size) - signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = sign*count_to_fill} + -- FIXME: quality any for now, should match the delivery + signals[i] = {value = {type = item.type, name = item.name}, min = sign*count_to_fill} item_count = item_count - count_to_fill item_slots_capacity = item_slots_capacity - slots_to_fill if comb then @@ -323,7 +324,8 @@ function set_r_wagon_combs(map_data, station, train) local stack = inv[stack_i] if stack.valid_for_read then local i = #signals + 1 - signals[i] = {index = i, signal = {type = "item", name = stack.name}, count = sign*stack.count} + -- FIXME item stacks have quality + signals[i] = {value = {type = "item", name = stack.name, quality = "normal", comparator = "="}, min = sign*stack.count} end end set_combinator_output(map_data, comb, signals) @@ -334,7 +336,8 @@ function set_r_wagon_combs(map_data, station, train) local inv = carriage.get_fluid_contents() for fluid_name, count in pairs(inv) do local i = #signals + 1 - signals[i] = {index = i, signal = {type = "fluid", name = fluid_name}, count = sign*floor(count)} + -- FIXME ? pump conditions can have quality (but why? fluids can only be produced at normal quality and pump filters ignore quality) + signals[i] = {value = {type = "fluid", name = fluid_name, quality = "normal", comparator = "="}, min = sign*floor(count)} end set_combinator_output(map_data, comb, signals) end @@ -388,10 +391,12 @@ function set_refueler_combs(map_data, refueler, train) 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} + -- FIXME fuel items can have quality which improves acceleration and top speed (but not fuel value) + wagon_signals[i] = {value = {type = "item", name = stack.name, quality = "normal", comparator = "="}, min = stack.count} end local j = #signals + 1 - signals[j] = {index = j, signal = {type = "item", name = stack.name}, count = stack.count} + -- FIXME fuel items can have quality which improves acceleration and top speed (but not fuel value) + signals[j] = {value = {type = "item", name = stack.name, quality = "normal", comparator = "="}, min = stack.count} end end if comb then @@ -650,27 +655,12 @@ end function update_stop_from_rail(map_data, rail, forbidden_entity, force) --NOTE: is this a correct way to figure out the direction? ---@type LuaEntity? - local rail_front = rail - ---@type LuaEntity? - local rail_back = rail - ---@type defines.rail_direction - for i = 1, 112 do - if rail_back then - local entity = rail_back.get_rail_segment_signal(defines_back, false) - if entity and entity.name == "train-stop" then - resolve_update_stop_from_rail(map_data, entity, forbidden_entity, force) - return - end - rail_back = rail_back.get_connected_rail({rail_direction = defines_back, rail_connection_direction = defines_straight}) - end - if rail_front then - local entity = rail_front.get_rail_segment_signal(defines_front, false) - if entity and entity.name == "train-stop" then - resolve_update_stop_from_rail(map_data, entity, forbidden_entity, force) - return - end - rail_front = rail_front.get_connected_rail({rail_direction = defines_front, rail_connection_direction = defines_straight}) - end + local stop = rail.get_rail_segment_stop(defines_front) + if not stop then + stop = rail.get_rail_segment_stop(defines_back) + end + if stop then + resolve_update_stop_from_rail(map_data, stop, forbidden_entity, force) end end diff --git a/cybersyn/scripts/train-events.lua b/cybersyn/scripts/train-events.lua index 05e61bd..97b7fce 100644 --- a/cybersyn/scripts/train-events.lua +++ b/cybersyn/scripts/train-events.lua @@ -13,7 +13,7 @@ local function set_comb1(map_data, station, manifest, sign) if manifest then local signals = {} for i, item in ipairs(manifest) do - signals[i] = {index = i, signal = {type = item.type, name = item.name}, count = sign*item.count} + signals[i] = {value = {type = item.type, name = item.name, quality = item.quality or "normal", comparator = "="}, min = sign*item.count} end set_combinator_output(map_data, comb, signals) else From 25284a85868c4f6474d449ccc37c0b4a25a105f5 Mon Sep 17 00:00:00 2001 From: Harag Date: Tue, 22 Oct 2024 19:50:10 +0200 Subject: [PATCH 4/6] identify code locations that need to handle signal quality --- cybersyn/scripts/central-planning.lua | 2 ++ cybersyn/scripts/gui/inventory.lua | 2 ++ cybersyn/scripts/gui/stations.lua | 1 + cybersyn/scripts/gui/util.lua | 2 ++ 4 files changed, 7 insertions(+) diff --git a/cybersyn/scripts/central-planning.lua b/cybersyn/scripts/central-planning.lua index 37d6617..1ec8631 100644 --- a/cybersyn/scripts/central-planning.lua +++ b/cybersyn/scripts/central-planning.lua @@ -588,6 +588,7 @@ local function tick_poll_station(map_data, mod_settings) local item_name = v.signal.name local item_count = v.count local item_type = v.signal.type + -- FIXME handle v.signal.quality if item_name then if item_type == "virtual" then if item_name == SIGNAL_PRIORITY then @@ -605,6 +606,7 @@ local function tick_poll_station(map_data, mod_settings) local item_name = v.signal.name local item_count = v.count local item_type = v.signal.type + -- FIXME handle v.signal.quality if item_name then if item_type == "virtual" then if item_name == SIGNAL_PRIORITY then diff --git a/cybersyn/scripts/gui/inventory.lua b/cybersyn/scripts/gui/inventory.lua index 5d00166..4ff947c 100644 --- a/cybersyn/scripts/gui/inventory.lua +++ b/cybersyn/scripts/gui/inventory.lua @@ -100,6 +100,7 @@ function inventory_tab.build(map_data, player_data) if comb1_signals then for _, signal_ID in pairs(comb1_signals) do local item = signal_ID.signal.name + -- FIXME handle signal_ID.signal.quality if item then if item == search_item then goto has_match @@ -136,6 +137,7 @@ function inventory_tab.build(map_data, player_data) if station.is_stack and item_type == "item" then r_threshold = r_threshold*get_stack_size(map_data, item.name) end + -- FIXME handle v.signal.quality if -count >= r_threshold then if inventory_requested[item.name] == nil then diff --git a/cybersyn/scripts/gui/stations.lua b/cybersyn/scripts/gui/stations.lua index 128a972..c322705 100644 --- a/cybersyn/scripts/gui/stations.lua +++ b/cybersyn/scripts/gui/stations.lua @@ -133,6 +133,7 @@ function stations_tab.build(map_data, player_data, query_limit) if comb1_signals then for _, signal_ID in pairs(comb1_signals) do local item = signal_ID.signal.name + -- FIXME handle signal_ID.signal.quality if item then if item == search_item then goto has_match diff --git a/cybersyn/scripts/gui/util.lua b/cybersyn/scripts/gui/util.lua index e75ed0f..b929733 100644 --- a/cybersyn/scripts/gui/util.lua +++ b/cybersyn/scripts/gui/util.lua @@ -104,6 +104,7 @@ function util.slot_table_build_from_station(station) end local count = v.count local name = item.name + -- FIXME handle item.quality local sprite, img_path, item_string = util.generate_item_references(name) if sprite ~= nil then local color @@ -181,6 +182,7 @@ function util.slot_table_build_from_control_signals(station, map_data) local item = v.signal local count = v.count local name = item.name + -- FIXME handle item.quality local sprite = "" local color = "default" if item.type ~= "virtual" then From a28e0e2e8ebf039796b89051bee10c47ab4dd31b Mon Sep 17 00:00:00 2001 From: Harag Date: Tue, 22 Oct 2024 19:51:13 +0200 Subject: [PATCH 5/6] the constant combinator must connect to the cybersyn output, not input --- cybersyn/scripts/main.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cybersyn/scripts/main.lua b/cybersyn/scripts/main.lua index 20def80..29ec2bf 100644 --- a/cybersyn/scripts/main.lua +++ b/cybersyn/scripts/main.lua @@ -259,11 +259,13 @@ local function on_combinator_built(map_data, comb) force = comb.force }) assert(out, "cybersyn: could not spawn combinator controller") - local wireConnectorRed = comb.get_wire_connector(defines.wire_connector_id.circuit_red, true) - local wireConnectorGreen = comb.get_wire_connector(defines.wire_connector_id.circuit_green, true) + local comb_red = comb.get_wire_connector(defines.wire_connector_id.combinator_output_red, true) + local out_red = out.get_wire_connector(defines.wire_connector_id.circuit_red, true) + out_red.connect_to(comb_red, false, defines.wire_origin.script) - wireConnectorRed.connect_to(out.get_wire_connector(defines.wire_connector_id.circuit_red, true)) - wireConnectorGreen.connect_to(out.get_wire_connector(defines.wire_connector_id.circuit_green, true)) + local comb_green = comb.get_wire_connector(defines.wire_connector_id.combinator_output_green, true) + local out_green = out.get_wire_connector(defines.wire_connector_id.circuit_green, true) + out_green.connect_to(comb_green, false, defines.wire_origin.script) local control = get_comb_control(comb) local params = control.parameters From cdbb3f5db73456c65cb97a16984d00b5062f6734 Mon Sep 17 00:00:00 2001 From: Tetlanesh Date: Tue, 22 Oct 2024 21:35:54 +0200 Subject: [PATCH 6/6] bump version and added changelog --- cybersyn/changelog.txt | 5 +++++ cybersyn/info.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cybersyn/changelog.txt b/cybersyn/changelog.txt index abf8a18..8a3a4a4 100644 --- a/cybersyn/changelog.txt +++ b/cybersyn/changelog.txt @@ -1,4 +1,9 @@ --------------------------------------------------------------------------------------------------- +Version: 2.0.2 + Changes: + - Refactored quality handling + - Initial update of the LTN GUI for 2.0 +--------------------------------------------------------------------------------------------------- Version: 2.0.1 Bugfixes: - Migrate the get_rail_segment_entity function call that no longer exists in 2.0 diff --git a/cybersyn/info.json b/cybersyn/info.json index 6fe5248..c28a7e4 100644 --- a/cybersyn/info.json +++ b/cybersyn/info.json @@ -1,6 +1,6 @@ { "name": "cybersyn", - "version": "2.0.1", + "version": "2.0.2", "title": "Project Cybersyn", "author": "Mami", "factorio_version": "2.0",