# Pakk et PlayDrop-spill med catalogue.json og .play

Organiser en ferdigbygd spillmappe, ZIP eller .play med catalogue.json i roten, deklarer oppføringsmedier og servere, og last opp med prepare_catalogue_upload.

Source: https://www.playdrop.ai/nb/create/learn/packaging

En pakke er de ferdigbygde filene til et spill pluss en `catalogue.json` som beskriver det. Det er veien til alle PlayDrop-funksjoner: flere filer, SDK-en, oppføringsbilder og -videoer, topplister, prestasjoner, ressurser og en hostet server. Last den opp fra KI-appen din som en mappe, en ZIP eller en `.play`-fil.

## Organiser mappen

Legg `catalogue.json` i roten, ved siden av det ferdigbygde spillet. Stier i katalogen er relative til den.

```
catalogue.json
index.html
assets/sprites.png
assets/music.mp3
listing/icon.png
listing/hero-landscape.png
listing/hero-portrait.png
listing/screenshots/landscape-1.png
listing/videos/portrait-1.mp4
achievements/first-win.png
server/index.mjs
```

En `.play`-fil er denne mappen zippet med `catalogue.json` i roten av arkivet, ikke inne i en omsluttende mappe, og omdøpt til `.play`. Den inneholder bare ferdigbygde filer: ingen `node_modules`, ingen kildekart du ikke vil gjøre offentlige, og ingen `.env`-filer. La kildeprosjektet bli hos brukeren din; PlayDrop kan ikke gi det tilbake.

## Skriv catalogue.json

```json
{
  "apps": [{
    "name": "moon-jump",
    "displayName": "Moon Jump",
    "subtitle": "Lunar platform hopping against the clock",
    "description": "Jump between lunar platforms, collect oxygen and reach the flag.",
    "controls": "Tap or press Space to jump. Swipe or use arrows to steer.",
    "file": "index.html",
    "version": "1.0.0",
    "visibility": "PRIVATE",
    "authMode": "OPTIONAL",
    "tags": ["game-genre/casual", "game-genre/platformer"],
    "types": ["solo"],
    "controller": { "support": "optional", "type": "simpler" },
    "surfaceTargets": { "desktop": true, "mobileLandscape": true, "mobilePortrait": true },
    "primarySurface": "MOBILE_PORTRAIT",
    "sourceLocale": "en",
    "listing": {
      "icon": "listing/icon.png",
      "heroLandscape": "listing/hero-landscape.png",
      "heroPortrait": "listing/hero-portrait.png",
      "screenshotsLandscape": ["listing/screenshots/landscape-1.png"],
      "videosPortrait": ["listing/videos/portrait-1.mp4"]
    },
    "leaderboards": [{ "key": "best-time", "displayName": "Best time", "description": "Fastest run to the flag",
      "scoreType": "TIME_MS", "sort": "ASC" }],
    "achievements": [{ "key": "first-win", "displayName": "First flag", "description": "Reach the flag once",
      "kind": "STANDARD", "icon": "achievements/first-win.png" }],
    "server": { "entry": "server/index.mjs", "rooms": ["game"] }
  }]
}
```

- `file` er den nøyaktige stien til siden som starter spillet. Uten den er inngangen som standard `<name>.html`, ikke `index.html`.
- `version` er en ny semantisk versjon for hver opplasting av det samme spillet.
- `surfaceTargets` lister flatene du har testet; `primarySurface` er den spillet er laget for.
- Katalogen gjør krav på oppføringsmedier, prestasjonsikoner og serverinngangen: en fil under `listing/` som ingen felt refererer til, er ikke oppføringsmedier, og filer som ingen app gjør krav på, avvises før noe publiseres.
- `server.entry` peker på én ferdigbygd ES-modulbunt; se [sanntidsservere for spill](https://www.playdrop.ai/nb/create/learn/game-servers).

Alle felt og grensene deres står i [catalogue.json-referansen](https://www.playdrop.ai/nb/create/learn/catalogue-json). Det finnes ikke noe versjonsfelt for katalogen å sette.

## Last opp en mappe

Send `prepare_catalogue_upload` med en ny `requestId`, `expectedCurrentVersion` (`null` for et nytt spill), hele katalogobjektet og én beskrivelse per fil. Små tekstfiler kan være innebygd `text`. Alle andre filer er signerte opplastinger: beregn størrelse, SHA-256 (64 heksadesimale tegn med små bokstaver) og base64-MD5 lokalt fra de nøyaktige bytene. Denne forespørselen for et spill med to filer er komplett; erstatt de to plassholderne for sjekksummer på ikonet med ikonets ekte verdier.

```json
{
  "requestId": "moon-jump-1.0.0",
  "expectedCurrentVersion": { "moon-jump": null },
  "catalogue": {
    "apps": [{
      "name": "moon-jump",
      "displayName": "Moon Jump",
      "file": "index.html",
      "version": "1.0.0",
      "visibility": "PRIVATE",
      "authMode": "OPTIONAL",
      "tags": ["game-genre/casual"],
      "types": ["solo"],
      "controller": { "support": "off" },
      "surfaceTargets": { "desktop": true, "mobileLandscape": false, "mobilePortrait": true },
      "listing": { "icon": "listing/icon.png" }
    }]
  },
  "files": [
    { "path": "index.html",
      "text": "<!doctype html><html><head><meta charset=\"utf-8\"><title>Moon Jump</title></head><body><canvas id=\"game\"></canvas><script>/* built game */</script></body></html>" },
    { "path": "listing/icon.png", "contentType": "image/png", "sizeBytes": 50211,
      "sha256": "REPLACE_WITH_ICON_SHA256_HEX", "md5Base64": "REPLACE_WITH_ICON_MD5_BASE64" }
  ]
}
```

Svaret inneholder en opplastings-URL og headere for `listing/icon.png`. Send ikonets nøyaktige byte dit med PUT og alle returnerte headere, og kall deretter `complete_catalogue_upload` med samme `requestId`. `url` i kvitteringen åpner den private versjonen.

## Last opp en ZIP eller .play

- **Agenter med et filsystem** pakker ut arkivet lokalt og laster det opp som en mappe, som ovenfor.
- **ChatGPT** sender arkivet den har løst opp fra samtalen, som `archive`, med den ekte `download_url` og `file_id`, og uten `catalogue` eller `files`. Arkivet kan være opptil 20 MiB komprimert.

Arkiver må være vanlige ZIP-filer: ingen kryptering, flere volumer, ZIP64, symbolske lenker, dupliserte stier, absolutte stier eller `..`. Tomme filer og nestede catalogue.json-filer avvises.

## Grenser

512 filer eller arkivoppføringer (inkludert catalogue.json og mapper), 50 MiB per fil, 200 MiB utpakket og 1 MiB katalog-JSON. En hostet serverbunt er høyst 2 MiB.

## Oppdater en pakke

Les `list_games`, behold hver apps `name`, øk `version` og sett `expectedCurrentVersion` til den nåværende publiserte versjonen. Send hele øyeblikksbildet: alle filer og felt den nye versjonen skal ha. Uendrede filer fra en beholdt versjon kan sendes med `reuse: { gameId, version, path }` i stedet for bytene sine. Nøkler for topplister og prestasjoner kan ikke fjernes eller endre type; avvikle en med `"status": "RETIRED"`.

## Ressurser connectoren ikke kan laste opp ennå

PlayDrop kjører kjørbare 3D-modeller (`MODEL_3D`-ressurser med underkategorien `procedural` eller formatet `CUSTOM`) i sine egne verktøy, men connectoren avviser dem fordi API-et ikke kan validere koden deres. Bak dem til et støttet format, eller referer til en ressurs som allerede er publisert på PlayDrop. Ferdigbakte prosedyriske bilder og spriteark godtas. Se [spillressurser](https://www.playdrop.ai/nb/create/learn/game-assets).

## Relaterte veiledninger

- [catalogue.json](https://www.playdrop.ai/nb/create/learn/catalogue-json): catalogue.json-feltene PlayDrop-spill bruker: identitet, oppføring, spillmåter, flater, innlogging, Instant, forhåndslasting, medier, oversettelser, poeng og servere.
- [Publiser fra KI-appen din](https://www.playdrop.ai/nb/create/learn/mcp-publishing): Slik publiserer KI-agenter på PlayDrop via MCP: den enkle veien og pakkeveien, privat testing, publish_game_version, oppdateringer, grenser og gjenoppretting.
- [Oppføringsbilder og video](https://www.playdrop.ai/nb/create/learn/listing-assets): Oppføringsbildene og -videoene et PlayDrop-spill kan ha, stier, formater og retninger, og hvordan du lager bilder som virker i feeder, søk og forhåndsvisninger.
- [Sanntidsservere](https://www.playdrop.ai/nb/create/learn/game-servers): Kjør en hostet Colyseus 0.17-server med en MongoDB-database for spillet ditt, koble til fra nettleseren med SDK-en, test med to spillere og kjenn grensene.
