新手向MOD入门-如何在CDDA中捏角

新手向MOD入门-如何在CDDA中捏角



<新手向>MOD入门:如何在CDDA中捏角

  本教程mod学习素材下载地址

  CDDA在创造角色时已经展现很高的自由度,从角色扮演的角度,你能塑造想象中的角色,点数限制上官方也大开方便之门,不管你喜欢老派的苦逼求生,还是想微调特性池上限,甚至无限制的选项都直接给你摆上,某种程度上显示了Kevin对游戏的谜之自信─4围20一样有办法死,属性全5也可以活,我的世界就是这么牛!
  萌新看着琳琅满目的职业选项,大概都有眼花撩乱的感觉,大部分的职业并没有突出的优点,我是指性价比或趣味性,少数场景特别能满足职业代入感,例如警局突围、商场守卫等等,少部分能凸显一些恶趣味,例如灾变奇航、荒野果体求生等等。然而,大部分职业缺乏存在感,或没有对应的场景提升代入感,今天的主题是:如何自己捏一个新职业。
  感谢CDDA的开放性,即使是不懂编程的我也能轻易上手,接下来用一个新写的小mod解释,如何零基础编写一个自用模块。

  首先,下载notepad+,免费又好用的记事本软件,后面的示范都用这个操作。
  我们先预览一下,游戏内(可供编辑)的代码大致长这样子:
图1
  每个.json档案都含有部分游戏内容,这些内容按照规定格式撰写,才能顺利载入游戏并出现在游戏里,这些内容物都是游戏世界的组成成分。

  以这个例子来看:
图2
  每个档案要有开头符号[以及结尾符号],中间绿色框起来的部分,也是{}包含的部分,是一个完整的信息片段。1个档案必然有1组开头/结尾,中间的信息片段可以有无数组,理论上你把游戏内全部的.json档案内容都塞在一起,也能顺利进行游戏,但不好管理,所以在游戏目录/data/json/有着详细的分类,mod能编辑的东西都在这里。
  用生物学的方式比喻,1个档案就是1条染色体,[]是前后端,{}是基因的启动/终止子,{}内的代码是硷基对组成的遗传信息,用来编译有作用的生物物质。
  注意,一旦格式出错,例如少个[]、{}、或是逗号,结构就崩了,导致档案失效无法载入。你能在报错信息(红字)上看到是哪里出问题。
  后面我们示范如何从零开始,一开始的代码很短,只要稍加注意不会有任何问题,即使犯个小错也无妨,照着红字修就行。
  这次的目标是捏出《只狼》里头可爱迷人的小公主,咳咳,我是说小主公─九郎,并试着在CDDA世界再现小主公的特质─赋予人不死的龙胤。

  首先打开目录/data/mods/
  你可以在此看到所有mod,虽然你可以直接修改游戏本体的代码,但不建议这么做,一个是出错的话复原很麻烦,一个是游戏本体更新太快,所以我们自己创一个mod!
图3
  新增资料夹,取个喜欢的英文名字,SSDT是只狼的缩写。
图4
  建立1个.json档案作为标题,命名为modinfo。

  新手建议直接从别的mod复制档案过来用,直接修改内容。先学抄、再学改、最后自己写!
  ※Note:如果你先建立.txt档,再改副档名成.json,可能导致失效,别问原因,所以萌新直接抄答案最保险!

  完成后的模块信息 :
图5
  现在资料夹和目录建好了,目前还是一个只有名字的mod,如果你可以在创世时选择它,并顺利载入游戏,恭喜你,完成登月的第一步!
图6

  …如果出红字也没关系,再抄一下答案吧。(小声)

  在开始塑造角色前,有些前置工作要做。进入游戏中的试调选单>生成物品(spawn item)
图7

  前面说每个物件都有自己专属的id,但id和name有时长得不一样,我们如何知道自己中意的道具id?最简单的方法就是试调选单,右上红框处就是,这件衣服是咱待会要用的,把需要的id记下,准备打造专属职业啦!

  先别急,为了查资料方便,我把做mod时最常查的资料先列出来:
  CDDA/doc/JSON_INFO.md
  CDDA/doc/JSON_FLAGS.md
  CDDA/data/json/professions.json
  CDDA/data/json/mutations/mutations.json

  前2个可以看成CDDA代码小百科,涵盖8成以上的mod内容,没事,没叫你啃完,想知道啥东西怎么写来这抄就是。后2个就是职业/突变的代码,其中突变的代码只有部分是开放给mod编辑的,所以有些东西你翻遍全部.json档案也找不到,别想了,我们这就开始写职业吧!

  打开档案:
    游戏目录/data/json/professions.json,这里是原版职业的代码。

  首先我们来看每个玩家一定玩过的初始职业幸存者,它的代码长这样:
图8
  橙色线条标示的ident是职业id,name是职业名字。id是给程序辨认的,name是显示给玩家看的。point代表所需点数,item设定初始装备/道具。
  左方红线很清楚的标示着与起始子{对应的终止子},形成1个完整的信息片段,两个片段之间需用逗号隔开,这规则在信息片段内同样适用。来看另一个例子:
图9
  只要是连续的讯息,中间都要用逗号隔开,逗号很重要!很重要!很重要!一开始最容易报错的地方就是分隔符疏漏,包括但不限于『, {} [] 』。
  你可能注意到2个例子划线部分的代码排列方式不太一样,实际上这对读取没有影响,你可以把所有代码都堆在一起,或是空100行,只要间隔用的符号无误,程序读取不会出错,但对阅读代码的人类来说容易阅读困难,我示范时会保持排列工整一致,这能有效降低失误率。
  (初步)完成的职业代码范例:
图10

  这是mod内建立的第2个档案,命名为profession.json,由于CDDA代码已经很亲民,基本E文就不解释了,要注意的是,左方的透明虚线能辅助你分辨引号/括号对应的作用范围,如果1个片段里有很多层引号,可以像图例这样分层排序。
  哈?你说这太难没法自己码出来?当然是直接拷来抄阿!又不考默写!
  是的,基本上mod的炼成,就像大学生的报告炼金术:理解、分解、再构筑。依照你对游戏的理解,你能轻易撷取出最接近的代码来改造。从原版的professions.json内撷取一个职业,重塑成功以后,此阶段就算完成一半。

  来看看,职业选单上出现一个可爱少主啦,如果你能完成到这一步,恭喜你已经能做出类似原版自带的RL经典职业mod,能初步塑造一个职业了。
图11

  但是我们的mod还没完成,记得一开始的目标吗?在CDDA里复刻拥有龙胤的小主公!
  只狼世界里的卿子,是继承樱龙力量的人类,拥有「不死」的能力,然而故事里所有追寻不死的人,最终都被「不死」吞没,显然龙胤之力是樱龙抛出的美好诱饵,迷人的不死背后是难以承受的代价。
  综上所述,龙胤显然包含2种特性,一个叫「真香」,一个叫「有毒」,我们准备编写一个职业特性,用来表现只狼世界中的龙胤之力。
  在CDDA世界里,能表现「苏生」和「有毒」特质的方法不只一种,这里我选最简单的,不过我们先把龙胤放下,先写另一个比较简单的特质,作为练习题。

  小主公作为被武家收养的子弟,略懂功夫也是很合逻辑的(虽然他更擅长做点心)。我们要设定一个职业特质,并赋予主人公初始武术合气道。

  这次的模板:CDDA/data/json/mutations/mutations.json
图12
  职业特性与一般突变的区别,主要是后天不可变,不像普通特性能用突变剂影响,就是有蓝色字体的那3行,写得清清楚楚,特别亲民。
  职业特质在游戏中用白色字体表示,一般突变通常有益的(需求点数为正)呈绿色、有害(点数为负)呈红色、不好不坏的(点数为0)呈黄色。

  建立第3个json档案,如下图:
图13

"initial_ma_styles":A list of ids of martial art styles of which the player can choose one when starting a game.


  决定角色的初始武术选单,如果不只1种就是多选一,这段英文定义取自JSON_INFO.md,事实上它几乎包含所有json档的格式内容,不懂的先查它就对了。
  现在我们完成1个初始职业、1个职业特质,萌新记得每隔一段落存档,进游戏检查一下,免得累积红字。
  接着要写代表龙胤之力的突变,前面说了只狼里的龙胤有毒,表面上无限续命,实际是吸收人类的生命力来成就自己。要在CDDA世界里刻画这个特质,我的初始构想是:用职业突变产生道具,用道具展现治愈能力,通过降低健康的方式造成 负担,负健康值导致回血效率下降甚至负回血。

  我们要写的是:1个突变,1个恢复道具。
  突变可以主动激活并产生道具,在JSON_INFO.md里面有写,原版的蜘蛛吐丝、树人藤蔓也有,模板如下。
图14

  在此我遇到第1个失误,其实来得挺快,前面的部分写起来也就几分钟的事,只是写成教学要很久而已。这个失误是我以为能在这里做减健康的操作,毕竟飢饿口渴疲劳都能扣,健康值…其实不行!回头查JSON_INFO.md,突变激活只能消耗上面3项,所以输入health或healthy都不起效果,这是因为我们只编辑json的部分,表现力受到限制,我们没有编码能力翻山越岭,就只能绕路了。

  尝试几次无果之后,只得换个方式─把构想中产生道具时扣除的健康,转到使用道具时扣除。这故事是我想传达给萌新的几件事:
  1. 孰悉CDDA世界,把游戏理解作为初步构想的材料。
  2. 发展新构想,很少能一次成功的。
  3. 确认效果的时间往往大于你写代码的时间
  4. 绕路是常态,死路是日常,孰悉之后会清楚json文件的表达力在哪,能到甚么程度。

  嗯?你说这篇吗?当然是写完mod才出来水帖的呀,不然水到一半暴死多尴尬 (:з」∠)

  第2个突变写出来了,(暂时)如下:
图15
  重点是产生道具的那一行,以及上面的激活选项。
  time表示冷却时间,然而…在我测试的版本(9785)中无效。   hunger/fatigue是激活时扣除的代价,然而…在游戏中显示有误,只写fatigue依然显示消耗飢饿度(hunger)。
  毕竟是开源、日更、用爱发电的CDDA,小瑕疵不要在意嘛~ ╮(╯▽╰)╭

  产生道具的部分解决了,回头来写恢复道具,在CDDA世界,能表现强力治愈的方式不只1种,例如:神器、Buff、还有新推出的魔法,我选择最简单的─Panacea(万灵药),原版神药,自带大量恢复及Buff。
图16
  前面我没有指名道具类的json档案模板,有翻阅过游戏资料夹的玩家会发现,它们实在太多了,制作组将它们详细的分门别类,像这个在item>comestibles>med的分类,你不一定像我一样无聊地把大部分档案都翻过,事实上这些分类还在扩充,内容也不时更改,所以你需要省力的方法。
  在notepad+用ctrl+F,能在多个档案中搜到你要找的目标,使用方法如图:
图17

  我们看到panacea使用独特的激活效果(use action),这部分在json的编辑范围外,没关系,这个效果正是我们要的,直接拿来用。
  上面提到的其他方法,诸如使用神器标签或编写Buff(Effect),都有机会成功且表现力可能更好,但要额外的力气去编写,超纲了,这里选一个最简单的,直接拿万灵药来用。
  就神器标签的部分举个例子,AEA_HEAL能在激活时(小量)治疗玩家,而神器的激活效果可以是复数,重复叠加就变成治疗术(大)。曾有人利用神器吸血充能的标签,用HP给道具充电,激活后转换成持续激发型道具,标签换上AEA_HEAL,于是反过来从吸血道具变成回血道具,用它来模拟抽血/输血。
  只要孰悉游戏再加上一点创意,在有限的规则内也能组合出很多妙想,这是不亚于游戏本身的乐趣。
  建立第3个json档案,也是最后一个。
图18
  这里我失误2次,第1次是我把这玩意设成液体,龙血嘛,用喝的才过瘾,然后就…洒了。
  没错,生出来的道具问都不问直接就泼地上,我还纳闷东西哪去了?没写错啊怎么木有?都洒了阿…算了算了,不用液体总行呗?

  稍微给萌新介绍一下道具的代码:
  type是道具的分类项,必要,决定它在物品栏里出现在哪一区,例如工具、武器、零件等。
  comestible type是细项,非必要,用来更精准的把消耗品分门别类。
  symbol、color出现在字符党的游戏画面里,如果没指定图形,在图像版中也会以这个形象出现,在此是1个红色惊叹号。
  重量、体积、材质如果不输入的话默认为0或无。
  Looks like可以指定图形给它,这里它与万灵药用同一个皮肤,非必要。
  Use action表示激活时的效果,常见的有transform,转型成其他道具,例如手电(关)→手电(开)、产生药效effect、生火、放陷阱…etc,在json层级里你只能使用已有的动作选单,无法自创。
  flag就是插旗…不对,是标签,代表物品的某些特性,详阅doc/JSON_FLAGS.md,同样无法自创flag或编辑它的内容,但不妨碍你尽情使用它们。

  看懂物品代码以后,你就有初步编写物品的能力了,物品的编写在CDDA世界有非常大的表现幅度,大到我没打算介绍它,我相信你会理解的。

  这段不是给萌新看的:NPC_SAFE是新标签,然而没说明,CDDA日常:『有新代码耶!但是说明书没写它怎么用』这也是没办法的,自己猜吧,以前是用USE ON NPC表示这个药品可以用在NPC身上,实测结果队友不一定乖乖吃药,换成NPC SAFE就没问题,推测两者作用相近,NPC SAFE标签更不容易被抗拒。

  然后这个物品的代码还是有点问题,或着说,有部分无效,导致它没能达成预期效果,这个容后再谈。

  测试一下码出来的成果(图形使用MSX++dp):
图19
图20
图21

  角色正常!突变正常!物品正常!
  (脚边的红光体就是,刚好万灵药的皮肤就是红色发光晶体)
  那么问题来了,实际吃下去效果如何?
  万灵药的恢复效果无庸置疑,看来角色吃完药有点嗨,这是吃到万灵药后喊出的剧本台词,有点小羞耻呢。不过我关心的是扣健康的成效,要吃几次达到负回血的健康值?
图22
  好吧,最后一个失误出现了,就是我对健康系统的理解。

  健康系统,包含健康值(id=health)与健康修正(id=healthy),前者是真正发挥影响的判定,后者是影响前者的判定,举例来说,你吃下垃圾食品不会直接降健康值,而是降健康修正,修正值与健康值会不断平衡(可以理解成化学式的动态平衡)。
  现行代码里,没法直接扣健康值,然而修正值的下限只到负200,也就是说,我的道具最低只能把健康修正压到-200,多了没用。   罢了,先来测试健康值能压到多少。

  刚吃药,健康值/修正值=0/-200
  经过1小时:-37/-180
  经过2小时:-63/-162   经过3小时:-80/-146
  经过4小时:-91/-132
  经过5小时:-98/-119
  经过6小时:-101/-107
  乍看之下,降健康的速度不错,连续使用的话会把健康压得非常低,然而…
  睡一觉起来,健康值立马回升到-70以上 Σ(っ°Д°;)っ!!
  后来我试着在突变中添加healthy_rate,试着改变健康值变化速率,设为0.33代表动态平衡速率变为1/3,期望将停留在低健康值的时间延长为3倍,然并卵,依旧是睡2觉就恢复得差不多,或将速率设为12倍,期待迅速拉低健康值,然并卵,依旧是一觉好眠,理想的负回血没有出现,依然睡得美滋滋。
  健康值的动态平衡出乎意料地顽强,在初始测试中轻易突破-120,但每次都在2天内升回-40以内,而修正值的下限是-200,意味着连续使用不会造成太大负担,因为不能直接扣健康值。
  顺带一提,试调状态下负回血要到-400…
  经过测试后,证实想用扣健康的方式作为使用灵药的负反馈,这个想法破产了,因为没法把健康值拉到预期的负回血,除非1. 有办法直接扣健康值 2.修正值的下限拉得更低。
  不过还是有机会在现行代码中完成初始构想,记得肾上腺素和酒醉状态的buff吗?那是一种有起伏的effect,例如酒精摄取初期是正面buff,超过一定量转为负面buff,肾上腺是一开始正面buff,消退期转为debuff,这些代码都在effect.json内,而effect也可以增减血量的,冻伤就是例子。所以做出恢复HP的buff,之后给予一个负面期,使用时顺便扣点健康修正,来达到遏止玩家过度用药是有可能办到的,但是,这题超纲啦!
  这个突变没能很好的刻画出来,主要是负反馈不足降低了可玩性,但作为示范我觉得可以,能够展示构筑mod的过程,以及探索mod的表现力,json是有限的,但人的想法可以有很多!

通过本帖,希望你学会了:

  1. 如何开始一个mod
  2. 设定一个职业
  3. 设定一个基础突变,给它附加一些东西。
  4. 以原版道具为模型,设定一个新道具。
  5. 构想一个新突变,试着用游戏现有的条件完成它(进阶)。

后记:
  本帖献给所有沉迷CDDA的玩家。
  如果说阅读是人与文字的全面互动,游戏就是人与代码的全面互动。
  在游戏文件里,你会看见凯文试图用代码构筑一个世界,每段代码背后都是一位制作者在塑造它,把它放到游戏世界里发挥作用,其中不乏具聪明的、别具匠心的、完美诠释现实物品的设计、当然也有充满槽点的、反游戏性的、不知为何存在的部分。而CDDA世界也在不断吸纳、消化新的想法,部分mod中不错的部分也时不时加入其中,我认为每个玩家都该有属于自己的个人化模块,这是CDDA迷人的地方,能让你轻易的塑造想法进去。
  例如,我知道怎么焊接,为什么游戏中没有焊出脚轮的配方?如果是你能在现实中/理论上办到的事,为什么不设定条件让你的角色也能办到?如果你觉得游戏的某些设定不合常理,例如长矛体积只有长棍的1/2,后者却没有前者的打击距离,为什么不自己动手丰衣足食?个人化模块能满足每个人的需求,雕塑自己的理想世界,当然一开始不会做得很好,每个人品味不同,肯定会很多沙雕东西,但就像CDDA世界一样,总有些好东西会诞生,不是吗?



评论须知:

本站禁止一切无意义刷屏言论和攻击言论等不当言论,如违规将予以删除并视情况决定是否拉入黑名单,使用一次性邮箱账号发表的无营养评论会一律删除,请大家使用自己的社交账号登陆,谢谢!