Market Selector Combinator

by Bulter

Market selector, build your supermarket in one step

Utilities
7 hours ago
2.1
7
Circuit network
Owner:
Bulter
Source:
https://github.com/Bulter1996/market_...
Homepage:
https://github.com/Bulter1996/market_...
License:
MIT
Created:
a day ago
Latest Version:
1.0.0 (7 hours ago)
Factorio version:
2.1
Downloaded by:
7 users

Market Selector Combinator

适用于 Factorio 2.1 的脚本型选择运算器。

使用

  1. 研究“电路网络”,制造并放置“超市选择运算器”。
  2. 在输入端连接所需的红线或绿线;不同模式对输入信号的定义见下文。
  3. 点击运算器,选择“生产订单”“超市订单”或“配方查询”模式,再填写当前模式的参数。
  4. 从输出端读取结果;红线和绿线均可使用。

默认每 30 tick 更新一次,仅处理正数物品需求;刷新间隔可在启动设置中调整。生产订单同一时刻只会选择一个产品:产品库存低于基础订单量,并且每种配方原料库存严格大于 单份用量 × 材料需求倍率 时,启动并锁定该请求;锁定后直到产品库存达到 订单量 × (1 + 额外可生产倍率),或任一种原料库存严格小于 单份用量 × 原料保留倍率 时,才释放并选择下一个产品。产品输出数量实时使用 订单量 × (1 + 额外可生产倍率) - 当前库存,原料输出数量按实际产品缺口向上取整到完整配方批次;材料需求倍率只用于启动校验。两组不同的启动、停止阈值共同提供迟滞空间。

配方选择仅考虑当前势力已由科技解锁且所选机器可制造的配方;优先使用主产品匹配或与物品同名的配方。

“超市订单”会把绿线需求与红线库存的差额按配方逐层展开。每台生产机器首次使用时会建立共享的产品能力和材料层级索引;每个运算器在订单或库存输入变化时一次性生成各递归深度的输出表,调整深度时直接读取对应结果。只要所选机器存在可用配方且尚未达到递归深度上限,就继续把完整配方需求展开到下一层。没有可用配方或遇到循环配方的终端材料会按所在层级单独累计,并与当前深度边界材料合并,增加深度时不会遗漏此前已经终止的基础材料。输出按递归层级降序排列并优先选择最底层缺口;当某层材料库存满足后,会输出可以开始合成的上一层产品,逐步推进到最终订单。递归深度为 0 时仍表示不限制层数。单项输出模式下,“顺序制作”默认为“是”,只计算第一个库存未满足的订单,完成后再处理下一个;设为“否”时会同时计算全部订单。

“配方查询”不区分红绿输入,将输入物品视为待查询产品,并输出所选机器能够制造该产品所需的直接原料;查询不受科技解锁状态限制。关闭“多配方支持”时,只查询稳定排序后的第一个正数输入并按一份配方输出;开启后,会合并全部正数输入,按产品数量向上取整到完整制造次数并汇总原料。找不到配方的输入不会产生输出。

代码结构

  • control.lua:运行阶段入口,处理实体生命周期、电路信号、生产订单与超市订单算法,以及事件分发。
  • scripts/modes/:各操作模式彼此独立的计算模块。
  • scripts/gui.lua:独立 GUI 模块,只负责窗口创建、参数区域显隐、连接状态刷新和关闭行为;不直接读取 storage,也不参与生产计算。

代码中的 ---@param---@return 是 Lua Language Server 可识别的类型注释;普通中文注释会进一步解释对应 Factorio API 的用途和采用该设计的原因。

选择运算器本体的图标层会展示当前锁定的待生产产品;当前没有待生产产品时显示问号。图标使用独立渲染层,不会写入线路。