跳到正文
文件
本頁內容

歸檔包與保護

關卡可匯出為資料夾、tar.gz或zip,並可選擇加密碼:AES-256加密的zip或OpenPGP。SDK根據收到檔案的開頭位元組判斷格式,而不是根據檔名

匯出模式

關卡以LevelExportMode的某種形式離開裝置:

值模式寫出什麼保護
0Folder普通資料夾,與磁碟上的結構相同無
1FolderProtectedLevel只有level.json.gpg加密的資料夾OpenPGP
2TarGz<name>.tar.gz無
3TarGzProtected<name>.tar.gz.gpgOpenPGP
4Zip<name>.zip無
5ZipProtected<name>.zip.gpgOpenPGP
6ZipEncrypted條目以AES-256加密的<name>.zipzip自帶

數字是模式的身份,永遠不變。編輯器下拉式清單中的順序另行設定(DisplayOrder)

每種格式都是開放標準。tar -xzf、gpg -d和任何壓縮工具都能在沒有遊戲的情況下開啟它們:

gpg -d level.tar.gz.gpg > level.tar.gz
tar -xzf level.tar.gz

兩種保護方案

ZipEncrypted是用密碼鎖住關卡的預設方式。接收方有壓縮工具,但很可能沒有gpg

OpenPGP用同一種方案鎖住文件、資料夾和歸檔包。只有它能保護資料夾

在FolderProtectedLevel中,後設資料、封面和媒體檔案仍然可讀。所以關卡瀏覽器仍然能顯示卡片

內部副檔名保留在檔名中:level.json.gpg。gpg -c level.json正是這樣命名檔案的,所以無需猜測就能知道格式

裡面放什麼

LevelArchiveBuilder根據模型計算內容,而不是根據資料夾中的檔案列表。關卡沒有引用的檔案留在外面。報告會說明留下了多少這樣的檔案

關卡的引用這樣處理:

  • 使用AbsolutePath的資源複製進歸檔包。它的引用改寫為LevelPath,但只在匯出的副本中改寫
  • DirectUrl保持原樣並記入報告:URL無法放在檔案裡一起帶走
  • 缺失的檔案以程式碼archive.resource_missing記入報告

按位元組識別

檔名誰都能寫。所以ArchiveFormatSniffer根據開頭的8個位元組判斷:

開頭位元組格式
1F 8BTarGz
50 4B 03 04、50 4B 05 06、50 4B 07 08、50 4B 30 30Zip
37 7A BC AF 27 1CSevenZip
OpenPGP資料包標籤,最後檢查OpenPgp:解密後重新識別
警告

.7z既不讀取也不寫入。識別它只是為了讓拒絕資訊能說出它的名稱(Unsupported)。這樣使用者會把關卡重新打包成zip,而不是認為檔案壞了

讀取

LevelArchiveReader.ReadAsync接受資料夾或支援定位的Stream。它返回LevelArchiveContent,其中LevelArchiveOpenResult是以下值之一:

結果含義
Ok已讀取
PassphraseRequired沒有密碼,需要詢問
WrongPassphrase使用者已經輸入了密碼,但密碼錯誤
Damaged檔案已損壞
NotAnArchive這不是歸檔包
Unsupported格式已識別,但不受支援

PeekMetaAsync只讀取後設資料,用於卡片或目錄

伺服器讀取的是別人決定上傳的任何東西。所以讀取器在ArchiveLimits的限制內工作。預設限制為:

  • 4096個條目
  • 每個條目512MiB
  • 總計1GiB

任何內容都不會解壓到分配給它的儲存之外

編輯器一側的匯出:匯出與保護