死亡细胞Mod制作教程
文件官方在游戏的根目录下放置了一个ModTools文件夹。里面包含了制作Mod所需的文档ModsDoc.pdf以及各种工具。原理所谓mod就是修改。游戏的运行需要一系列资源文件,这些文件在游戏打开时会被加载。而mod提供了一些同类的资源文件。一旦用户开启mod,就会将mod中的资源替换掉默认加载的同类资源文件,从而实现对游戏的修改。游戏允许同时加载多个mod。然而若同时加载的多个mod修...
原理
所谓mod就是修改。
游戏的运行需要一系列资源文件,这些文件在游戏打开时会被加载。而mod提供了一些同类的资源文件。一旦用户开启mod,就会将mod中的资源替换掉默认加载的同类资源文件,从而实现对游戏的修改。
游戏允许同时加载多个mod。然而若同时加载的多个mod修改了同样的资源文件或者都带有脚本文件,那么这些mod就会冲突,此时mod就会失效。
具体的判定依据为:
- 两个mod都有脚本文件
- 两个mod都修改了除CDB外的同一个文件
- 两个mod都修改了CDB文件的同一行
为了避免游戏崩溃以及存档损坏,每当游戏有更新时,所有mod都会被禁用,并且使用了mod的存档会从头开始。
res.pak
游戏使用了pak作为文件压缩格式。pak本质上与rar/zip是相同的,都是压缩文件,只是pak主要针对游戏的设计和使用而开发的。打开游戏的根目录,可以看到一个res.pak文件,大小有557M,该文件中包含了游戏所用到的所有资源文件。
因此,若要对游戏的数据进行修改,需要对pak文件进行解压,找到需要修改的文件并修改后,将这些修改的资源文件打包为mod。
res.pak解压后得到的所有文件中主要关注2种文件:
- Data.cdb:数据文件。包含游戏外的设置以及游戏内的布局、参数等。Data.cdb的本质是一个巨大的Json文件,需要借助CastleDB来修改。若只是要修改房间地图部分,也可以使用RoomEditor.exe。只是里面的内容都是英语法语混合,对开发者并不是特别友好。
- atlas和png:png是贴图文件,游戏的所有纹理都是png。将许多png放在一起合并成一张大的png,就是atlas。因此要修改游戏的纹理,就需要借助AtlasTool来展开atlas文件,修改后再重新生成一张新的atlas。
工具
官方在游戏的根目录下放置了一个ModTools文件夹。里面包含了制作Mod所需的文档ModsDoc.pdf以及各种工具。
ModTools文件夹下一共提供了6个工具:
- PAKTool.exe:res.pak文件的解包/打包工具。
- AtlasTool.exe:atlas图集文件的解包/打包工具。
- CDBTool.exe:Data.cdb文件的解包/打包工具。使用CastleDB的话,不需要该工具。
- ScriptTool.exe:脚本制作工具。
- RoomEditor.exe:Data.cdb房间地图部分编辑器。
- CastleDB:Data.cdb编辑工具。
CastleDB是文件夹,其他5个都是exe文件。这5个exe只有RoomEditor.exe和ScriptTool.exe是可直接运行的,其他都是命令行工具,需要打开cmd命令行,cd到该目录下,然后调用命令来使用。下文将不再强调这一点,直接运行对应命令。
重点,这些工具所运行命令的路径中不要包含空格在内的特殊字符。因此建议直接在磁盘根目录下新建一个文件夹。这里创建了一个D:\Test文件夹,下文命令中将都使用该文件夹。
PAKTool
PAKTool.exe主要用于对res.pak文件进行解压,并将修改后的资源文件打包为mod。
一个打包好的mod文件,包含一些res.pak中修改的文件,以及放在./Script/Struct/
文件夹下的脚本。
注意整个过程中游戏本体的res.pak并没有被修改。
解压
在D:\Test文件夹下创建一个res文件夹用于存放解压后的res.pak文件。
运行命令:
PAKTool.exe -Expand -outdir D:\Test\res -refpak ..\res.pak
其中:
- -outdir:存储目录。
- -refpak:要解压的文件。
..\
代表上一级目录,故而..\res.pak
代表上一级目录下的res.pak文件。
运行命令后等待解压完成,即可在res文件夹下看到所有解压出的资源文件。
完整打包
将打包后的pak文件直接放在D:\Test文件夹下。
运行命令:
PAKTool.exe -Collapse -indir D:\Test\res -outpak D:\Test\res.pak
等待执行完成,即会在D:\Test文件夹下生成一个res.pak文件。注意-outpak
指定的路径中包含生成的文件名。
然而该命令的作用是将整个文件夹打包成一个pak文件。对于mod制作,往往并不会使用该命令。
差异打包
在D:\Test文件夹下创建一个diff文件夹用于存放打包后的差异pak文件。
运行命令:
PAKTool.exe -CreateDiffPak -refpak ..\res.pak -indir D:\Test\res -outPak D:\Test\diff\resDiff.pak
等待执行完成,即会在diff文件夹下生成一个resDiff.pak文件。由于该pak仅包含差异文件,因此其大小视改动内容的不同而不同。
若是没有改动,则不会生成任何文件,并会弹出一个错误提示。正确做法是,将所有改动的文件都复制到res文件夹下替换,然后进行差异打包。
AtlasTool
AtlasTool.exe主要用于将atlas图集文件解压为一个文件夹,以及将一个包含png的文件夹压缩为一个atlas文件。这样就可以对游戏中的贴图进行修改。
解压
在D:\Test文件夹下创建一个atlas文件夹用于存放解压后的图集文件。
例如,将res\atlas\achievements.atlas文件进行解压,运行命令:
AtlasTool -Expand -outdir D:\Test\atlas -atlas D:\Test\res\atlas\achievements.atlas
完成后,即会在atlas文件夹下生成所有成就的png文件。
也可以使用-ExpandAll
命令来将文件夹下所有的atlas文件进行解压,具体可以参考ModsDoc.pdf。
打包
现在要将D:\Test\atlas文件夹下的所有png文件进行打包,运行命令:
AtlasTool -Collapse -indir D:\Test\atlas -atlas D:\Test\achievements.atlas
完成后,即会在D:\Test文件夹下生成achievements.atlas文件。同时还会生成一个achievements.a.atlas文件和一个achievements.a_n.png文件。
也可以使用-CollapseAll
命令来将文件夹下所有的文件夹进行打包,具体可以参考ModsDoc.pdf。
CDBTool
CDBTool.exe用于解压/打包Data.cdb文件。解压后Data.cdb中的各项设置会单独保存为json并存放于各类文件夹中,结构更清晰。但这样的方式依然是直接修改文件,,远不如CastleDB直观和保险。通常来说,对Data.cdb文件的修改往往推荐使用CastleDB,不推荐使用CDBTool.exe。
Data.cdb文件是一个很大的json(11.4M),因此可以直接用notepad++这样的记事本应用直接打开。若是简单修改且对json的结构熟悉,采用这样的方式更加高效。
解压
在D:\Test文件夹下创建一个cdb文件夹用于存放解压后的data.cdb文件。
运行命令:
CDBTool.exe -Expand -outdir D:\Test\cdb -refcdb D:\Test\res\data.cdb
其中:
- -outdir:存储目录。
- -refcdb:要解压的文件。
运行命令后等待解压完成,即可在D:\Test\cdb文件夹下看到所有解压出的资源文件。
打包
完整打包打包与PAKTool.exe相同,用法和参数类似。
CDBTool.exe -Collapse -indir D:\Test\cdb -outcdb D:\Test\data.cdb
而差异对比则与PAKTool.exe不同,差异对比仅仅会将修改的文件复制到目标文件夹。
CDBTool.exe -CreateDiffCdb -refcdb D:\Test\res\data.cdb -indir D:\Test\cdb -outdir D:\Test\diff
这样可以方便开发者明确自己修改了哪些文件。
确定修改无误后,需要对cdb文件夹进行完整打包,从而生成一个新的cdb文件。
ScriptTool
ScriptTool.exe用于创建脚本。
直接运行
ScriptTool.exe可双击直接运行。
运行后,该工具右侧是脚本内容区,左侧有4个按钮:
- Generate default:生成默认的脚本。默认脚本指定了脚本的格式,在此框架下修改各个函数的内容即可。
- Generate mob roster:生成指定怪物列表。相比于默认生成的脚本,
function buildMobRoster(_mobList)
的内容有所不同,是根据所选择的怪物列表生成的。 - Get script color:选择一种颜色的值,并复制到剪贴板。
- Copy script to:复制脚本内容到剪贴板。但该按钮有时会消失。鉴于右侧的脚本内容可以自由选择复制,该按钮形同虚设。
创建一个空的main.hx文件,将右侧脚本内容区的内容复制粘贴该文件中即可。
命令行方式控制
ScriptTool.exe虽然可以双击直接运行,但ScriptTool.exe也接受命令行方式控制:
在D:\Test文件夹下创建一个script文件夹用于存放创建后的脚本文件。
运行命令:
ScriptTool.exe -commandline -newfile -outscript D:\Test\script\main.hx
运行命令后会在D:\Test\script文件夹下生成一个main.hx文件,其内容就是默认的脚本内容。
脚本API
关于脚本文件可用的API,官方提供了详细的文档,打开ModTools\Scripts\TechnicalDocumentation\index.html 文件即可看到。
RoomEditor
RoomEditor.exe用于data.cdb文件中房间地图的修改。仅仅可用于地图修改,无法修改data.cdb文件中除房间以外的其他内容。
这是一个可视化工具,直接双击运行,然后打开data.cdb文件即可。
详细用法可参考ModsDoc.pdf。
CastleDB
CastleDB用于编辑data.cdb文件。相比于RoomEditor.exe,CastleDB不仅可以编辑房间地图,还可以更改data.cdb文件中所有的设置项。
CastleDB文件夹下只有一个castle.js文件,这是个设置文件,无法直接使用。我们需要去官网下载对应的工具:
http://castledb.org/
下载后解压,得到一个castledb文件夹。将上面的castle.js文件复制进来,替换。然后选择菜单中的File→Open,打开data.cdb文件。打开后,下方会列出一排标签,对应不同的内容。
- truelle:游戏的各种基础设置,例如像素的大小,人物的眼睛颜色,生命条,移动速度,图标,等等。
- item:所有游戏物品的属性设置。包含:掉落物品、所有武器和技能、食物、各种钥匙等收集物品,等等。
- mob:所有怪物的属性设置。
- weapon:武器设置,包含近战、弓、盾牌。
- affix:游戏的各种附加设置,例如四种颜色(绿/红/紫/无色)属性,升级费用,被感染食物,火焰伤害,各种词条,等等。
- itemTag:各种标签对应的贴图。
- level:各个地图及其入口设置。
- room:所有地图房间的组成部分。一副地图是由N个room组合而成。而这些room是已经确定的。room指的是地图房间的数据,不含贴图。
- roomMarker:各地图房间数据所对应的贴图。例如水的贴图,电梯的贴图,等。
- roomType:各地图房间的类型。
- lightConf:各种光线的设置。例如英雄的本体颜色,是否禁用墙面阴影,半径,深度等。
- biome:环境设置。各个地图的不同部分所用的不同环境设置。例如,下水道的水颜色是绿色,而旧下水道的水颜色是棕黄色。
- layer:各个图层排列顺序。目前共有7个图层。
- scatterConf:太阳、月亮、天空等属性设置。
- blueprintDrop:各种级别的图纸爆率。
- dailyReward:每日挑战奖励设置。
- tier:三种颜色(红/绿/紫)的贴图。
- difficulty:6种难度的属性设置。即所谓的0细胞-5细胞。
- backFrames:各种武器的暴击率。其中ABCD表示该武器的第几次攻击。
- loreRoom:各种奖励房间设置。
- gui:游戏本体的各种设置,例如标题属性,暂停,小地图,文本颜色等。
- skin:主角的各种皮肤。
需要解释一点就是爆率。游戏采用的随机是生成前随机,而生成后一切都是固定的,包括怪物及其掉落的物品。这也是为什么可以输入种子来玩跟其他玩家一样的地图。故而,一个地图的怪会爆出什么物品是一开局就确定的。因此这个爆率并不是指玩家打死一个怪有多大几率会爆出指定物品,而是这个怪在生成时有多大概率会一定掉落该物品。
对于100%爆率,指的并非是每个该种类的怪都一定爆出该物品,而是指本地图该类型的怪一定有一个会掉落该物品。例如,第一个图被囚者牢房的绿僵尸会爆出血之刃图纸,其爆率为100%。这并不是说开局杀一个绿僵尸就一定会爆出血之刃图纸,而是在该图中一定有一个绿僵尸身上有血之刃图纸。至于这个绿僵尸在地图的哪个位置就不得而知了,挨着砍过去,总有一个是。
另外,若一种怪有多个100%爆率的物品,则会按物品的定义顺序依次爆出。且一个图的同一种怪只能爆出一个100%爆率物品。例如国王之手,会爆出6种物品,分别是震地冲击图纸和5种皮肤(国王之手装束/忠诚/刚直/信任/献身),这6种物品的爆率都是100%。于是杀一次国王之手就顺序爆一种物品出来,第1次杀一定是爆震地冲击图纸,第2次杀一定是爆国王之手装束,第6次杀一定是爆国王之手装束:献身。至于BOSS细胞,属于任务物品,与爆率物品是分开的。
流程
制作Mod
- 用PAKTool.exe对res.pak进行解包,目录设为res文件夹。
- 对res文件夹的文件做相应的修改。若对某些Atlas文件或者CDB文件进行了解包并修改,要重新打包为Atlas文件及CDB文件。
- 将修改后的文件复制到res文件夹替换掉同名文件。
- 用PAKTool.exe对res文件夹进行差异化打包,生成一个新的res.pak。
最终生成的差异化res.pak文件就是我们的Mod。
测试Mod
加载一个Mod需要在创意工厂对Mod进行订阅。而这意味着一个Mod必须先上传到创意工坊,然后才能被订阅。现在希望我们先自己测试Mod后再上传到创意工坊,而要测试就必须先上传到创意工坊……
于是死亡细胞官方在创意工坊提供了一个Dummy Mod,只要订阅该Mod,然后将该Mod的res.pak文件替换为我们自己生成的差异化res.pak文件即可。这样当我们在游戏中使用Dummy Mod时,实际就是在使用我们自己的Mod。
Dummy Mod地址:
https://steamcommunity.com/sharedfiles/filedetails/?id=1405810340
订阅并下载后,打开steam根目录,找到Mod的安装目录:
steam\steamapps\workshop\content\588650\1405810340
在该目录下有1个文件夹和3个文件。
1个文件夹为Scripts,里面有一个Struct文件夹,其下带有一个默认的main.hx。该脚本文件对关卡进行了修改。若要测试脚本文件,则替换该main.hx即可。
3个文件为:
- preview.png: 预览图。用于Mod封面。
- res.pak: 核心文件。
- settings.json: Mod设置。
替换掉其中的res.pak即可。
上传Mod
上传Mod步骤为:
- 单独创建一个文件夹,将我们的res.pak放到该文件夹下。
- 添加preview.png和settings.json。
- 上传。
settings.json
settings.json是配置文件,其内容为:
{
"category": "Gameplay",
"name": "A Test Mod",
"visibility": "Public"
}
其中:
- category:分类。取值为
Gameplay
/Cosmetic
/Test
。注意不可以设置为Language
。 - name:Mod的名称。建议见名知意。
- visibility:Mod的可见性。取值为
Public
/Friends
/Private
,分别代表:所有人可见/仅自己和朋友可见/仅自己可见。
上传
设Mod相关文件放在D:\Test\MyMod文件夹下。
-
打开cmd,定位到游戏的根目录文件夹,输入命令:
deadcells.exe -workshop
会弹出一个steam窗口,点OK。
-
弹出一个新的窗口,提示输入
n
来创建一个新的工作室,或者输入q
退出。
在弹出的窗口中输入n
,会提示输入Mod的路径,也就是D:\Test\MyMod。 -
提示即将创建一个Mod,且Mod名称将不可修改。输入
yes
确定,Mod即会进行上传。
实例
雷盾是由观星台的守卫者掉落。现在要编写一个Mod,让第一幅地图的绿僵尸100%掉落雷盾。但该例子并非是获取雷盾图纸的最佳Mod方式,仅仅是为了展示如何修改怪物掉落以及100%爆率的概念。
依然是使用D:\Test文件夹。
-
使用PAKTool.exe解压res.pak:
PAKTool.exe -Expand -outdir D:\Test\res -refpak ..\res.pak
-
下载CastleDB工具并替换castle.js文件后,打开解压后的res.pak下的data.cdb文件。
-
选择标签mob:
可以看到第一行就是绿僵尸,name是Zombie。我们关注的是该行倒数第二列blueprints这个属性。
点击blueprints属性内容,下方会出现详细信息:
即绿僵尸掉落3个物品,分别为:双向弩弓塔、血之刃、波比装束。爆率分别为:Rare/Always/Rare。
选择标签blueprintDrop,可以看到各种爆率为:
也就是说,第一个图中的绿僵尸一定有一只会掉落血之刃。
-
现在要让绿僵尸掉落雷盾,那么我们首先要找到雷盾的id。选择标签item,在Shield分类下找到了雷盾:
可见其id为ThunderShield
。
然后回到mob标签,在绿僵尸掉落的详情列表中点右键,选择Insert,插入一条新数据。item这一栏双击后出现列表,选择ThunderShield
,rarity这一栏我们选择Always,即令其本图100%掉落。minDifficulty这一栏我们选择默认的0,即最低级难度就可以爆出。
但注意这里爆率为Always的有2个物品,一个是血之刃,一个是雷盾。前面已经解释过,这意味着在拿到血之刃之前,雷盾一定不会爆出,并且若本地图爆出了血之刃,则本地图也不会再爆出雷盾。 -
修改完成后进行打包,运行命令:
PAKTool.exe -CreateDiffPak -refpak ..\res.pak -indir D:\Test\res -outPak D:\Test\diff\res.pak
打包完成后,会在D:\Test\diff下生成一个res.pak。这个res.pak由于仅仅包含差异内容,因此非常小,只有6KB。
-
现在进行测试。打开steam,在死亡细胞的创意工坊下搜索Dummy Mod并订阅。订阅并下载后,打开steam根目录,找到Mod的安装目录:
steam\steamapps\workshop\content\588650\1405810340
将上面生成的差异化res.pak复制到这里,替换。由于不需要使用脚本,于是我们将Scripts文件夹删除。
打开游戏,重开一个空白存档开始游戏,选择Dummy Mod。我们先打第一个图,爆出了血之刃。然后去收藏家交图纸。交完图纸立马重新开始游戏,再次打第一个图,顺利爆出雷盾:
-
按前面的流程上传Mod即可。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)