JSON模组教程-生产方块与电力方块

来自Mindustry中文wiki

生产方块与电力方块

这一节把“资源从哪里来、能量怎么供”讲清楚。生产方块负责把地板资源或输入材料变成可用产出;电力方块负责发电、传输和存储。JSON 可以完整配置字段,但具体工作逻辑仍以 Java 实现为准,所以看到字段时要理解它们在运行时的含义。

钻头与开采逻辑

Drill 是最常见的钻头类型,像“机械钻头”“气动钻头”“激光钻头”“爆破钻头”这一条线都属于它。钻头的核心逻辑是“确定主矿 → 累积进度 → 产出并尝试卸载”。当钻头覆盖多个矿物时,它会统计占地范围内每种矿物的数量,选出“主矿”,并把该矿的数量记为 dominantItems。这个数量会被乘入速度计算,所以 2x2、3x3 钻头在不同地形上实际产速会不同。

钻速由 drillTimehardnessDrillMultiplierdrillMultipliers 决定。drillTime 是“基础挖出一个物品所需的刻数”,hardnessDrillMultiplier 把矿物硬度叠加到耗时上,drillMultipliers 则是“按物品类型的速度倍率”。它们一起决定单个物品的基础耗时:

( drillTime + hardnessDrillMultiplier * 物品硬度 ) / drillMultipliers[item]

tier 决定最大可采硬度,blockedItem/blockedItems 可以禁采指定物品。如果主矿硬度超过 tier 或在禁采列表里,dominantItem 会为空,钻头就不会工作。itemCapacity 决定内部缓冲容量,items.total() 满了就会停机,即使外部传送带仍有空间也不会继续挖。钻头会定期尝试 dump() 把主矿卸到相邻建筑或传送带上,所以传送带堵住时你会看到钻头“停在满格”。

液体加速由 liquidBoostIntensity 与消耗器上的 booster 配合决定。如果你在 consumes 里写了液体消耗器并标记为 booster,钻头会按 optionalEfficiency 把速度从 1 线性插值到 liquidBoostIntensity。若再配合 optional: true,就能做到“没有液体也能挖,但更慢”的效果。这个机制非常适合做“可选加速”而不是“必须液体”。

BurstDrill 是“爆发式钻头”,它依然继承 Drill,但把 hardnessDrillMultiplier 设为 0 并使用独立的速度曲线,所以硬度不再影响速度,进度会呈现“蓄力→爆发”的节奏。BeamDrill 用于挖墙体矿,例如“等离子钻机”“大型等离子钻机”就是这一类;其关键字段是 rangetierdrillTimeoptionalBoostIntensityWallCrafter 则是“凿墙机”,兼具钻头输出与属性加成,适合做“固定产出”的墙体采集方块。

为了帮助你理解硬度梯度,这里给出原版的粗略对照(仅用于理解关系,实际数值以原版为准):

资源 钻头 矿机 硬度
“沙”、“废料”、“石墨” 0
“铜”、“铅” “独影”、“阿尔法”、“贝塔” 1
“煤炭” “机械钻头” “恒星”、“幻型”、“伽马” 2
“钛”、“铍” “气动钻头”、“等离子钻机” “耀星”、“巨像”、“苏醒”、“策动”、“发散” 3
“钍” “激光钻头” 4
“钨” “爆破钻头”、“大型等离子钻机” 5
“冲击钻头” 6
“爆裂钻头” 7

下面是一个最小的钻头示例。它使用 Drill 类型,设置 tierdrillTime,并通过 consumes.liquid 让“水”作为加速液体使用:

文件:content/blocks/tutorial-drill.json

{
    "type": "Drill",
    "name": "示例钻头",
    "description": "慢速钻头,用于演示。",
    "size": 2,
    "tier": 2,
    "drillTime": 300,
    "liquidBoostIntensity": 1.6,
    "requirements": [
        "copper/50",
        "lead/30"
    ],
    "consumes": {
        "liquid": {
            "liquid": "water",
            "amount": 0.05,
            "booster": true
        }
    }
}

这个例子中,drillTime 决定基础耗时,tier 决定可采硬度,liquidBoostIntensitybooster 组合决定加速效果。实际速度还会受到被采矿物硬度与 drillMultipliers 的影响。

钻头贴图方面,多数钻头需要三张贴图:-rotator-top、本体。额外效果(如光环、物品显示)会要求 -rim-item。贴图命名规则与 Java 教程一致,建议先复刻原版的贴图结构再做改动。

钻头还有一组更偏“表现”的字段。drillEffect 会在产出物品时触发,updateEffect/updateEffectChance 控制运转时的粒子与频率,rotateSpeedwarmupSpeed 只影响动画速率,不直接改变真实产量。这些字段的意义是“让玩家感受到强度差异”,尤其是高阶钻头,哪怕数值已经很快了,如果缺少足够的视觉节奏,也会显得“像普通钻头”。

模组示例:饱和火力 3.3.0 的钻头

“饱和火力 3.3.0”里的“离子钻头”是一个很典型的“高阶钻头”示例。它把 hardnessDrillMultiplier 拉低、drillTime 拉短,同时用 consumes.liquid 配置了可选加速液体。你可以看到它把液体消耗写成对象,并开启了 optionalbooster,这意味着没水也能挖,有水更快:

{
    "type": "Drill",
    "name": "离子钻头",
    "size": 3,
    "tier": 8,
    "drillTime": 50,
    "hardnessDrillMultiplier": 40,
    "liquidBoostIntensity": 1.6,
    "consumes": {
        "power": 3,
        "liquid": {
            "liquid": "water",
            "amount": 0.11,
            "booster": true,
            "optional": true
        }
    }
}

这个片段能很好地说明“可选加速”的写法。如果你希望玩家在早期也能用钻头,但在中后期通过管网提升效率,这种配置非常合适。

泵与液体产出

泵类方块负责把液体“从地板抽进管网”。Pump 直接读取地板的 liquidDrop,适合放在“水”“矿渣”等液体地面上。SolidPump 则是在固态地板上“产出”指定液体,对应原版的“抽水机”。Fracker 对应原版“石油钻井”,本质上是 SolidPump 的子类,但增加了物品消耗与 itemUseTime,即“每消耗一次物品,可维持产出一段时间”。

泵的关键字段通常是 pumpAmount(每刻抽取量)、result(输出的液体类型)、attributebaseEfficiency(属性加成与基础效率)。如果泵需要物品或电力,仍然通过 consumes 来配置。地板本身也会影响泵的产出,例如液体地板的 liquidMultiplier 会影响抽取量,深水地面通常比浅水更高效。

文件:content/blocks/tutorial-solid-pump.json

{
    "type": "SolidPump",
    "name": "示例抽水机",
    "description": "在固态地面产出水。",
    "size": 2,
    "result": "water",
    "pumpAmount": 0.12,
    "requirements": [
        "copper/60",
        "lead/40"
    ],
    "consumes": {
        "power": 1.1
    }
}

这个例子里,pumpAmount 是每刻产液量,result 指向产出的液体,consumes.power 让它成为用电设备。若你想让地形属性影响效率,给 attributebaseEfficiency 赋值即可。

模组示例:饱和火力 3.3.0 的泵

“潮汐泵”是一个典型的高吞吐液体泵。它把 pumpAmount 设得很高,并给了极大的 liquidCapacity,适合做“集中供液”节点。它还使用了自定义 DrawMulti 绘制器来叠加液体与本体,体现了“产量大但体积也大”的定位。

{
    "type": "Pump",
    "name": "潮汐泵",
    "size": 4,
    "liquidCapacity": 800,
    "pumpAmount": 1,
    "consumes": {
        "power": 12
    }
}

这个片段的关键是 liquidCapacitypumpAmount 的组合。前者决定缓冲,后者决定流量,若你只提升流量却不提升容量,泵会更容易“满溢停机”。

高吞吐泵还有一个常见误区:pumpAmount 增长得太快,而 liquidCapacity 和管网带宽跟不上,会导致“满了就停、停了就满”的节奏抖动,实际平均流量反而不高。设计时最好把“泵本体容量”和“管道最大流量”一并考虑,避免玩家在布局上被迫堆很多缓冲罐来补救。

模组示例:饱和火力 3.3.0 的石油深井

“石油深井”使用 SolidPump 并明确指定了 attributebaseEfficiency,用来强调“地形属性决定效率”的机制。它在含油属性的地形上更高效,而在普通地面上仍能维持一定产出:

{
    "type": "SolidPump",
    "name": "石油深井",
    "pumpAmount": 0.201,
    "result": "oil",
    "attribute": "oil",
    "baseEfficiency": 0.75,
    "consumes": {
        "power": 6.5
    }
}

这个配置能直观体现“选址”的价值:地形好坏并不会决定能不能用,而是决定“值不值得用”。这也是生产方块平衡里最常见的设计思路之一。

属性系统与效率

属性(Attribute)是生产方块的重要基础机制。它用于描述地形对生产效率的影响,例如“热能”属性影响“热能发电机”,水属性影响某些生产方块。AttributeCrafterSolidPumpThermalGenerator 等方块都会读取 attributebaseEfficiency 来计算最终效率。若 baseEfficiency 为 0,方块几乎完全依赖属性;若 baseEfficiency 较高,则地形只起到加成作用。这个机制常用于做“特定地形更高效”的方块,也用于提醒玩家选址。

电力系统与发电逻辑

电力系统由发电、传输、存储三部分构成。发电方块大多继承自 PowerGenerator,核心字段是 powerProduction。实际发电量会乘以 productionEfficiency,而效率会受到输入不足、环境属性不足等因素影响。ConsumeGenerator 是最常见的消耗型发电机,它用 itemDuration 表示“一个物品能维持多少刻的发电”。因此 itemDuration 越大,单个燃料持续时间越长,发电越稳定。

itemFlammableitemExplosiveitemRadioactive 等筛选消耗器会根据物品属性自动评估效率。例如“火力发电机”会偏好高可燃性物品,“RTG 发电机”则看重放射性。itemDurationMultipliers 可以对某些物品做额外倍率调整,适合做“特殊燃料”。ConsumeGenerator 还支持 outputLiquidexplodeOnFull,可以在发电的同时产出液体,或者在液体堆满时爆炸(比如用来模拟高压风险)。

如果你希望发电机“有副产物”,outputLiquid 是最直接的做法。它会把液体写进发电机的内部储罐,并像普通液体方块一样尝试向外输出。当外部管网堵塞,发电机会因为液体满而降效甚至停机,这点和生产方块的“物品缓冲”非常相似。设计时要么加大 liquidCapacity 来缓冲,要么把 outputLiquid 设得较小,以免发电机在战斗或波次高峰时因为管网挤压而掉电。

“热能发电机”属于 ThermalGenerator,它会读取地板属性(默认是热量)并计算 productionEfficiencyminEfficiency 控制最低可放置要求,displayEfficiencydisplayEfficiencyScale 决定建造时显示的效率文本。类似的还有“太阳能板”(SolarGenerator),它的输出会受到光照强度影响。

电网传输依赖 PowerNode 系列方块,laserRange 决定连接范围,maxNodes 决定最多能连多少个节点,autolink 控制是否自动连线。存储则由 Battery 系列方块承担,powerCapacity 决定储能上限。原版中常见的例子包括“电力节点”“大型电力节点”“电池”“大型电池”。如果你发现发电充足但设备仍提示缺电,多半是电网断开或储能不足导致的能量“波动”。

模组示例:饱和火力 3.3.0 的发电机

“增压励磁发电站”使用了 ConsumeGenerator 并同时消耗可燃物与液体。它把 itemDuration 设得很短,强调高频消耗、高峰值输出,并通过 DrawMulti 叠加多个旋转贴图来表现高速运转。下面是其核心字段节选:

{
    "type": "ConsumeGenerator",
    "name": "增压励磁发电站",
    "size": 3,
    "itemDuration": 15,
    "powerProduction": 38.5,
    "consumes": {
        "itemFlammable": {},
        "itemExplode": {},
        "liquid": "water/0.6"
    }
}

这个例子展示了“多种筛选消耗器 + 液体输入”的组合。对于想做“高风险高收益”发电机的设计者来说,它提供了一个很好的参考模板。

模组示例:饱和火力 3.3.0 的弧形裂变堆

“弧形裂变堆”展示了“高能燃料 + 高级液体”的组合思路。它使用 itemRadioactiveitemExplode 来筛选燃料,再用液体维持稳定输出,同时在 drawer 里用多层 DrawArcSmelt 叠加出高能反应的视觉效果:

{
    "type": "ConsumeGenerator",
    "name": "弧形裂变堆",
    "itemDuration": 19.5,
    "powerProduction": 550,
    "consumes": {
        "itemRadioactive": {},
        "itemExplode": {},
        "liquid": "纳米流体/0.9"
    },
    "generateEffect": "generatespark"
}

它的意义不是“又一个发电机”,而是提供“高风险燃料 + 高级液体”的经济消耗路线。如果你的模组有稀缺液体或高阶燃料,类似设计能让这些资源有明确的战略价值。

产量、节奏与平衡的直觉

设计生产方块时,最容易忽略的是“节奏感”。drillTimeitemDurationcraftTime 等字段不仅决定效率,还决定玩家对这条生产线的体感节奏。比如“爆破钻头”和“冲击钻头”就属于明显“慢—快—慢”的节奏,这会迫使玩家建立更大的缓冲与运输。相反,像“机械钻头”这种稳定输出更适合做“基础供给”。当你为模组设计新钻头时,不妨先想清楚它要服务哪一类生产链,再决定输出节奏。

电力也有类似的节奏。powerProduction 的单位是“每刻发电量”,游戏面板会按每秒显示,因此一个 powerProduction = 1 的发电机,在面板上会看到 60 的发电速率。发电机与耗电设备之间的“峰值错位”往往来自储能不足,而不是发电不足。如果你的系统在启动时经常掉电,可能需要的是更多“电池”而不是更多发电机。

消耗型发电机的平衡点在于“燃料密度”。itemDuration 越长,单个物品的发电时间越久,但这也会让玩家更依赖高价值燃料;itemDuration 越短,发电更“灵敏”,但运输压力更大。你可以通过 itemDurationMultipliers 做“特殊燃料”,让某些物品成为“高能燃料”,同时保持普通燃料的基础效率,这样既能控制经济,又能让玩家有明确的升级目标。

属性型方块的平衡点在于“选址与收益”。如果 baseEfficiency 设得太高,属性加成就毫无意义,玩家也不会在意地形;如果设得太低,方块在非特定地形几乎无法使用,玩法会被强行限制。原版的“热能发电机”与“抽水机”就是典型案例,它们既鼓励选址,又不会完全“锁死”。

如果你在设计“高阶产物的生产链”,还可以把生产与发电绑定:例如某个工厂需要大量电力,但它的副产物恰好是发电燃料;或者某个发电机产生的液体正是下一步生产的冷却液。这样的闭环能让玩家觉得“体系在运转”,比单纯堆数值更有成就感。

小结

生产链的稳定性来自三个因素:资源地形、输入补给与输出畅通。钻头与泵决定“资源是否稳定产出”,工厂决定“资源如何转化”,发电与传输决定“系统是否有能量”。理解这些字段在运行时的角色后,JSON 配置就不仅是“写参数”,而是“设计生产线”。