# Publikasi

Sebuah game sampai ke Ralyoo sebagai **bundel** yang diunggah ke **registry**. Registry memvalidasinya, menyimpannya di alamat berversi yang tidak pernah berubah, dan memasukkannya ke katalog. Web Ralyoo tidak perlu dibangun ulang.

Saat ini yang mengunggah adalah tim Ralyoo. Kirim berkas `.ralyoo` kamu ke tim, atau unggah sendiri kalau kamu punya token registry.

## 1. Lengkapi manifest

`ralyoo.json` adalah yang tampil di katalog:

```json
{
  "$schema": "https://docs.ralyoo.com/schema/ralyoo.json",
  "id": "kejar-bintang",
  "version": "0.1.0",
  "sdk": ">=1.1 <2",
  "title": { "id": "Kejar Bintang" },
  "description": { "id": "Kejar bintang pakai joystick. Yang duluan dapat lima, menang." },
  "controls": { "id": "Joystick" },
  "author": { "name": "Nama kamu" },
  "players": { "min": 2, "max": 4 },
  "pillars": ["konsol"],
  "locales": ["id"],
  "media": { "icon": "meta/icon.svg", "cover": "meta/cover.webp", "color": "#7FD8FF" }
}
```

- **`id`** permanen. Ia bagian dari alamat bundel dan kunci simpanan; tidak bisa diganti setelah unggahan pertama.
- **`title`** paling panjang 22 karakter (satu baris di lobi), **`description`** 100 (dua baris).
- **`media`**: lihat [Aset](aset.md#ikon-dan-cover). Ganti ikon dan cover bawaan template.
- **`sdk`**: rentang versi SDK yang dibutuhkan game. `">=1.1 <2"` berarti "1.1 atau lebih baru, sebelum 2".

Setiap field ada di [Referensi manifest](referensi-manifest.md).

## 2. Bungkus

```sh
npm test
npm run pack
```

`pack` menulis `kejar-bintang-0.1.0.ralyoo`. Kalau ada error, tidak ada yang ditulis dan alasannya dicetak.

## 3. Unggah

```sh
export RALYOO_REGISTRY_TOKEN=…
npx ralystudioo publish --to https://staging.ralyoo.com
```

Registry memeriksa ulang semuanya di sisi server. Jawabannya:

| Jawaban                 | Arti                                                           |
| ----------------------- | -------------------------------------------------------------- |
| _published_             | Sudah di katalog                                               |
| _was already published_ | Bundel yang persis sama sudah ada. Tidak ada yang berubah      |
| `409`                   | Versi itu sudah terbit dengan isi lain. Naikkan `version`      |
| `422`                   | Ditolak; alasannya dicetak. Sama dengan yang dilaporkan `lint` |
| `401` / `403`           | Token salah, atau registry itu tidak menerima unggahan         |

Coba dulu di staging, mainkan sekali dari awal sampai layar hasil dengan HP sungguhan, baru minta dirilis ke produksi.

## Memperbarui game

Versi yang sudah terbit **tidak bisa diubah**. Itu yang membuat bundel boleh di-cache selamanya dan sesi yang sedang berjalan tidak pernah berubah di tengah main.

Untuk merilis perubahan:

1. Naikkan `version` di `ralyoo.json` (dan `package.json`).
2. `npm run pack`, lalu `publish`.

Katalog berpindah ke versi terbaru. Alamat versi lama tetap hidup.

Penomoran mengikuti semver: perbaikan `0.1.0 → 0.1.1`, fitur `0.1.0 → 0.2.0`. Simpanan (`ctx.storage`) terikat ke `id`, bukan ke versi, jadi bertahan antar versi: baca data lama dengan hati-hati.

## Menarik versi

Kalau sebuah versi ternyata rusak, tim Ralyoo bisa menariknya; katalog kembali ke versi sebelumnya.

## Daftar periksa

- [ ] `npm test` lulus, `host.errors` kosong.
- [ ] `ralystudioo lint` tanpa error; peringatan sudah dibaca.
- [ ] Dimainkan dengan 2 dan 4 pemain, termasuk satu pemain putus lalu kembali.
- [ ] Dicoba dengan **Reduced motion** dan dengan **Latency** 150 ms.
- [ ] Dicoba di HP sungguhan, tegak dan miring sesuai `orientation`.
- [ ] Teks di layar host minimal 28 px pada 1080p.
- [ ] fps stabil di laptop tanpa GPU khusus; tidak ada lonjakan frame di HUD.
- [ ] Ikon dan cover milik sendiri; judul dan deskripsi pas di lobi.
- [ ] Lisensi aset pihak ketiga dicatat di `LICENSES.md` di folder game.
