Caputchin
Pengembangan game marketplace

Referensi game SDK

@caputchin/game-sdk adalah kontrak yang menjadi dasar penulisan penulis game: sebuah helper register, sebuah Bridge push-only, GameContext per-ronde, dan tipe TypeScript untuk blok preset manifest. Ia diterbitkan terpisah dari widget menghadap-pengguna agar game tak pernah secara transitif membundel runtime widget. Game milik sendiri memakai API publik yang sama ini; tak ada kontrak privat.

Untuk build terpandu, lihat Bangun game marketplace. Untuk manifest yang mendeklarasikan preset yang dimunculkan SDK ini, lihat Manifest caputchin.json.

register(factory)

Titik masuk pendaftaran tunggal. Lewatkan game factory-mu; kamu tak melewatkan manifest (server membaca caputchin.json saat-indeks dan mengirim preset terselesaikan ke bawah sebagai konteks factory). Mendaftarkan dua kali mencatat peringatan konsol dan tulisan terakhir menang; tak ada penegakan platform.

register(factory: GameFactory): void

Game factory

type GameFactory = (
  container: HTMLElement,
  bridge: Bridge,
  ctx?: GameContext,
) => (() => void) | void
ParameterMakna
containerSebuah elemen di dalam iframe ber-sandbox game. Render di sini. Gaya tercakup secara alami, iframe adalah dokumennya sendiri.
bridgeKanal push-only ke host (lihat Jembatan). Game memancar ke atas; ia tak berlangganan. Factory yang dipanggil adalah sinyal mulai.
ctxKonteks per-ronde (seed plus preset terselesaikan). Opsional dalam tipe karena widget bisa menjalankan game di luar sesi terverifikasi.
returnFungsi pembersihan opsional yang dipanggil widget jika ia melepas game-mu.

Jembatan

Jembatan adalah push-only: game melaporkan event ke host dan tak pernah mendengarkan. Anggotanya:

AnggotaBentukEfek
passpass(result: { trace: string }): voidMenandakan ronde lolos, menyerahkan host trace opaque. Server menjalankan-ulang run game di bawah seed yang diterbitkan untuk menghitung vonis otoritatif, jadi game tak melaporkan skor di sini. Panggilan pertama melepaskan verifikasi yang ditahan dan mengunci token; panggilan berikutnya diabaikan.
errorerror(err: { code: string; message?: string }): voidGame itu sendiri gagal (muatan aset, eksepsi internal). Memunculkan event error ke pengguna. Berbeda dari pemain kalah, yang ditandakan dengan tak memanggil apa pun.
setSizesetSize(width: number, height: number): voidMengubah ukuran iframe secara eksplisit agar cocok konten. Panggil setelah cat pertama; widget juga mengukur-otomatis anak pertama game, jadi kebanyakan game tak pernah butuh ini.
layoutreadonly layout: 'inline' | 'modal' | 'fullscreen' | nullPresentasi terselesaikan yang game jalankan di bawahnya, atau null saat tak diketahui.

Sengaja tak ada complete, tak ada pendengar start, tak ada metode unmount (kembalikan fungsi pembersihan sebagai gantinya), dan tak ada sinyal kegagalan di luar keheningan.

Konteks

interface GameContext {
  seed:   Seed          | null
  locale: ResolvedLocale | null
  skin:   ResolvedSkin   | null
  config: ResolvedConfig | null
}
BidangMakna
seedSeed putar-ulang per-ronde (sebuah Seed dari kontrak putar-ulang). Semai semua keacakan game darinya. null saat game berjalan di luar sesi terverifikasi.
localeObjek bahasa terselesaikan: _lang (BCP-47), _direction, plus kunci teks-mu yang diratakan. null jika manifest-mu tak mengirim blok locales.
skinSkin terselesaikan: _theme plus kunci warna/aset-mu yang diratakan, URL aset sudah absolut. _theme selalu mode konkret yang skin diselesaikan untuknya, light atau dark (tak pernah any), jadi preset agnostik-tema melaporkan mode aktual pengunjung. null jika tak ada blok skins.
configKonfigurasi terselesaikan: skalar bertipe-mu yang diratakan. null jika tak ada blok configurations.

Masing-masing null saat blok manifest yang sesuai absen, jadi selalu sediakan cadangan bawaan.

Tipe preset

SDK mengekspor tipe TypeScript untuk menulis caputchin.json (dan berkas split .caputchin/) dengan pemeriksaan-tipe. Ini mencerminkan blok manifest:

TipeMendeskripsikan
GameManifestSeluruh caputchin.json. Sumber kebenaran penulis + pengindeks; tak pernah dibaca di peramban.
LocalePreset / ResolvedLocalePreset locale yang dideklarasikan / objek terselesaikan yang diterima game.
SkinPreset / ResolvedSkin / SkinSchemaEntry / SkinValueTypePreset skin, skin terselesaikan, dan skema tipe per-kunci.
ConfigPreset / ResolvedConfig / ConfigSchemaEntry / ConfigValueTypePreset konfigurasi, config terselesaikan, dan skema tipe per-kunci.
LocalesFile / SkinsFile / ConfigurationsFileObjek tingkat-atas tiap berkas split .caputchin/<axis>.json.
MarketplaceMetadata / PreferredPresentationBlok marketplace dan petunjuk jejak preferred.

Tulis sebuah berkas split dengan impor satisfies agar kompiler memeriksanya:

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

Apa yang sengaja absen

  • Tak ada sessionId atau pengenal platform yang mencapai game.
  • Tak ada hook siklus-hidup start / pause / resume; panggilan factory adalah mulai.
  • Tak ada maxScore atau rentang skor platform; skor vonis adalah apa pun yang dikembalikan run-mu.

Kontrak sengaja mungil agar ia tetap stabil lintas tahun pertumbuhan katalog.

Lihat juga

Di halaman ini