# Prestationer för PlayDrop-spel

Deklarera vanliga och stegvisa prestationer med ikoner i catalogue.json, lås upp dem och rapportera framsteg med sdk.achievements.

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

Prestationer markerar mål i ditt spel, med en ikon och en beskrivning som spelarna ser på PlayDrop. De fungerar för gäster och inloggade spelare.

## Deklarera prestationer

```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` följer samma format som nycklar för [topplistor](https://www.playdrop.ai/sv/create/learn/leaderboards).
- `kind` är `STANDARD` (låses upp en gång) eller `INCREMENTAL` (låses upp när framstegen når `maxProgress`, ett positivt heltal).
- `icon` är en PNG i paketet. Använd en tydlig, kvadratisk bild som syns bra i små storlekar.
- `hidden: true` håller namn och beskrivning hemliga tills prestationen låses upp.

Publicerade nycklar kan inte tas bort, och `kind`, `maxProgress` och `hidden` kan inte ändras. Pensionera en prestation med `"status": "RETIRED"`.

## Lås upp och rapportera framsteg

```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` tar summan hittills, aldrig en ökning. Framstegen ökar bara, begränsas till `maxProgress` och låser upp prestationen där.
- Båda anropen returnerar `{ accepted, changed, unlocked, progress, unlockedAt, achievement }`; `changed` är false när inget nytt hände, så du kan visa ditt eget meddelande bara en gång.
- `list({ includeHiddenDefinitions: true, includeRetired: true })` tar med dolda och pensionerade definitioner.

Lås bara upp under riktigt spelande, aldrig i förhandsvisningar eller inspelningar. Utan någon spelarsession slutförs anropen utan att något sparas.

## Bra prestationer

Blanda tidiga prestationer som lär ut spelet med långsiktiga mål. Namnge handlingen, inte belöningen: ”Vinn utan att ta skada” säger vad man ska göra. Ett dussin genomtänkta prestationer slår hundra triviala.

## Relaterade guider

- [Topplistor](https://www.playdrop.ai/sv/create/learn/leaderboards): Deklarera topplistor i catalogue.json, skicka poäng med sdk.leaderboards och visa toppen och spelarens grannar. Poängtyper, gränser och uppdateringsregler.
- [Molnsparningar](https://www.playdrop.ai/sv/create/learn/cloud-saves): Spara och läs in spelarens framsteg med sdk.me.appData och updateAppData, för gäster och inloggade, med regler för skrivningar, förhandsvisningar och offline.
- [catalogue.json](https://www.playdrop.ai/sv/create/learn/catalogue-json): Fälten i catalogue.json för PlayDrop-spel: identitet, spelsida, spellägen, ytor, inloggning, Instant, förladdning, media, översättningar, poäng och servrar.
