死亡細胞Mod製作教程

原理

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章