# Osiągnięcia w grach PlayDrop

Zadeklaruj osiągnięcia standardowe i przyrostowe z ikonami w catalogue.json, odblokowuj je i zgłaszaj postęp przez sdk.achievements.

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

Osiągnięcia wyznaczają cele w twojej grze, z ikoną i opisem, które gracze widzą w PlayDrop. Działają dla gości i zalogowanych graczy.

## Zadeklaruj osiągnięcia

```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` ma ten sam format co klucze [rankingów](https://www.playdrop.ai/pl/create/learn/leaderboards).
- `kind` to `STANDARD` (odblokowywane raz) lub `INCREMENTAL` (odblokowywane, gdy postęp osiągnie `maxProgress`, czyli dodatnią liczbę całkowitą).
- `icon` to plik PNG w pakiecie. Użyj wyraźnego, kwadratowego obrazu, który jest czytelny w małych rozmiarach.
- `hidden: true` utrzymuje nazwę i opis w tajemnicy aż do odblokowania.

Opublikowanych kluczy nie można usunąć, a `kind`, `maxProgress` i `hidden` nie mogą się zmienić. Wycofaj osiągnięcie za pomocą `"status": "RETIRED"`.

## Odblokowuj osiągnięcia i zgłaszaj postęp

```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` przyjmuje dotychczasową łączną wartość, nigdy przyrost. Postęp tylko rośnie, jest ograniczony do `maxProgress` i po osiągnięciu tego progu odblokowuje osiągnięcie.
- Oba wywołania zwracają `{ accepted, changed, unlocked, progress, unlockedAt, achievement }`; `changed` ma wartość false, gdy nic nowego się nie wydarzyło, więc własne powiadomienie pokażesz tylko raz.
- `list({ includeHiddenDefinitions: true, includeRetired: true })` uwzględnia ukryte i wycofane definicje.

Odblokowuj osiągnięcia tylko podczas prawdziwej gry, nigdy w podglądach ani przechwytywaniach. Bez żadnej sesji gracza wywołania kończą się powodzeniem, ale nic nie zostaje zapisane.

## Dobre osiągnięcia

Łącz wczesne osiągnięcia, które uczą gry, z celami długoterminowymi. Nazywaj akcję, a nie nagrodę: „Wygraj bez otrzymania obrażeń” mówi, co trzeba zrobić. Tuzin przemyślanych osiągnięć jest lepszy niż sto błahych.

## Powiązane poradniki

- [Rankingi](https://www.playdrop.ai/pl/create/learn/leaderboards): Zadeklaruj rankingi w catalogue.json, wysyłaj wyniki przez sdk.leaderboards i pokazuj czołówkę oraz sąsiadów gracza. Typy wyników, limity i zasady zmian.
- [Zapisy w chmurze](https://www.playdrop.ai/pl/create/learn/cloud-saves): Zapisuj i wczytuj postępy graczy przez sdk.me.appData i sdk.me.updateAppData, dla gości i zalogowanych, z zasadami zapisu, podglądów i gry offline.
- [catalogue.json](https://www.playdrop.ai/pl/create/learn/catalogue-json): Pola catalogue.json gier PlayDrop: tożsamość, strona gry, tryby gry, powierzchnie, logowanie, Instant, wstępne ładowanie, media, tłumaczenia, wyniki i serwery.
