# ความสำเร็จสำหรับเกม PlayDrop

ประกาศความสำเร็จแบบมาตรฐานและแบบสะสมพร้อมไอคอนใน catalogue.json แล้วปลดล็อกและรายงานความคืบหน้าด้วย sdk.achievements

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

ความสำเร็จใช้บอกเป้าหมายในเกมของคุณ โดยมีไอคอนและคำอธิบายที่ผู้เล่นเห็นบน PlayDrop ใช้ได้ทั้งกับผู้เยี่ยมชมและผู้เล่นที่เข้าสู่ระบบ

## ประกาศความสำเร็จ

```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` ใช้รูปแบบเดียวกับคีย์ของ[ลีดเดอร์บอร์ด](https://www.playdrop.ai/th/create/learn/leaderboards)
- `kind` เป็น `STANDARD` (ปลดล็อกครั้งเดียว) หรือ `INCREMENTAL` (ปลดล็อกเมื่อความคืบหน้าถึง `maxProgress` ซึ่งเป็นจำนวนเต็มบวก)
- `icon` คือไฟล์ PNG ในแพ็กเกจ ใช้ภาพสี่เหลี่ยมจัตุรัสที่ชัดเจนและดูรู้เรื่องแม้มีขนาดเล็ก
- `hidden: true` จะซ่อนชื่อและคำอธิบายไว้จนกว่าจะปลดล็อก

คีย์ที่เผยแพร่แล้วลบไม่ได้ และเปลี่ยน `kind`, `maxProgress` และ `hidden` ไม่ได้ เลิกใช้ความสำเร็จด้วย `"status": "RETIRED"`

## ปลดล็อกและรายงานความคืบหน้า

```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` รับยอดรวมจนถึงตอนนี้ ไม่ใช่ค่าที่เพิ่มขึ้น ความคืบหน้าจะเพิ่มขึ้นเท่านั้น มีเพดานที่ `maxProgress` และปลดล็อกเมื่อถึงค่านั้น
- ทั้งสองคำสั่งส่งคืน `{ accepted, changed, unlocked, progress, unlockedAt, achievement }` โดย `changed` เป็น false เมื่อไม่มีอะไรใหม่เกิดขึ้น คุณจึงใช้ค่านี้แสดงการแจ้งเตือนของคุณเองเพียงครั้งเดียว
- `list({ includeHiddenDefinitions: true, includeRetired: true })` จะรวมความสำเร็จที่ซ่อนอยู่และที่เลิกใช้แล้ว

ปลดล็อกเฉพาะระหว่างการเล่นจริง ห้ามปลดล็อกระหว่างการแสดงตัวอย่างหรือการจับภาพเด็ดขาด หากไม่มีเซสชันผู้เล่นเลย คำสั่งจะเสร็จสิ้นโดยไม่ได้บันทึกไว้

## ความสำเร็จที่ดี

ผสมความสำเร็จช่วงต้นที่สอนวิธีเล่นเข้ากับเป้าหมายระยะยาว ตั้งชื่อตามการกระทำ ไม่ใช่ตามรางวัล: "ชนะโดยไม่โดนโจมตีเลย" บอกชัดว่าต้องทำอะไร ความสำเร็จที่คิดมาอย่างดีสักสิบกว่ารายการดีกว่าความสำเร็จง่ายๆ เป็นร้อย

## คู่มือที่เกี่ยวข้อง

- [ลีดเดอร์บอร์ด](https://www.playdrop.ai/th/create/learn/leaderboards): ประกาศลีดเดอร์บอร์ดใน catalogue.json ส่งคะแนนด้วย sdk.leaderboards และแสดงอันดับสูงสุดกับผู้เล่นรอบข้าง พร้อมชนิดคะแนน ขีดจำกัด และกฎการอัปเดต
- [การบันทึกบนคลาวด์](https://www.playdrop.ai/th/create/learn/cloud-saves): บันทึกและโหลดความคืบหน้าของผู้เล่นด้วย sdk.me.appData และ updateAppData สำหรับผู้เยี่ยมชมและผู้เล่นที่เข้าสู่ระบบ พร้อมกฎการเขียน การแสดงตัวอย่าง และการเล่นออฟไลน์
- [catalogue.json](https://www.playdrop.ai/th/create/learn/catalogue-json): ฟิลด์ catalogue.json ที่เกม PlayDrop ใช้: ตัวตน หน้าเกม โหมดการเล่น หน้าจอ การเข้าสู่ระบบ Instant การโหลดล่วงหน้า สื่อ คำแปล คะแนน และเซิร์ฟเวอร์
