# Ralystudioo

Lingkungan pengembangan lokal untuk game Ralyoo: simulator, pemeriksaan, dan pembungkus. Paketnya `@ralyoo/studio`, sudah terpasang di game dari template.

```sh
npx ralystudioo dev        # simulator
npx ralystudioo lint       # periksa manifest dan bundel
npx ralystudioo pack       # build, periksa, tulis <id>-<versi>.ralyoo
npx ralystudioo publish --to https://staging.ralyoo.com
```

Saat ini Ralystudioo berfokus pada **game 2D** (DOM dan PixiJS + Rapier2D).

## Simulator

```sh
npm run dev
```

Buka `http://localhost:5180/__studio/`.

Yang berjalan di sana bukan tiruan. Layar host dan controller adalah aplikasi yang sama dengan ralyoo.com, game dipasang di sandbox yang sama, dan bundelnya lewat pemeriksaan yang sama dengan saat diunggah. Yang lokal hanya relay-nya. Game yang jalan di simulator jalan sama di Ralyoo.

Setiap kali sebuah file disimpan, game dibangun ulang dan layar host dimuat lagi; room dan HP tetap tersambung.

| Kontrol                        | Guna                                                                |
| ------------------------------ | ------------------------------------------------------------------- |
| **Players**                    | 1–4 HP virtual. Game mulai begitu semuanya masuk                    |
| **Disconnect** / **Reconnect** | Memutus satu HP. Slotnya ditahan, lalu ia kembali ke slot yang sama |
| **Phones**                     | HP tegak atau miring                                                |
| **Latency**                    | Menambah jeda di relay lokal, sampai 300 ms ± 60                    |
| **Reduced motion**             | Game menerima `ctx.reducedMotion = true`                            |
| **Start in lobby**             | Lobi dan QR sungguhan, tanpa mulai otomatis                         |
| **Restart**                    | Memulai ulang game                                                  |

Di layar host:

- `Esc` membuka menu host (jeda).
- Baris `GAME` di pojok kiri atas adalah HUD performa: fps, waktu frame rata-rata/p95/maks, jumlah frame di atas 50 ms, dan ukuran bundel. `Shift`+`D` menyembunyikannya.
- Klik sekali untuk menyalakan suara.

Panel **Checks** menampilkan hasil `lint` untuk build terakhir. Build yang bukan bundel valid tidak dijalankan; alasannya tampil di sana.

### HP sungguhan

```sh
npx ralystudioo dev --lan
```

Simulator lalu mendengarkan di jaringan. Buka alamat Wi-Fi yang dicetak di terminal, lalu scan QR di panel **Real phones** dari HP yang berada di Wi-Fi yang sama. Tanpa `--lan`, simulator hanya menjawab komputer ini.

### Opsi

| Opsi         |                                  |
| ------------ | -------------------------------- |
| `--port <n>` | Port simulator (bawaan 5180)     |
| `--lan`      | Izinkan HP di jaringan yang sama |

## `lint`

Memeriksa `ralyoo.json` dan, kalau game sudah dibangun, bundelnya:

- manifest terhadap skema, rentang `sdk`, dan kontras warna;
- file wajib: `main.js`, ikon, cover;
- tipe file, path, dan batas ukuran;
- impor di `main.js` yang tidak disediakan platform;
- hal yang akan diblokir sandbox (`eval`, alamat di luar bundel).

**Error** membuat bundel ditolak. **Peringatan** (budget muat, bentuk cover, tema menu yang kontrasnya kurang) tidak, tetapi layak dilihat. Keluar dengan kode bukan nol kalau ada error, jadi bisa dipakai di CI.

## `pack`

Menjalankan build, lalu `lint`, lalu menulis `<id>-<versi>.ralyoo` di folder game. Berkas itu zip berisi `dist/` tanpa source map.

| Opsi             |                                |
| ---------------- | ------------------------------ |
| `--out <berkas>` | Tempat menulis bundel          |
| `--no-build`     | Bungkus `dist/` yang sudah ada |

## `publish`

Mengunggah bundel ke registry Ralyoo. Lihat [Publikasi](publikasi.md).

## Batas

- Relay lokal hanya untuk pengembangan. Latensi sungguhan dan WebTransport hanya ada di Ralyoo.
- Pustaka 3D (`three`, `rapier3d`) tersedia di platform tetapi belum dibawa simulator. `lint` memperingatkan kalau game mengimpornya.
