Caputchin
マーケットプレイスゲーム開発

caputchin.json マニフェスト

リポジトリのルートの caputchin.json は、マーケットプレイスのゲームの作者とインデクサーの真実の源です。インデクサーはそれをサーバー側で読み、ゲームの身元、そのバンドルがどこに住むか、どのプリセットを提供するか、そしてどうリプレイするかを学びます。それはブラウザでは 決して 読まれません。SDK は実行時にそれを読み込みません。

このページはフィールドのリファレンスです。作成は マーケットプレイスゲームを作る を、公開は マーケットプレイスに公開する を参照してください。正確な型は SDK から GameManifest としてエクスポートされます(SDK リファレンス 参照)。

最小限の単一ゲーム

{
  "terms_accepted": true,
  "license": "MIT",
  "marketplace": {
    "name": "Leaf Memory",
    "description": "Match pairs of tropical leaves before the timer runs out.",
    "preview": "preview.png"
  },
  "npm": "@your-org/leaf-memory",
  "entry": "dist/leaf-memory.js"
}

トップレベルのフィールド

フィールド必須目的
terms_acceptedインデックスにマーケットプレイス投稿規約 に同意することを確認するため、リテラルの true でなければなりません。ほかのどの値(または欠落)も、マニフェストをインデックスから落とします。セルフホスト専用のマニフェストは省けます。
licenseインデックスにあなたのコードとバンドルされたアセットをカバーする SPDX 識別子か式。承認された識別子に評価されなければなりません(公開エラーリファレンス 参照)。
marketplaceインデックスに存在が「私をインデックスして」のシグナルです。なければ、マーケットプレイスが無視する有効な セルフホスト のゲームを意味します。marketplace ブロック 参照。
npmentry とともにインデクサーが jsDelivr URL に解決する npm のパッケージ座標。
entrynpm とともにビルドされたバンドルへのリポジトリ相対のパス。実行可能なゲームには entrynpm、または両方が存在しなければなりません。
gamesコレクションにコレクションのラッパーのためのサブマニフェストのパス。entry / npm と相互排他。コレクション 参照。
run任意専用のヘッドレスのリプレイアーティファクト。run アーティファクト 参照。
preferred任意ホストが尊重しても よい 表現のヒント。preferred ブロック 参照。
locales / skins / configurations任意iframe の中で SDK が消費するプリセットブロック。プリセットブロック 参照。

version フィールドはありません。インデクサーがバンドルを不変の ref(公開された npm バージョンか解決されたコミット SHA)に自分で固定します。

marketplace ブロック

フィールド目的
nameカードのタイトル。リポジトリ名(単一 / ラッパー)かリーフディレクトリ名(コレクションの子)にフォールバックします。
descriptionカードの副題と詳細ページの本文。
preview画像のパス(リポジトリのルートからの相対)か絶対 URL。約 600x315、被写体が中央。
version詳細ページの表示専用のバージョン文字列。任意。
support作者が宣言する互換性のフラグ(responsivetouchaccessibleaudio など)。プラットフォームが決して検証せず、フィルターとカードのアイコンとして表に出ます。
author任意の { name?, url?, email? }name / url は詳細ページに作者の署名としてレンダリングされます。email は決して表示されず、公開失敗のメールオプトイン です。3 つのサブフィールドはすべて独立です。

ブロックは完全に任意です。name / url を省くと、詳細ページは単に作者の署名を示しません(ページのほかの場所に示される GitHub の所有者は、別の、常に存在する身元で、この署名のフォールバックではありません)。email を省くと、公開失敗の通知を受け取りません。欲しいサブフィールドだけを設定します。

配布ポインター

インデクサーは、保存された完全性ハッシュが有効なまま留まるよう、各ゲームのバンドルを不変の ref に固定し、すべての実行で再解決します(日次の cron に加えて手動の「公開または更新」):

  • entry + npmcdn.jsdelivr.net/npm/<npm>@<resolved-version>/<entry> に解決されます。
  • entry だけは cdn.jsdelivr.net/gh/<owner>/<repo>@<commit-sha>/<entry> に解決されます。
  • npm だけは、固定されたバージョンのパッケージの既定のエントリーに解決されます。

ユーザー側のバージョン固定はありません。ビルドを凍結するには、ユーザーがウィジェットの game-srcカスタムゲーム)経由でそれをセルフホストします。

run アーティファクト

既定で、リプレイのセルフチェックはあなたのライブの entry バンドルを走らせます。ゲームが大きい、またはフレームワークか WASM ベースのとき、代わりに専用の lean なヘッドレスの run アーティファクトを出荷してください:

{
  "run": {
    "entry": "dist/run.js",
    "modules": [
      { "name": "sim.wasm", "type": "wasm", "path": "dist/sim.wasm" }
    ]
  }
}
フィールド意味
run.entryヘッドレスの run バンドル(リプレイ契約run エクスポート)へのリポジトリ相対のパス。
run.modulesrun が name でインポートするモジュールエントリーの任意の配列。

インデクサーが強制する制約

これらはインデックス時に検証されます。違反は公開を manifest-error で失敗させます(公開エラーリファレンス 参照)。

run.entry

  • JavaScript でなければなりません。ベース名は [a-zA-Z0-9_-]+.js に一致しなければなりません。run アーティファクトは常に JS です(WASM は下記のとおりモジュールとして出荷)。
  • クリーンなリポジトリ相対のパスでなければなりません。先頭のスラッシュ、.. のトラバーサル、空白、? / #scheme:// の接頭辞はなし。

run.modules[] エントリー{ name, type, path } です:

  • name[a-zA-Z0-9_-]+.(wasm|js) に一致しなければなりません。モジュールは JS か WASM のどちらかで、ほかには何もありません。name は、エントリーが使うインポート指定子です。
  • type は拡張子と一致しなければなりません。.wasm の名前には wasm.js の名前には js
  • name は、リプレイのホストが内部で使う 予約された 名前(entry.jsartifact.js)であってはなりません。
  • name は配列の中で 一意 でなければなりません(重複なし)。
  • path はクリーンなリポジトリ相対のパスでなければなりません(run.entry と同じルール)。
  • 最大 16 モジュール。

run を省くと、ライブの entry を直接リプレイします。アーティファクトが何をエクスポートしなければならないかは リプレイ契約 を参照してください。

preferred ブロック

任意の preferred ブロックは、表現のヒントを運びます。すべてのキーは助言的です。ホストはそれを尊重しても よく、それは明示的な埋め込みの属性を決して上書きしません。

{
  "preferred": { "width": 360, "height": 480, "layout": "modal" }
}

既定でコンテナにまたがるべきレスポンシブなゲームは、どちらの軸でも "full" を宣言できます:

{
  "preferred": { "width": "full", "height": 480 }
}
フィールド意味
width / heightピクセルのフットプリント、またはリテラルの "full"。埋め込みが width / height を未設定のままにすると、ウィジェットはそれを適用します(full を含む明示的な埋め込みの値が代わりに勝ちます)。ピクセル値は iframe をその数にサイズづけし、"full" はその軸を親を埋めるよう伸ばします。埋め込みの width="full" と同じ効果です。省くと、ウィジェットの組み込みの既定のフットプリントにフォールバックします。
layoutウィジェットがゲームの周りに作るシェル:inlinemodalfullscreen。埋め込みが layout を未設定(既定の auto)のままにするときだけ使われます。解決の順:埋め込みの layout 属性、それからこの preferred の layout、それから inline

これらのヒントは、プラットフォームがサーバー側で解決するゲーム(マーケットプレイスのゲーム、またはサイトキーなしで与えられたゲーム id)にだけ尊重されます。プラットフォームがマウント前に読めないセルフホストの game-src バンドルは、フットプリントも layout のヒントも無視します。

プリセットブロック

localesskinsconfigurations はそれぞれ、任意の schema(キーごとの型と文書)に加えて presets(名前付きのオプションのバンク)を宣言します。ウィジェットは訪問者の選択をこれらに対して解決し、あなたのゲームに平坦化された結果を ctx として渡します。完全なフィールド型のカタログは共有の カスタマイズスキーマリファレンス です。同じ型が カスタムゲームのダッシュボードスキーマ を駆動します。

skins.schema のフィールドは、color、アセット(image / audio / video)、またはスカラー(booleannumberrangelist)で、configurations と同じ制約の形({ "type": "range", "min": 0, "max": 24 }["dots","stripes"] など)を使います。スカラーのスキンの値は、構成の値とちょうど同じように、ctx.skin でその型付きの値に解決されます(number は本物の数値です)。色とアセットの値は文字列に解決されます。

スキンのプリセットの _theme は、それが働くモードを宣言します:lightdark、または any(省くと any を意味します)。lightdark のプリセットはそのモードでのみ示されます。any のプリセットはどちらの背景でも読め、両方の資格があります。モードごとに 1 つの既定があります。_default: true とマークされたプリセットは、それが資格を持つモードの既定なので、any の既定は両方をカバーします。あるモードについて複数の資格あるプリセットが既定とフラグされると、宣言順で最初のものがそれを勝ち取ります。モード固有のプリセットを any のものの上に挙げて、any のプリセットがもう片方に落ちる間、そのモードに専用のスキンを与えます。

.caputchin/ 分割ファイル

プリセットブロック(特に完全なロケールのセット)は caputchin.json を長くします。どの軸も .caputchin/ フォルダーの下の自身のファイルに移し、マニフェストを短く保ちます:

caputchin.json
.caputchin/locales.json
.caputchin/skins.json
.caputchin/configurations.json

各ファイルのトップレベルのオブジェクト その軸のブロック({ schema?, presets })です。3 つすべて任意です。優先順位は軸まるごとの置き換え、caputchin.json が勝ちます。ある軸がインラインとファイルの両方で宣言されると、インラインのブロックが使われ、ファイルは無視されます(公開時に警告されるので、死んでいたと分かります)。各軸をちょうど 1 か所に保ってください。

コレクション

リポジトリは複数のゲームを出荷できます。コレクションのラッパーは、entry / npm の代わりに子のパスを宣言します:

{
  "marketplace": { "name": "Caputchin Core Pack", "description": "The official pack." },
  "games": ["./packages/leaf-memory", "./packages/dino-runner"]
}

各パスは、自身の caputchin.json を保持する子ディレクトリを指します。子の id は owner/repo/<leaf-dir> です。ラッパーの marketplace ブロックを省くと、コレクションのページなしで子をインデックスします。

あわせて読む

このページの内容