原理
所謂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即可。