本次尝试制作一个比较简单的mod,我们添加一些手办来代替原版丑陋的艺术雕刻品。然后添加一种新材料树脂(用树脂做手办听起来比较合理),让游戏看起来更萌一点。这个mod只需要添加xml数据就可以完成。
1.1 定义一个新的抽象物品 手办基类
原版的艺术雕刻图案随机,并且可以使用不同的材料,还带有一些奇怪的艺术描述,我们打算制作像钢琴一样可以拆卸的物品,但是作用只有增加美观度。于是我搜索这两个物品xml,这两个物品都继承了Buildingbase的xml数据,所以钢琴在原游戏中也是个建筑类别的存在,和一般的建筑属性做对比可以发现它的一些特殊的属性,比如可搬运(拆卸),我们也先建立一个抽象的xml让之后的手办都继承这些属性,我删除了钢琴的娱乐效果组件和雕刻的艺术组件,我们可以在C#写一个对应的新效果,但我没什么灵感。
这里的recipeMaker标签可以设定一些获取这个物品的要求,比如需要什么样的前置研究,在哪里制作,需要什么技能,与之配套的是costList标签,控制消耗多少材料,第一次遇到没见过的标签,记得善用搜索+翻译,这样大概就知道他的作用了。
1.2 源源不断的手办(Garage Kid)
通过我们之前完成的基类,我们只需要再添加一些必要的数据,就可以制造各种各样的手办了,反正它们最主要的区别只有纹理不一样。这里的tex我随便找的,还没有合适的素材,需要一个懂美术的朋友
1.3 新材料(Stuff)
这里的Resin是我定义的新材料树脂,这里还没有创建这个材料,我们就顺便定义一下新资源,同样,我们参考了Core中Steel的数据,但与之不同的是我们不会用它制作防具和武器,所以它影响制作的物品锋利度防护度相关的部分被我删掉了,然后还需要把它设置为一种制造材料,同样是原版没有的。我们只要仿造添加一个就好。
新材料的代码
设置为制造材料
stuffProps标签里的categories控制了它属于哪种制造材料,如果不填写的话会报错,但并不会崩溃,游戏会把它设置为默认的木头材质。此外它还影响了未完成品的名称,我们后面会说到。
1.4 添加配方(Recipe)
其实我们已经在新的手办物品中设置了配方了,通过recipeMaker标签和costList标签。但还有另一种更常用的标签,在Core中,Recipe相关的都是制造配方,通过Recipe可以做到复杂的合成,比如可以设置所有种类的皮革中除了某几种以外都可以算为一种材料。
我们也尝试使用Recipe设置一个用木头在燃料加工台制作树脂的配方
1.5 未完成物品
差点忘了这个东西,你一定注意到了
它对应这个物品未完成的样子和描述,不过它有个bug,它的名称和描述是没办法显示在游戏中的,总是以 未完成的+材质+制作品名字这种格式命名,描述也会被替换为制作品的描述,但这个def并不是不起作用的,游戏中会读取它的纹理。我还没有素材,用原版某个艺术品未完成的图片代替了。
1.6 测试
1.7 本地化
追加一下xml本地化的内容。
上一篇里介绍了C#代码中的本地化,今天介绍一下如何本地化xml中的参数。以英文为例,在Languages下建立English文件夹,然后在English/下建立DefInjected目录,它的原理也是利用patch的方式覆盖原有的数据。
在DefInjected下建立一些对应的Def路径,创建对应原xml文件的名字,修改内部的参数,格式参照
原xml文件
对应的补丁文件
这里有一点需要特别注意
你的翻译xml文件必须与mod中的xml数据文件同名,并且放在一个与原版Def路径有关联的路径中,才会生效!
这个关联的形式并不是与原路径名字一样,这一点坑了我半天。代码报错查不到,去论坛找了半天信息才了解到。
一般的核心路径如RecipeDefs与之对应的路径为RecipeDef,去掉复数“s”
而ThingDefs_Buildings,ThingDefs_Items之类的路径会被归并为ThingDef路径,只有这样命名,目录下的翻译文件才会生效!
这个不怎么起眼的信息在RimWorldDataCoreLanguagesEnglishabout.txt文件里有说明到
我描述的可能不太清楚,具体应该看下我源码中路径的名字,你很快就可以搞清楚。