# Xuất bản game HTML đơn giản từ ứng dụng AI của bạn

Xuất bản một tệp HTML khép kín tối đa 10 MiB bằng upload_game: những gì phù hợp, catalogue rút gọn, chế độ hiển thị, cập nhật và khi nào chuyển sang gói.

Source: https://www.playdrop.ai/vi/create/learn/html-games

Cách đơn giản xuất bản một game HTML chuẩn, chẳng hạn một game arcade dùng canvas hay một game giải đố dùng DOM, chỉ bằng một lệnh gọi `upload_game`. Cách này không cần SDK PlayDrop, không cần thư mục bản dựng hay tệp phụ nào, và trả về một liên kết mà ai cũng mở được trên điện thoại hoặc máy tính.

## Khi nào cách đơn giản phù hợp

- Toàn bộ game là một tệp HTML tối đa 10 MiB (10.485.760 byte UTF-8), với script, style, hình ảnh và âm thanh được nhúng trực tiếp.
- Đây là một game trình duyệt thông thường: nó không gọi SDK PlayDrop, nên không có lưu đám mây, bảng xếp hạng, thành tích, chia sẻ, nhóm chơi, giao dịch mua hay quảng cáo.
- Nó không cần tệp riêng nào: không có hình ảnh hay video giới thiệu và không có máy chủ game.

Nếu có bất kỳ điều nào ở trên không đúng, hãy dùng một [gói](https://www.playdrop.ai/vi/create/learn/packaging). Hãy giữ các tính năng người dùng của bạn đã yêu cầu; không bao giờ bỏ chúng hay gộp một game nhiều tệp thành một tệp để vừa với cách này. Lần tải lên sẽ từ chối các lệnh gọi SDK, mã máy chủ và các trường catalogue chỉ dành cho gói với `advanced_upload_required`.

## Gửi game

Gọi `upload_game` với một `requestId` mới, toàn bộ HTML và một catalogue rút gọn cho một game:

```json
{
  "requestId": "moon-jump-first-upload",
  "html": "<!doctype html><html><head><meta charset=\"utf-8\"><title>Moon Jump</title></head><body>…</body></html>",
  "catalogue": {
    "apps": [{
      "name": "moon-jump",
      "displayName": "Moon Jump",
      "description": "Jump between lunar platforms and reach the flag.",
      "controls": "Tap or press Space to jump.",
      "tags": ["game-genre/casual"],
      "types": ["solo"],
      "controller": { "support": "off" },
      "authMode": "NONE",
      "primarySurface": "MOBILE_PORTRAIT"
    }]
  }
}
```

- `name` là slug cố định của game: 1–100 chữ cái thường, chữ số hoặc dấu gạch ngang.
- `tags` phải có một thể loại như `game-genre/casual`; xem [thể loại và thẻ](https://www.playdrop.ai/vi/create/learn/tags).
- `types` khai báo cách chơi game; game một tệp thường là `["solo"]`. Quy mô nhóm chơi và chơi trực tuyến thuộc về gói.
- `controller.support` nêu mức hỗ trợ tay cầm thực tế, kể cả `off`.
- `authMode` quyết định việc đăng nhập: `NONE` hoặc `OPTIONAL` cho phép mọi người chơi; nếu bỏ qua, mặc định là `REQUIRED`. Hãy đưa trường này vào mọi bản cập nhật.
- `primarySurface` nêu hướng màn hình mà game được thiết kế để chơi; các lần tải lên đơn giản được liệt kê cho máy tính, màn hình ngang và màn hình dọc.

Các trường khác được chấp nhận là `subtitle`, `emoji`, `color`, `license`, `creation`, `releaseNotes`, `inspirationPrompt`, `makingOf`, `sourceRepository`, `sourceLocale`, `offlineSupported` và `instant`. PlayDrop tự gán số phiên bản.

## Chọn ai có thể chơi

- Bỏ `visibility` để theo cài đặt tài khoản của nhà sáng tạo cho game mới (Công khai, trừ khi họ đã chọn Không công khai hoặc Riêng tư); một bản cập nhật giữ nguyên nhóm người xem hiện tại của game.
- `"private"` lưu một phiên bản chỉ nhà sáng tạo mở được, để thử. Sau đó hãy xuất bản đúng phiên bản đó bằng `publish_game_version`; đừng tải nó lên lại.
- `"unlisted"` xuất bản cho bất kỳ ai có liên kết mà không liệt kê game; `"public"` xuất bản để game được khám phá.

Hãy làm theo yêu cầu của người dùng của bạn và không bao giờ làm một game hiển thị rộng hơn ý định của họ. Xem [ai có thể chơi](https://www.playdrop.ai/vi/create/learn/distribution).

## Đọc biên nhận

Biên nhận gồm `gameId`, `slug`, `version`, `status`, `visibility` và `url`, liên kết tới đúng phiên bản đó dành cho chủ sở hữu. Game công khai và không công khai còn nhận được `shareUrl`, trang lâu dài của game; hãy đưa liên kết này cho người dùng của bạn. Với phiên bản riêng tư, hãy gửi lại `url`. `instant` và `instantReason` báo cáo điều kiện [Instant](https://www.playdrop.ai/vi/create/learn/instant-games).

## Cập nhật game

Gọi `list_games`, truyền `gameId` của game và giữ nguyên `name`. Gửi lại toàn bộ HTML và toàn bộ catalogue rút gọn: mỗi lần tải lên là một bản chụp đầy đủ, và các trường bị bỏ qua sẽ không có trong phiên bản mới. Liên kết vẫn giữ nguyên. Một game lần đầu được tải lên dưới dạng gói phải tiếp tục dùng cách tải gói, để tệp và tính năng của nó không bị mất.

## Chuyển sang gói sau này

Thêm lưu đám mây, bảng xếp hạng, hình ảnh giới thiệu hoặc máy chủ sẽ biến game thành một gói. Đó là một bản cập nhật bình thường của cùng game: giữ nguyên `name`, tải lên bằng `prepare_catalogue_upload` và đặt `expectedCurrentVersion` bằng phiên bản hiện tại từ `list_games`. Đọc [đóng gói](https://www.playdrop.ai/vi/create/learn/packaging).

## Hướng dẫn liên quan

- [Xuất bản từ ứng dụng AI](https://www.playdrop.ai/vi/create/learn/mcp-publishing): Cách agent AI xuất bản lên PlayDrop qua MCP: cách đơn giản và cách dùng gói, thử riêng tư, publish_game_version, cập nhật, giới hạn và khôi phục.
- [Đóng gói và .play](https://www.playdrop.ai/vi/create/learn/packaging): Sắp xếp thư mục game đã dựng, tệp ZIP hoặc .play có catalogue.json ở thư mục gốc, khai báo media giới thiệu, máy chủ, rồi tải lên bằng prepare_catalogue_upload.
- [Chế độ hiển thị và tiếp cận](https://www.playdrop.ai/vi/create/learn/distribution): Chọn ai mở được game PlayDrop, cách hoạt động của cài đặt mặc định và việc xuất bản phiên bản, cùng cách Boost, Trao đổi lượt chơi, Instant, tìm kiếm đem về người chơi.
