原理

所谓mod就是修改。
游戏的运行需要一系列资源文件,这些文件在游戏打开时会被加载。而mod提供了一些同类的资源文件。一旦用户开启mod,就会将mod中的资源替换掉默认加载的同类资源文件,从而实现对游戏的修改。
游戏允许同时加载多个mod。然而若同时加载的多个mod修改了同样的资源文件或者都带有脚本文件,那么这些mod就会冲突,此时mod就会失效。
具体的判定依据为:

  1. 两个mod都有脚本文件
  2. 两个mod都修改了除CDB外的同一个文件
  3. 两个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

  1. PAKTool.exeres.pak进行解包,目录设为res文件夹。
  2. 对res文件夹的文件做相应的修改。若对某些Atlas文件或者CDB文件进行了解包并修改,要重新打包为Atlas文件及CDB文件。
  3. 将修改后的文件复制到res文件夹替换掉同名文件。
  4. 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步骤为:

  1. 单独创建一个文件夹,将我们的res.pak放到该文件夹下。
  2. 添加preview.pngsettings.json
  3. 上传。

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文件夹下。

  1. 打开cmd,定位到游戏的根目录文件夹,输入命令:

    deadcells.exe -workshop
    

    会弹出一个steam窗口,点OK

  2. 弹出一个新的窗口,提示输入n来创建一个新的工作室,或者输入q退出。
    在弹出的窗口中输入n,会提示输入Mod的路径,也就是D:\Test\MyMod

  3. 提示即将创建一个Mod,且Mod名称将不可修改。输入yes确定,Mod即会进行上传。

实例

雷盾是由观星台的守卫者掉落。现在要编写一个Mod,让第一幅地图的绿僵尸100%掉落雷盾。但该例子并非是获取雷盾图纸的最佳Mod方式,仅仅是为了展示如何修改怪物掉落以及100%爆率的概念。
依然是使用D:\Test文件夹。

  1. 使用PAKTool.exe解压res.pak

    PAKTool.exe -Expand -outdir D:\Test\res -refpak ..\res.pak
    
  2. 下载CastleDB工具并替换castle.js文件后,打开解压后的res.pak下的data.cdb文件。

  3. 选择标签mob
    mob
    可以看到第一行就是绿僵尸,name是Zombie。我们关注的是该行倒数第二列blueprints这个属性。
    点击blueprints属性内容,下方会出现详细信息:
    blueprint
    即绿僵尸掉落3个物品,分别为:双向弩弓塔、血之刃、波比装束。爆率分别为:Rare/Always/Rare。
    选择标签blueprintDrop,可以看到各种爆率为:
    blueprintDrop

    也就是说,第一个图中的绿僵尸一定有一只会掉落血之刃。

  4. 现在要让绿僵尸掉落雷盾,那么我们首先要找到雷盾的id。选择标签item,在Shield分类下找到了雷盾:
    ThunderShield
    可见其id为ThunderShield
    然后回到mob标签,在绿僵尸掉落的详情列表中点右键,选择Insert,插入一条新数据。item这一栏双击后出现列表,选择ThunderShield,rarity这一栏我们选择Always,即令其本图100%掉落。minDifficulty这一栏我们选择默认的0,即最低级难度就可以爆出。
    AddThunderShield
    但注意这里爆率为Always的有2个物品,一个是血之刃,一个是雷盾。前面已经解释过,这意味着在拿到血之刃之前,雷盾一定不会爆出,并且若本地图爆出了血之刃,则本地图也不会再爆出雷盾。

  5. 修改完成后进行打包,运行命令:

    PAKTool.exe -CreateDiffPak -refpak ..\res.pak -indir D:\Test\res -outPak D:\Test\diff\res.pak
    

    打包完成后,会在D:\Test\diff下生成一个res.pak。这个res.pak由于仅仅包含差异内容,因此非常小,只有6KB。

  6. 现在进行测试。打开steam,在死亡细胞的创意工坊下搜索Dummy Mod并订阅。订阅并下载后,打开steam根目录,找到Mod的安装目录:
    steam\steamapps\workshop\content\588650\1405810340
    将上面生成的差异化res.pak复制到这里,替换。由于不需要使用脚本,于是我们将Scripts文件夹删除。
    打开游戏,重开一个空白存档开始游戏,选择Dummy Mod。我们先打第一个图,爆出了血之刃。然后去收藏家交图纸。交完图纸立马重新开始游戏,再次打第一个图,顺利爆出雷盾:
    MyMod

  7. 按前面的流程上传Mod即可。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐