# Pencapaian untuk game PlayDrop

Deklarasikan pencapaian standar dan bertahap dengan ikon di catalogue.json, lalu buka dan laporkan progresnya dengan sdk.achievements.

Source: https://www.playdrop.ai/id/create/learn/achievements

Pencapaian menandai tujuan dalam game Anda, dengan ikon dan deskripsi yang dilihat pemain di PlayDrop. Pencapaian berfungsi untuk tamu dan pemain yang sudah masuk.

## Deklarasikan pencapaian

```json
{
  "achievements": [
    { "key": "first-win", "displayName": "First flag", "description": "Reach the flag once",
      "kind": "STANDARD", "icon": "achievements/first-win.png" },
    { "key": "collector", "displayName": "Collector", "description": "Collect 100 stars",
      "kind": "INCREMENTAL", "maxProgress": 100, "icon": "achievements/collector.png" },
    { "key": "secret-room", "displayName": "Secret room", "description": "Find the hidden room",
      "kind": "STANDARD", "hidden": true, "icon": "achievements/secret-room.png" }
  ]
}
```

- `key` mengikuti format yang sama dengan kunci [papan peringkat](https://www.playdrop.ai/id/create/learn/leaderboards).
- `kind` bernilai `STANDARD` (terbuka sekali) atau `INCREMENTAL` (terbuka saat progres mencapai `maxProgress`, bilangan bulat positif).
- `icon` adalah PNG di dalam paket. Gunakan gambar persegi yang jelas dan tetap terbaca dalam ukuran kecil.
- `hidden: true` merahasiakan nama dan deskripsi sampai pencapaian terbuka.

Kunci yang sudah diterbitkan tidak bisa dihapus, dan `kind`, `maxProgress`, serta `hidden` tidak bisa diubah. Pensiunkan pencapaian dengan `"status": "RETIRED"`.

## Buka pencapaian dan laporkan progres

```js
await sdk.achievements.unlock("first-win");
await sdk.achievements.setProgressAtLeast("collector", starsCollected);

const { achievements } = await sdk.achievements.list();
const { achievement } = await sdk.achievements.get("collector");
```

- `setProgressAtLeast` menerima total sejauh ini, bukan selisih. Progres hanya naik, dibatasi pada `maxProgress`, dan membuka pencapaian saat mencapainya.
- Kedua panggilan mengembalikan `{ accepted, changed, unlocked, progress, unlockedAt, achievement }`; `changed` bernilai false jika tidak ada hal baru, sehingga Anda bisa menampilkan notifikasi sendiri hanya sekali.
- `list({ includeHiddenDefinitions: true, includeRetired: true })` menyertakan definisi yang tersembunyi dan yang sudah pensiun.

Buka pencapaian hanya saat permainan sungguhan, jangan pernah di pratinjau atau perekaman. Tanpa sesi pemain sama sekali, panggilan selesai tanpa disimpan.

## Pencapaian yang bagus

Padukan pencapaian awal yang mengajarkan cara bermain dengan tujuan jangka panjang. Sebutkan tindakannya, bukan hadiahnya: "Menang tanpa terkena serangan" menjelaskan apa yang harus dilakukan. Selusin pencapaian yang dipikirkan matang lebih baik daripada seratus pencapaian sepele.

## 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.
- [Simpanan cloud](https://www.playdrop.ai/id/create/learn/cloud-saves): 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.
- [catalogue.json](https://www.playdrop.ai/id/create/learn/catalogue-json): Field catalogue.json yang dipakai game PlayDrop: identitas, listingan, mode bermain, permukaan, login, Instan, pramuat, media, terjemahan, skor, dan server.
