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

ゲーム SDK リファレンス

@caputchin/game-sdk は、ゲームの作者が対して書く契約です。register ヘルパー、push 専用の Bridge、ラウンドごとの GameContext、そしてマニフェストのプリセットブロックの TypeScript の型です。ユーザー向けのウィジェットとは別に公開されるので、ゲームは決して推移的にウィジェットのランタイムをバンドルしません。ファーストパーティのゲームもこの同じ公開 API を使います。私的な契約はありません。

ガイド付きの作成は マーケットプレイスゲームを作る を参照してください。この SDK が表に出すプリセットを宣言するマニフェストは caputchin.json マニフェスト を参照してください。

register(factory)

単一の登録のエントリーポイント。あなたのゲームファクトリーを渡します。マニフェストは渡し ません(サーバーがインデックス時に caputchin.json を読み、解決済みのプリセットをファクトリーのコンテキストとして送り下ろします)。2 回登録するとコンソールの警告がログされ、最後の書き込みが勝ちます。プラットフォームの強制はありません。

register(factory: GameFactory): void

ゲームファクトリー

type GameFactory = (
  container: HTMLElement,
  bridge: Bridge,
  ctx?: GameContext,
) => (() => void) | void
パラメータ意味
containerゲームのサンドボックス化された iframe の中の要素。ここにレンダリングします。スタイルは自然にスコープづけされます。iframe はそれ自身のドキュメントです。
bridgeホストへの push 専用のチャネル(ブリッジ 参照)。ゲームは上向きに発します。購読はしません。ファクトリーが呼ばれることが開始のシグナルです。
ctxラウンドごとの コンテキスト(シードに加えて解決済みのプリセット)。ウィジェットが検証済みのセッションの外でゲームを走らせ得るので、型では任意です。
returnウィジェットがあなたのゲームをアンマウントするときに呼ぶ、任意のクリーンアップ関数。

ブリッジ

ブリッジは push 専用です。ゲームはイベントをホストに報告し、決して聞きません。そのメンバー:

メンバー効果
passpass(result: { trace: string }): voidラウンドが 通った ことを知らせ、不透明な trace をホストに渡します。サーバーは、権威ある判定を計算するために、発行されたシードのもとでゲームの run を再実行するので、ゲームはここでスコアを報告し ません。最初の呼び出しが保留中の検証を解放してトークンをロックします。後の呼び出しは無視されます。
errorerror(err: { code: string; message?: string }): voidゲーム自体が失敗した(アセットの読み込み、内部の例外)。ユーザーに error イベントを表に出します。何も呼ばないことで知らされるプレイヤーの負けとは別物です。
setSizesetSize(width: number, height: number): voidコンテンツに合わせて iframe を明示的にリサイズします。最初の描画の後に呼びます。ウィジェットはゲームの最初の子も自動測定するので、ほとんどのゲームはこれを決して要しません。
layoutreadonly layout: 'inline' | 'modal' | 'fullscreen' | nullゲームが走る解決済みの表現、または不明なときは null

意図的に、complete も、start のリスナーも、unmount メソッド(代わりにクリーンアップ関数を返す)も、沈黙を超える失敗のシグナルもありません。

コンテキスト

interface GameContext {
  seed:   Seed          | null
  locale: ResolvedLocale | null
  skin:   ResolvedSkin   | null
  config: ResolvedConfig | null
}
フィールド意味
seedラウンドごとのリプレイのシード(リプレイ契約の Seed)。すべてのゲームのランダム性をそれからシードします。ゲームが検証済みのセッションの外で走るときは null
locale解決済みの言語オブジェクト:_lang(BCP-47)、_direction、に加えてあなたの平坦化されたテキストキー。マニフェストが locales ブロックを出荷しないなら null
skin解決済みのスキン:_theme に加えてあなたの平坦化された色/アセットのキー、アセットの URL はすでに絶対。_theme は常にスキンが解決された具体的なモード、lightdark(決して any ではない)なので、テーマに依存しないプリセットも訪問者の実際のモードを報告します。skins ブロックがないなら null
config解決済みの構成:あなたの平坦化された型付きスカラー。configurations ブロックがないなら null

対応するマニフェストのブロックが欠けているとき、それぞれが null なので、常に組み込みのフォールバックを与えてください。

プリセットの型

SDK は、型チェックつきで caputchin.json(と分割された .caputchin/ ファイル)を作るための TypeScript の型をエクスポートします。これらは マニフェスト のブロックを映します:

何を記述するか
GameManifestcaputchin.json 全体。作者 + インデクサーの真実の源。ブラウザでは決して読まれません。
LocalePreset / ResolvedLocale宣言されたロケールのプリセット / ゲームが受け取る解決済みのオブジェクト。
SkinPreset / ResolvedSkin / SkinSchemaEntry / SkinValueTypeスキンのプリセット、解決済みのスキン、キーごとの型スキーマ。
ConfigPreset / ResolvedConfig / ConfigSchemaEntry / ConfigValueType構成のプリセット、解決済みの構成、キーごとの型スキーマ。
LocalesFile / SkinsFile / ConfigurationsFile.caputchin/<axis>.json 分割ファイルのトップレベルのオブジェクト。
MarketplaceMetadata / PreferredPresentationmarketplace ブロックと、preferred のフットプリントのヒント。

コンパイラがチェックするよう、satisfies インポートで分割ファイルを作ります:

import type { LocalesFile } from "@caputchin/game-sdk";
export default { schema: { /* ... */ }, presets: { /* ... */ } } satisfies LocalesFile;

意図的に欠けているもの

  • sessionId もプラットフォームの識別子もゲームに届きません。
  • start / pause / resume のライフサイクルのフックはありません。ファクトリーの呼び出しが開始です。
  • maxScore もプラットフォームのスコア範囲もありません。判定のスコアはあなたの run が返すものです。

契約は意図的に小さく、カタログの何年もの成長にわたって安定したままです。

あわせて読む

このページの内容