Skip to content

0x02 物品、流体、语言文件与科技树

“巧妇难为无米之炊。”

在上一章中,我们搭建了地基并成功运行了模组。但一个空荡荡的模组是没有灵魂的。在 Mindustry 的世界里,一切宏大的工业帝国都建立在最基础的元素之上:物品 (Item)流体 (Liquid)

本章,我们将以《饱和火力》模组中的经典设定为蓝本,教你如何创造属于自己的基础材料,并让它们在科技树中闪亮登场。

学习本章需要具备的基础:

  • 已掌握 0x01 中提到的模组基本目录结构。
  • 熟悉 Hjson 语法的基本书写规则。

物品 (Item):工业的基石

物品是游戏中最重要的资源载体,无论是建造方块还是充当弹药,都离不开它。

请在你的模组目录中创建 content/items/ 文件夹。如果你想创造一种类似《饱和火力》中的“硅钢” (Silicon Steel) 这样的高级合金,你可以新建一个名为 silicon-steel.hjson 的文件。

命名规范提示

文件名的前缀不需要加你的模组内部名称(modName),系统会自动为你注册内部名。但在代码中引用它时,你需要写成 你的模组名-silicon-steel(除非你在同一模组内且游戏版本较新,允许省略前缀,但为了保险起见,显式声明总是最好的)。

让我们看看一个标准的物品定义包含哪些属性:

hjson
{
  type: Item
  
  // 颜色:在小地图上、传送带上发光或作为粒子特效时的基础颜色 (十六进制,不含#)
  color: 7595D2
  
  // 爆炸性:决定了作为弹药或被摧毁时的爆炸范围/伤害比例 (例如爆破混合物为 1.2)
  explosiveness: 0
  
  // 燃烧性:决定了作为燃料时的燃烧时间或引发火灾的几率 (例如煤炭为 1.0)
  flammability: 0
  
  // 放射性:决定了提供给 RTG 发电机等设备的效能 (例如钍为 1.0)
  radioactivity: 0
  
  // 充能率:决定了能否作为建材提供电力,或蓄电池的容量加成 (例如相织物含有少量电荷)
  charge: 0.45
  
  // 硬度:决定了采掘它所需要的钻头等级(铜铅为1,钛为3,钍为4)
  hardness: 3
  
  // 建造时间花费倍率:作为建材时,数值越高,建造对应方块的时间越长
  cost: 1.75
}

缺省值

即使你只写一个 type: Itemcolor,游戏也不会报错。未填写的属性会自动回退到默认值(通常是 0 或是 false)。


流体 (Liquid):管道中的生命线

流体与物品类似,但它们在管道中流动,并且拥有热力学属性。 请在模组目录下创建 content/liquids/ 文件夹,并新建一个名为 nano-fluid.hjson 的文件。以《饱和火力》中著名的“纳米流体”为例:

hjson
{
  type: Liquid
  
  // 基础颜色与发光颜色 (支持 8 位十六进制,最后两位代表透明度/Alpha)
  color: 7CF389FF
  lightColor: 7CF38970
  
  // 温度:0.5 为室温。低于 0.5 是冷冻液 (可为炮塔冷却),高于 0.5 是高温液体 (如矿渣为 1.5)
  temperature: 0.3
  
  // 热容量:数值越高,吸收热量的能力越强,作为冷却液的效率越高 (例如冷冻液为 0.9)
  heatCapacity: 1.45
  
  // 粘滞度:决定了流体在管道中的流动速度,以及进入方块的速度 (例如水为 0.5,矿渣为 0.7)
  viscosity: 0.3
  
  // 状态效果:当单位接触到该流体时赋予的效果 (例如 "freezing", "melting")
  // effect: freezing
}

贴图 (Sprites):赋予事物形象

你肯定不希望你的物品在游戏里显示为一个白色的问号块。 为你的物品和流体准备贴图:

  1. 画一张 32x32 像素的透明背景 .png 图片。
  2. 将图片重命名为与 JSON 文件完全一致的名称。例如,silicon-steel.json 对应的贴图必须是 silicon-steel.png
  3. 将它放入模组根目录的 sprites/ 文件夹中。

语言文件 (Bundles):本地化与显示名称

细心的你可能发现了,我们在定义物品和流体时,并没有写它们的名字和描述! 为什么呢?因为如果在 JSON 里直接写死,就无法支持多语言(比如同时支持中文和英文玩家)了。

官方推荐的最佳实践是使用 语言文件 (Bundles)。 在模组根目录下创建 bundles/ 文件夹,并创建一个名为 bundle_zh_CN.properties 的文本文件。

编码格式

.properties 文件同样绝对不能用记事本编辑,请务必在 VSCode 或其它编辑器中确保它是 UTF-8 (无 BOM) 编码,否则中文会显示为乱码。

语言文件的语法非常简单,采用 键=值 的格式:

properties
# 物品和流体的命名规则:[类型].[模组内部名]-[文件名].[属性名] = 值
# 假设你的 mod.json 填写的 name 是 "my-first-mod"

item.my-first-mod-silicon-steel.name=硅钢
item.my-first-mod-silicon-steel.description=一种高强度的合金材料,由硅和铁冶炼而成。

liquid.my-first-mod-nano-fluid.name=纳米流体
liquid.my-first-mod-nano-fluid.description=充满微型纳米机器人的活性流体,具有极强的冷却与修复能力。

当游戏加载时,它会自动匹配玩家的当前语言环境,并寻找对应的 .properties 文件来显示名称。


科技树 (Tech Tree):点亮科技之光

如果你不把物品加入科技树,玩家在战役模式中就永远无法解锁和使用它。 在 Mindustry 中,链接科技树非常简单,你只需要在对应的 JSON 结尾添加 research 属性即可。

修改刚才的 silicon-steel.hjson

hjson
{
  type: Item
  color: 7595D2
  hardness: 3
  
  // 科技树定义
  research: {
    // 它的前置科技节点 (必须是游戏中已存在的内部名,例如塑钢 plastanium)
    parent: plastanium
    
    // 如果想要更复杂的解锁条件 (比如通关某个星球的某个区块),可以填写 objectives
    /*
    objectives: [
      {
        type: SectorComplete
        preset: groundZero // 零号地区
      }
    ]
    */
  }
}

快速语法

如果你不需要任何特殊的解锁条件,仅仅只需要指定前置节点,你可以简写为:research: plastanium。这就代表它的前置科技是原版的塑钢。

现在,打包你的模组并运行游戏。进入战役模式的科技树,看看“塑钢”的后面是不是多出了你新添加的“硅钢”!在下一章,我们将介绍如何建造宏伟的工厂来生产这些材料。