0x02 物品、流体、语言文件与科技树
“巧妇难为无米之炊。”
在上一章中,我们搭建了地基并成功运行了模组。但一个空荡荡的模组是没有灵魂的。在 Mindustry 的世界里,一切宏大的工业帝国都建立在最基础的元素之上:物品 (Item) 与 流体 (Liquid)。
本章,我们将以《饱和火力》模组中的经典设定为蓝本,教你如何创造属于自己的基础材料,并让它们在科技树中闪亮登场。
学习本章需要具备的基础:
- 已掌握 0x01 中提到的模组基本目录结构。
- 熟悉 Hjson 语法的基本书写规则。
物品 (Item):工业的基石
物品是游戏中最重要的资源载体,无论是建造方块还是充当弹药,都离不开它。
请在你的模组目录中创建 content/items/ 文件夹。如果你想创造一种类似《饱和火力》中的“硅钢” (Silicon Steel) 这样的高级合金,你可以新建一个名为 silicon-steel.hjson 的文件。
命名规范提示
文件名的前缀不需要加你的模组内部名称(modName),系统会自动为你注册内部名。但在代码中引用它时,你需要写成 你的模组名-silicon-steel(除非你在同一模组内且游戏版本较新,允许省略前缀,但为了保险起见,显式声明总是最好的)。
让我们看看一个标准的物品定义包含哪些属性:
{
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: Item 和 color,游戏也不会报错。未填写的属性会自动回退到默认值(通常是 0 或是 false)。
流体 (Liquid):管道中的生命线
流体与物品类似,但它们在管道中流动,并且拥有热力学属性。 请在模组目录下创建 content/liquids/ 文件夹,并新建一个名为 nano-fluid.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):赋予事物形象
你肯定不希望你的物品在游戏里显示为一个白色的问号块。 为你的物品和流体准备贴图:
- 画一张
32x32像素的透明背景.png图片。 - 将图片重命名为与 JSON 文件完全一致的名称。例如,
silicon-steel.json对应的贴图必须是silicon-steel.png。 - 将它放入模组根目录的
sprites/文件夹中。
语言文件 (Bundles):本地化与显示名称
细心的你可能发现了,我们在定义物品和流体时,并没有写它们的名字和描述! 为什么呢?因为如果在 JSON 里直接写死,就无法支持多语言(比如同时支持中文和英文玩家)了。
官方推荐的最佳实践是使用 语言文件 (Bundles)。 在模组根目录下创建 bundles/ 文件夹,并创建一个名为 bundle_zh_CN.properties 的文本文件。
编码格式
.properties 文件同样绝对不能用记事本编辑,请务必在 VSCode 或其它编辑器中确保它是 UTF-8 (无 BOM) 编码,否则中文会显示为乱码。
语言文件的语法非常简单,采用 键=值 的格式:
# 物品和流体的命名规则:[类型].[模组内部名]-[文件名].[属性名] = 值
# 假设你的 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:
{
type: Item
color: 7595D2
hardness: 3
// 科技树定义
research: {
// 它的前置科技节点 (必须是游戏中已存在的内部名,例如塑钢 plastanium)
parent: plastanium
// 如果想要更复杂的解锁条件 (比如通关某个星球的某个区块),可以填写 objectives
/*
objectives: [
{
type: SectorComplete
preset: groundZero // 零号地区
}
]
*/
}
}快速语法
如果你不需要任何特殊的解锁条件,仅仅只需要指定前置节点,你可以简写为:research: plastanium。这就代表它的前置科技是原版的塑钢。
现在,打包你的模组并运行游戏。进入战役模式的科技树,看看“塑钢”的后面是不是多出了你新添加的“硅钢”!在下一章,我们将介绍如何建造宏伟的工厂来生产这些材料。