本文へスキップ
ドキュメント
このページの内容

アーカイブと保護

レベルはフォルダー、tar.gz、zipとしてエクスポートでき、パスワードもかけられます:AES-256のzipかOpenPGPです。受け取ったファイルのフォーマットは、SDKが名前ではなく先頭のバイトで判定します

エクスポートモード

レベルはLevelExportModeのいずれかの形でデバイスを離れます:

値モード書き出されるもの保護
0Folderディスク上と同じ形の普通のフォルダーなし
1FolderProtectedLevellevel.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

2つの保護方式

パスワードでレベルを保護するデフォルトの方法はZipEncryptedです。受け取る側はアーカイバーを持っていても、gpgは持っていない可能性が高いからです

OpenPGPは、ドキュメント、フォルダー、アーカイブを1つの方式で保護します。フォルダーを保護できるのは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エントリー
  • エントリーあたり512 MiB
  • 合計1 GiB

渡されたストレージの外には何も展開しません

エディター側から見たエクスポート:エクスポートと保護