Caputchin
Pengembangan game marketplace

Manifest caputchin.json

caputchin.json di akar repositori-mu adalah sumber kebenaran penulis dan pengindeks untuk sebuah game marketplace. Pengindeks membacanya di sisi-server untuk mempelajari identitas game, di mana bundel-nya berada, preset mana yang ia tawarkan, dan cara memutarnya-ulang. Ia tak pernah dibaca di peramban; SDK tak memuatnya saat runtime.

Halaman ini adalah referensi bidang. Untuk build, lihat Bangun game marketplace; untuk penerbitan, lihat Terbitkan ke marketplace. Tipe persisnya diekspor dari SDK sebagai GameManifest (lihat referensi SDK).

Game tunggal minimal

{
  "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"
}

Bidang tingkat-atas

BidangDiwajibkanTujuan
terms_accepteduntuk pengindeksanHarus literal true untuk memastikan kamu menerima Ketentuan Pengajuan Marketplace. Nilai lain (atau hilang) membuang manifest dari indeks. Manifest khusus-swahosting boleh menghilangkannya.
licenseuntuk pengindeksanSebuah pengenal atau ekspresi SPDX yang mencakup kodemu dan aset terbundel. Harus mengevaluasi ke pengenal yang disetujui (lihat referensi galat terbit).
marketplaceuntuk pengindeksanKehadiran adalah sinyal "indeks aku". Absen berarti game swahosting yang sah yang diabaikan marketplace. Lihat Blok marketplace.
npmdengan entryKoordinat paket npm yang diselesaikan pengindeks ke URL jsDelivr.
entrydengan npmPath relatif-repo ke bundel terbangun. entry, npm, atau keduanya harus hadir untuk game yang bisa dijalankan.
gamesuntuk koleksiPath sub-manifest untuk pembungkus koleksi. Saling eksklusif dengan entry / npm. Lihat Koleksi.
runopsionalArtefak putar-ulang headless khusus. Lihat Artefak run.
preferredopsionalPetunjuk presentasi yang host BOLEH hormati. Lihat Blok preferred.
locales / skins / configurationsopsionalBlok preset yang dikonsumsi SDK di iframe. Lihat Blok preset.

Tak ada bidang version: pengindeks memin bundel ke ref tak-berubah sendiri (versi npm yang diterbitkan atau SHA commit yang diselesaikan).

Blok marketplace

BidangTujuan
nameJudul kartu. Jatuh ke nama repo (tunggal / pembungkus) atau nama leaf-dir (anak koleksi).
descriptionSubjudul kartu dan body halaman-detail.
previewPath gambar (relatif ke akar repo) atau URL absolut. Sekitar 600x315, subjek terpusat.
versionString versi hanya-tampilan untuk halaman detail. Opsional.
supportFlag kompatibilitas yang dideklarasikan-penulis (responsive, touch, accessible, audio, ...), tak pernah diverifikasi platform; dimunculkan sebagai filter dan ikon kartu.
author{ name?, url?, email? } opsional. name / url dirender sebagai byline penulis di halaman detail; email tak pernah ditunjukkan dan adalah opt-in untuk email kegagalan-terbit. Ketiga subbidang independen.

Blok sepenuhnya opsional. Hilangkan name / url dan halaman detail sekadar tak menunjukkan byline penulis (pemilik GitHub yang ditunjukkan di tempat lain di halaman adalah identitas terpisah yang selalu-hadir, bukan cadangan untuk byline ini). Hilangkan email dan kamu tak menerima notifikasi kegagalan-terbit. Setel hanya subbidang yang kamu mau.

Penunjuk distribusi

Pengindeks memin bundel tiap game ke ref tak-berubah agar hash integritas tersimpan tetap sah, dan menyelesaikan-ulang pada setiap run (cron harian plus "Terbitkan atau perbarui" manual):

  • entry + npm diselesaikan ke cdn.jsdelivr.net/npm/<npm>@<resolved-version>/<entry>.
  • entry saja diselesaikan ke cdn.jsdelivr.net/gh/<owner>/<repo>@<commit-sha>/<entry>.
  • npm saja diselesaikan ke entri default paket pada versi yang dipin.

Tak ada penyematan-versi sisi-pengguna; untuk membekukan sebuah build, pengguna menghosting-sendiri ia lewat game-src widget (game kustom).

Artefak run

Secara baku pemeriksaan-diri putar-ulang menjalankan bundel entry live-mu. Saat game-mu besar atau berbasis-framework atau WASM, kirim artefak run headless lean khusus sebagai gantinya:

{
  "run": {
    "entry": "dist/run.js",
    "modules": [
      { "name": "sim.wasm", "type": "wasm", "path": "dist/sim.wasm" }
    ]
  }
}
BidangMakna
run.entryPath relatif-repo ke bundel run headless (ekspor run kontrak putar-ulang).
run.modulesArray opsional entri modul yang diimpor run lewat name.

Kendala yang ditegakkan pengindeks

Ini divalidasi saat-indeks; pelanggaran menggagalkan penerbitan dengan manifest-error (lihat referensi galat terbit).

run.entry:

  • Harus JavaScript: basename harus cocok [a-zA-Z0-9_-]+.js. Artefak run selalu JS (WASM dikirim sebagai modul, di bawah).
  • Harus path relatif-repo yang bersih: tanpa slash awal, tanpa traversal .., tanpa spasi, tanpa ? / #, tanpa awalan scheme://.

Tiap entri run.modules[] adalah { name, type, path }:

  • name harus cocok [a-zA-Z0-9_-]+.(wasm|js), sebuah modul entah JS atau WASM, tak lebih. name adalah penentu impor yang dipakai entri.
  • type harus sepakat dengan ekstensi: wasm untuk nama .wasm, js untuk nama .js.
  • name tak boleh berupa nama tercadang (entry.js, artifact.js) yang dipakai host putar-ulang secara internal.
  • name harus unik dalam array (tanpa duplikat).
  • path harus path relatif-repo yang bersih (aturan sama dengan run.entry).
  • Paling banyak 16 modul.

Hilangkan run untuk memutar-ulang entry live langsung. Lihat kontrak putar-ulang untuk apa yang harus diekspor artefak.

Blok preferred

Blok preferred opsional membawa petunjuk presentasi. Setiap kunci bersifat advisori: host BOLEH menghormatinya, dan ia tak pernah menimpa atribut sematan eksplisit.

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

Game responsif yang seharusnya membentang kontainer-nya secara baku bisa mendeklarasikan "full" di salah satu sumbu:

{
  "preferred": { "width": "full", "height": 480 }
}
BidangMakna
width / heightJejak piksel, atau literal "full". Widget menerapkannya saat sematan membiarkan width / height tak-disetel (nilai sematan eksplisit, termasuk full, menang sebagai gantinya). Nilai piksel mengukur iframe ke hitungan itu; "full" meregangkan sumbu itu untuk mengisi induk, efek sama yang dimiliki width="full" sematan. Hilangkan untuk jatuh ke jejak baku bawaan widget.
layoutShell yang dibangun widget di sekitar game: inline, modal, atau fullscreen. Dipakai hanya saat sematan membiarkan layout tak-disetel (default-nya auto). Urutan penyelesaian: atribut layout sematan, lalu layout preferred ini, lalu inline.

Petunjuk ini dihormati hanya untuk game yang diselesaikan platform di sisi-server (game marketplace, atau id game yang diberikan tanpa kunci situs). Bundel game-src swahosting yang tak bisa dibaca platform sebelum mount mengabaikan baik jejak maupun petunjuk layout.

Blok preset

locales, skins, dan configurations masing-masing mendeklarasikan schema opsional (tipe dan dokumentasi per-kunci) plus presets (bank opsi bernama). Widget menyelesaikan pilihan pengunjung terhadap ini dan menyerahkan game-mu hasil yang diratakan sebagai ctx. Katalog tipe-bidang penuhnya adalah referensi skema kustomisasi bersama; tipe yang sama menggerakkan skema dasbor game kustom.

Sebuah bidang skins.schema boleh berupa color, sebuah aset (image / audio / video), atau skalar (boolean, number, range, list) memakai bentuk kendala yang sama dengan configurations ({ "type": "range", "min": 0, "max": 24 }, ["dots","stripes"], dan seterusnya). Nilai skin skalar diselesaikan ke nilai bertipenya di ctx.skin (sebuah number adalah angka nyata), persis seperti nilai konfigurasi; nilai warna dan aset diselesaikan ke string.

_theme sebuah preset skin mendeklarasikan mode yang ia berfungsi di dalamnya: light, dark, atau any (menghilangkannya berarti any). Preset light atau dark muncul hanya di mode itu; preset any terbaca di kedua latar dan layak untuk keduanya. Ada satu default per mode. Preset yang ditandai _default: true adalah default untuk mode mana pun yang ia layak, jadi default any mencakup keduanya; saat beberapa preset layak ditandai default untuk sebuah mode, yang pertama dalam urutan deklarasi memenangkannya. Daftar preset spesifik-mode di atas yang any untuk memberi mode itu skin khusus sementara preset any jatuh ke yang lain.

Berkas split .caputchin/

Blok preset (terutama set locale penuh) membuat caputchin.json panjang. Pindahkan sumbu mana pun ke berkasnya sendiri di bawah folder .caputchin/, membiarkan manifest pendek:

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

Objek tingkat-atas tiap berkas adalah blok sumbu itu ({ schema?, presets }). Ketiganya opsional. Presedensi adalah penggantian seluruh-sumbu, caputchin.json menang: jika sebuah sumbu dideklarasikan baik inline maupun sebagai berkas, blok inline dipakai dan berkas diabaikan (penerbitan memperingatkan agar kamu tahu ia mati). Jaga tiap sumbu di persis satu tempat.

Koleksi

Sebuah repo bisa mengirim beberapa game. Pembungkus koleksi mendeklarasikan path anak alih-alih entry / npm:

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

Tiap path menunjuk ke direktori anak yang menahan caputchin.json-nya sendiri. Id anak adalah owner/repo/<leaf-dir>. Hilangkan blok marketplace pembungkus untuk mengindeks anak tanpa halaman koleksi.

Lihat juga

Di halaman ini