Skip to content

模组第一步

工具配置

由于Json仅仅是一种标记语言,根本称不上是一门 编程语言(Programing Language) ,所以写Json模组不需要使用集成开发环境(IDE),只需要一个文本编辑器就足够了。但是,如果你的开发工具还具有格式化功能,或者是在移动设备上能方便地输入符号,那么开发就会轻松许多,所以,并不推荐直接使用系统自带的notepad.exe来编写模组。

安卓端

在安卓端上,笔者唯二推荐的编辑器之一就是MT管理器,理由有下:

  • 许多用户长期使用;
  • 自带代码编辑器,是等宽字体,还支持多标签页,方便查代码;
  • 自带代码格式化器,但只支持JSON;
  • 自带压缩功能,方便将模组导入到游戏中;
  • 自带软键盘,方便输入特殊符号。

下载这个软件并不难,但是在各大自带软件市场无法找到这个软件,原因无外乎MT管理器并非一个简单的文件管理器,而是一把瑞士军刀。你甚至可以用MT管理器反编译应用。但请注意,没有必要用破解版MT去反编译Mindustry,因为Mindustry的源代码是公开的,比反编译出来的可读性要好上不少。

iOS

在iOS上,笔者只推荐Spec Editor,这也是安卓端推荐的第二个编辑器。后推荐它的原因主要是因为较少有人使用。优点如下:

  • 衍生自 Visual Studio Code ,UI令人舒适;
  • 自动Json纠错,自动检查代码语法错误;
  • 软键盘功能齐全;
  • 压缩导出非常方便;
  • 甚至它是支持Git的!

在iOS上这个软件非常好下载,但在安卓平台上可能要花一些苦功夫去找了。

桌面端

虽然桌面端也有很多选择,但是笔者仍然最推荐 Visual Studio Code 。而在压缩软件方面,Windows推荐Bandzip,macOS推荐Keka,*nix用户请自行使用命令行工作。

如果使用VSCode,你可以选择安装Hjson插件,支持Hjson的格式化。不装任何插件也可以浏览Mindustry源代码,如果加装Gradle插件反而会占用存储空间。

绘图软件

绘图软件不必区分平台,通用的选择就是PS,我指的不是Adobe Photoshop,而是 Pixel Studio

万事俱备,只欠东风。工具配备齐全后,我们可以开工了!


模组结构

JSON模组不区分“源代码”和实际可以安装的模组文件。实际上,JSON模组实质就是一个文件夹,或者是一个文件夹的zip压缩包。

当然,为了和官方wiki中的教程贴近一些,你可以选择直接把文件夹建在游戏的mod文件夹里。有的系统直接直接输入路径进行访问相应路径,直接复制下方路径即可。

我还是要再次声明,如果你找不到这些路径在哪里,压缩模组再导入游戏也不会耗费太多时间:

  • Linux: ~/.local/share/Mindustry/mods/
  • Steam: steam/steamapps/common/Mindustry/saves/mods/
  • Windows: %appdata%/Mindustry/mods/
  • MacOS: ~/Library/Application Support/Mindustry/mods/
  • Android:/Android/data/io.anuke.mindustry/mods
  • iOS:你在做梦

在这里我可以直接给你Json模组所有要用到的文件夹。你可以选择按需创建,一次性全都创建完成也可以。

  • mod.json:模组配置数据,是模组唯一必需的文件;
  • content/:Json数据,也就是模组的“代码”:
    • /items/:物品代码;
    • /liquids/:流体代码;
    • /blocks/:方块代码;
    • /units/:单位代码;
    • /statuses/:状态效果;
    • /planets/:行星;
    • /sectors/:区块;
    • /weathers/:天气;
  • bundles/:语言文件;
  • sprites/:模组贴图文件;
    • /blocks/environment/模组地板的贴图必须放在这里
  • sprites-override/覆盖原版的贴图文件;
  • schematics/:蓝图文件;
  • maps/:地图文件;
  • sounds/:音效文件;
  • musics/:音乐文件;
  • scirpts/:Javascript文件。

以上就是JSON模组基本上所有需要用到的文件夹,以及原版唯一必需的文件mod.json(也可以是mod.hjson,区别见下文)。为了能完成这个必需的文件,我们需要先一览JSON的语法。

Json语法

与官方教程不同的是,中文版的本教程会先讲标准Json语法。这是因为国内手机较电脑更为普及,而在手机上缺少Hjson的格式化器导致的。如果你想要更严谨的学习,可以访问菜鸟教程

一个Mindustry中Json的示例可以是这样的:

json
{
  "type" : "GenericCrafter",
  "description" : "Hello /n world!"
  "health" : 100,
  "hasItems" : true,
  "requirements" : [
    "copper/10",
    {
      "item" : "lead",
      "amount" : 10
    }
  ],
  "research" : {
    "parent" : "copper-wall"
  }
}

如果要严格地去定义的话,应当有以下表述:

  • JSON全称Javascript对象表示法,Javascript对象表示语法是JSON语法的超集;
  • 一个.json文件为一个JSON对象。对象中的数据由键值对存储,符合key : value的格式,并且每条键值对需要用逗号分隔,不允许尾随逗号;
  • 键必须为字符串格式。值有五只类型,包括数字(Number)、布尔值(Bool)、字符串(String)、列表(List)和对象(Object)。数字类型为纯数字,常用的表示方法均可识别;布尔值仅有两值truefalse,表逻辑判断;字符串需要用双引号括起,不支持直接换行,可以使用控制字符;列表用[]包围,是值的集合,值间用逗号隔开;对象用{}包围,是键值对的集合,键值对间用逗号隔开。

如果你真的能从上面这些东西学到JSON语法,恐怕你是先天程序员圣体了。 实际上,你只需要对JSON语法有个朦胧的印象,如果游戏报语法错误,你只需要有使用格式化器查找错误的能力即可。不过,我还是想提两点常见的错误:

  • 使用英文字符:虽然:看起来很像,但是游戏只会认可前一个。你需要使用英文键盘输入代码。受影响的字符包括:" , : { } [ ]。有的时候,在英文输入法下也可能会输入英文的前后引号,你要保证你的引号是直的!
  • 成对字符必须成对:这句话表象上是一句将军式的废话,但是我见过的50%的错误都是丢个后引号或者括号没配上对导致的。如果你实在想不起来写引号,还不愿意使用格式化器的话,往下看;
  • 分清方括号和花括号。

如果能克服这两个问题,一般你也就可以声称自己学会JSON语法了。不过,JSON语法本身并不算什么有用的东西。只有JSON文件被解析才产生了意义,对于某些Mindustry中额外添加的规则,比如copper/10,才是本教程存在最大的意义。

Hjson

Hjson是一种基于JSON的配置文件格式,旨在提供更人性化的语法,同时保持与JSON的兼容性。它通过减少必要的标点符号、支持注释和更灵活的字符串表示方式,使得配置文件更易于人类读写和维护。

实际上,Mindustry(或者说是Arc)中的JSON并非标准JSON,而是一种Hjson。正如其标榜的内容一样,Hjson写进来更加轻松,具体来说就是:不引起歧义的双引号、逗号可以省略;支持注释;可以省略开头结尾的大括号。此外,Mindustry中的解析更为宽松,还允许多行字符串不加任何引号;给数字和布尔值加引号。比如,上面的示例还可以这样写:

hjson
{
  //Block Type
  type: GenericCrafter
  description: Hello 
  world!
  health: 100
  hasItems: true
  
  /* 
   Nice Boat
  */
  
  requirements: [
    copper/10
    {
      item: lead
      amount: 10
    }
  ]
  research: {
    parent: copper-wall
  }
}

可以看出,基本只省下两种括号和冒号了。这也是为什么有的时候你忘掉一个逗号或引号不会引起错误。

关于注释,使用//领起单行注释,/* ... */括起多行注释。Mindustry不支持使用# 领起单行注释。


虽然Hjson这么美好,但是并非没有代价。虽然可读性变高了,但语法检查也变难了。因此,你需要权衡一下,而且最好在整个模组中保持一致的语法规则。

mod.json

接下来,你需要找一个地方安放你的文件夹,并且按上面的目录结构创建了mod.json(或mod.hjson)这个文本文件,然后填入以下内容:

json
{
  "name": "tutorial-json-mod",
  "displayName": "JSON教程模组",
  "author": "Learn-Mindustry-Mod",
  "version": "1.0.0",
  "minGameVersion": "152.2",
  "description": "这是一个示例模组"
}
hjson
{
  name: tutorial-json-mod
  displayName: JSON教程模组
  author: Learn-Mindustry-Mod
  version: 1.0.0
  minGameVersion: 152.2
  description: 这是一个示例模组
}
  • name:模组的内部名称(Internal Name),推荐使用小写字母及连字符,在未来你可能需要在贴图命名的时候用到它,我会用modName指代之;
  • minGameVersion最低游戏版本,非常重要,是游戏用来在大版本更新时逼迫作者更新模组的利器。不能低于当前大版本的第一个小版本,例如,现在对JSON模组是136。建议与最新版本152.2保持一致;
  • displayName:模组在模组对话框中显示出来的全称;
  • author:你(作者)的名字;
  • version:模组的版本号;
  • deescription:模组详细页里的简介,你可以在这里简单介绍你的模组。

完成上述工作后,你就可以压缩你的模组,然后导入到游戏当中。游戏重启后,如果能在模组页面看到你的模组,就说明没有问题了!

获取一份源代码(可选)

Mindustry是开源的游戏,遵守GPL-3许可证。这对你有两点意味:首先,你的模组也必须是开放源代码的;其次,你可以直接获取Mindustry的源代码来查找数据和贴图,而不必像其他游戏一样要靠拆包和反编译。

Mindustry的源代码就托管在GitHub上,项目地址为https://github.com/Anuken/Mindustry。此外,Mindustry是基于Arc游戏框架开发的,因此你还需要用到https://github.com/Anuken/Arc

访问这两个网站,你可以在线访问源代码(很考验你的网速),或者是下载源代码。找到Code->Download Zip,这样你就将源代码下载到本地了。

如果你的网络不支持你这么做,你可以选择寻找一些GitHub加速的手段。这里我可以给你提供两个网址:Mindustry最新源代码Arc最新源代码

在Mindustry源代码目录下方core/src就是原版大部分源代码了,core/sprites-raw则是原版所有未经处理的贴图。

FAQ

  • 在Windows上报错Invalid CEN header怎么办?:这说明你的压缩包编码格式不对,你需要确保你的所有文件都是UTF-8(无BOM)编码的;
  • 我的模组重启后就消失了?:如果模组消失,只有可能是加载失败了,在设置-数据中导出日志或直接查看lastlog.txt解决问题;
  • 报错No mod.json found:首先检查文件名的拼写是否有误。如果无误,你需要改变一下压缩的手法,不要压缩包括mod.json文件的文件夹,而是全选所有文件并压缩;
  • 官方Wiki上指示我把模组文件夹直接建立在Mindustry数据文件夹里,为何本教程不推荐这么做?:从国情考虑,大多数人找不到数据文件夹在哪。
  • 为什么modName命名有那么多限制?:因为原版自带一种特殊的处理机制(位于Mod.java的953行),modName会自动把大写字母转成小写字母,并把空格转为连字符。例如,My Mod Name转化成my-mod-name这一过程是全自动的,本来就会被游戏识别成相同的名称。至于中文字符,就是仁者见仁的东西了。