# Prestaties voor PlayDrop-games

Declareer standaard- en incrementele prestaties met iconen in catalogue.json, ontgrendel ze en meld voortgang met sdk.achievements.

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

Prestaties markeren doelen in je game, met een icoon en een beschrijving die spelers op PlayDrop zien. Ze werken voor gasten en ingelogde spelers.

## Prestaties declareren

```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` volgt hetzelfde formaat als de sleutels van [ranglijsten](https://www.playdrop.ai/nl/create/learn/leaderboards).
- `kind` is `STANDARD` (één keer ontgrendeld) of `INCREMENTAL` (ontgrendeld wanneer de voortgang `maxProgress` bereikt, een positief geheel getal).
- `icon` is een PNG in het pakket. Gebruik een duidelijke vierkante afbeelding die ook klein goed leesbaar is.
- `hidden: true` houdt de naam en beschrijving geheim tot de prestatie is ontgrendeld.

Gepubliceerde sleutels kun je niet verwijderen, en `kind`, `maxProgress` en `hidden` kunnen niet veranderen. Stel een prestatie buiten gebruik met `"status": "RETIRED"`.

## Ontgrendelen en voortgang melden

```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` neemt het totaal tot nu toe, nooit een toename. Voortgang stijgt alleen, is begrensd op `maxProgress` en ontgrendelt de prestatie daar.
- Beide aanroepen retourneren `{ accepted, changed, unlocked, progress, unlockedAt, achievement }`; `changed` is false als er niets nieuws is gebeurd, zodat je je eigen melding maar één keer toont.
- `list({ includeHiddenDefinitions: true, includeRetired: true })` neemt verborgen en buiten gebruik gestelde definities mee.

Ontgrendel alleen tijdens echt spelen, nooit in voorbeelden of opnames. Zonder enige spelersessie slagen de aanroepen zonder dat er iets wordt opgeslagen.

## Goede prestaties

Combineer vroege prestaties die de game uitleggen met doelen voor de lange termijn. Noem de actie, niet de beloning: "Win zonder schade op te lopen" zegt wat je moet doen. Een dozijn doordachte prestaties is beter dan honderd onbenullige.

## Gerelateerde gidsen

- [Ranglijsten](https://www.playdrop.ai/nl/create/learn/leaderboards): Declareer ranglijsten in catalogue.json, verstuur scores met sdk.leaderboards en toon de top en de buren van de speler. Scoretypen, limieten en updateregels.
- [Cloudsaves](https://www.playdrop.ai/nl/create/learn/cloud-saves): Sla voortgang op en laad die met sdk.me.appData en sdk.me.updateAppData, voor gasten en ingelogde spelers, met regels voor opslaan, voorbeelden en offline.
- [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json): De catalogue.json-velden die games gebruiken: identiteit, gamepagina, speelwijzen, weergaven, inloggen, Instant, vooraf laden, media, vertalingen, scores en servers.
