MDT模组科技树制作

在MDT中,科技树使得游戏性、目标性更强,在模组中我们也可以自己手动制作一个科技树

JSON科技树
下列是ContentParser的一段内容,用于转换科技树,JSON不能单独写一个文件创建科技树
属性提取
若`research`值为string类:写一个对象游戏内部名称或模组的内容的`name`值
否则:为一个对象,内可有`parent` `requirements` `objectives` `root` `name` `requiresUnlock`属性
还可注意到最后两个属性需要`root`值为true,且`root`和`parent`只能兼得一个

属性解析
parent: 同`research`为string类时,值为一个游戏内部名称或内容文件名
requirements: 研究消耗,不填则自动计算
objectives: 研究前提需要完成的目标(见后)
root: 是否为根节点
name: 当前模组的科技树名称
requiresUnlock: 是否要先前解锁(但为true就不会显示了,或许是我没找到方法?建议将该值为true的内容的alwaysUnlocked为true)

属性解释
string: parent, name
boolean: root, requiresUnlock
ItemStack[]: requirements
Seq<Objective>: objectives

JS科技树
在学习js模组时,可以尝试模仿游戏源码的方式进行,下方是E星的部分代码(mindustry/content/ErekirTechTree.java),标号对应下方序号
查找`nodeRoot`和`node`,得到如下几些方法(mindustry/content/TechTree.java)
定义了E星的科技树根节点
name定义了该科技树的名称,根节点内容和并创建了子节点归属(?
定义了父节点下的一个子节点
content定义了该节点的内容,以及后续子节点的归属(?
定义了带前置目标的一个子节点
objectives定义了研究该节点的前置目标
定义了一个没有孩子的节点
有关requirements只用加一个物品堆就行了,无需过多讲解,就是改变研究消耗
经过上述描述,则可以写成如下的js文件:
挺简单,是吧?

JSON前置目标
先看源代码,看看是如何转换的
首先判断,若为字符串,则查找是否为某个游戏内容,未找到则报错
否则:前置目标为研究字符串指代内容(就是生产和研究只会显示为研究xxx,也可能会误导一部分玩家)
由于没有分很细的必要,因此写在下方代码段里,并且注意Objective[],代表要在一个列表里
所以还是能写的

JS前置目标
先看源码,看看原版的前置目标是怎么写的
找到如下方法
注意到前面科技树要求传的是一个Seq,所以这一堆前置目标应放在一个Seq里,不同前置目标应用逗号(,)隔开。
看向最后一行(core/assest/scripts/global.js),由于没有直接导入到Objectives里,故使用时需要Objectives前置

后言
首次尝试在一个教程里用两种语言进行教学。对于十分细致的属性教程,大概率是不会更新了的,但若是你想知道,可以来 https://github.com/1565619256/Mindustry-zh_CN-modding-guide 这个是我无聊时候会更新的