# Simpanan cloud untuk game PlayDrop

Simpan dan muat progres dengan sdk.me.appData dan sdk.me.updateAppData untuk tamu dan pemain yang sudah masuk, plus aturan penulisan, pratinjau, dan offline.

Source: https://www.playdrop.ai/id/create/learn/cloud-saves

Simpanan cloud menjaga progres setiap pemain di game Anda di PlayDrop, sehingga progres itu ikut bersama mereka dari situs web ke aplikasi. Satu objek JSON disimpan per pemain dan game; tidak perlu server atau room multiplayer.

## Baca dan tulis

Setelah `init()`, `sdk.me.appData` adalah snapshot yang tersimpan: `{ data, seq, ts_event, ts_arrival }`, atau `null` sebelum penyimpanan pertama. Baca objek Anda dari `data`. Tulis seluruh objek dengan `updateAppData`, yang mengembalikan snapshot tersimpan dan memperbarui `sdk.me.appData`.

```js
const sdk = await playdrop.init();
let progress = { level: 1, coins: 0, ...(sdk.me.appData?.data ?? {}) };
let queue = Promise.resolve();

// Resolves with the saved snapshot; rejects when the save failed.
function save(changes) {
  progress = { ...progress, ...changes };
  const snapshot = { ...progress };
  const attempt = queue.then(() => sdk.me.updateAppData(snapshot));
  queue = attempt.catch(() => {}); // a failed save must not block the next one
  return attempt;
}

try {
  await save({ level: 2 });
  showSaved();
} catch (error) {
  showSaveError(); // progress stays in memory; the next save sends it again
}
```

- Setiap penulisan mengganti seluruh objek yang tersimpan: pertahankan setiap field yang masih Anda perlukan.
- Lakukan penulisan secara berurutan, seperti di atas, agar simpanan lama tidak pernah tiba setelah simpanan yang lebih baru, dan biarkan antrean tetap berjalan setelah kegagalan.
- Tampilkan "Tersimpan" hanya setelah promise selesai. Mengubah `appData.data` di memori tidak menyimpan apa pun.
- `appData` tidak memiliki metode `get`, `set`, atau `save`.

## Kapan menyimpan

Simpan di checkpoint, akhir level, dan pembelian, bukan di setiap frame. Jangan pernah menyimpan selama pratinjau atau perekaman: tulis hanya saat `sdk.host.phase` bernilai `play`. Buat simpanan tetap kecil dan berversi dengan field Anda sendiri, misalnya `saveVersion: 2`, agar versi game berikutnya bisa memigrasikannya.

## Tamu dan pemain yang sudah masuk

Anda tidak perlu memeriksa `sdk.me.isLoggedIn` sebelum menyimpan: tamu PlayDrop juga menyimpan progres mereka. Pemain tanpa sesi sama sekali menyimpan data di memori selama kunjungan itu, jadi penulisan yang selesai tidak membuktikan simpanan sampai ke cloud. Gunakan `isLoggedIn` hanya untuk fitur yang memerlukan akun sungguhan, seperti pembelian dan multiplayer yang di-hosting.

## Offline

Di browser, simpanan memerlukan koneksi dan tidak ada antrean offline: lanjutkan permainan jika gagal dan coba lagi di checkpoint berikutnya. Host yang menyatakan dukungan data perangkat, seperti aplikasi PlayDrop yang bisa offline, menyimpan data di perangkat dan menyinkronkannya saat online.

## Yang bukan fungsi simpanan

Simpanan bersifat privat untuk satu pemain dan satu game. Simpanan terpisah dari [papan peringkat](https://www.playdrop.ai/id/create/learn/leaderboards) dan [pencapaian](https://www.playdrop.ai/id/create/learn/achievements), yang memiliki API sendiri dan tampil di PlayDrop. Status yang dibagikan antarpemain, seperti pertandingan atau dunia, harus berada di [server game](https://www.playdrop.ai/id/create/learn/game-servers) dalam koleksi MongoDB game Anda.

## Uji

Simpanan terikat pada game yang sudah diunggah. Unggah versi privat setidaknya sekali, lalu uji dari `url` di tanda terima atau dari frame Dev lokal yang dijelaskan di [menerbitkan dari aplikasi AI Anda](https://www.playdrop.ai/id/create/learn/mcp-publishing).

## Panduan terkait

- [Papan peringkat](https://www.playdrop.ai/id/create/learn/leaderboards): Deklarasikan papan peringkat di catalogue.json, kirim skor lewat sdk.leaderboards, tampilkan peringkat teratas dan sekitar pemain. Jenis skor, batas, aturan.
- [Pencapaian](https://www.playdrop.ai/id/create/learn/achievements): Deklarasikan pencapaian standar dan bertahap dengan ikon di catalogue.json, lalu buka dan laporkan progresnya dengan sdk.achievements.
- [Server game realtime](https://www.playdrop.ai/id/create/learn/game-servers): Jalankan server Colyseus 0.17 yang di-hosting dengan MongoDB untuk game Anda, hubungkan dari browser lewat SDK, uji dengan dua pemain, dan pahami batasnya.
