# Formatos de asset personalizados e criações dos jogadores no PlayDrop

Defina formatos de asset com especificações, declare os que um jogo lê ou grava e deixe os jogadores salvar e publicar criações com sdk.assets.custom.

Source: https://www.playdrop.ai/pt-br/create/learn/custom-assets

As especificações de asset permitem que um jogo defina seu próprio tipo de asset, como uma fase, um personagem ou um baralho, na forma de um contrato de arquivos. Os jogadores podem então criar, salvar e publicar criações nesse formato, e outros jogos compatíveis com ele podem abri-las.

## Defina uma especificação de asset

Uma especificação de asset é declarada na lista `assetSpecs` do catalogue.json, ao lado de `apps`:

```json
{
  "assetSpecs": [{
    "name": "moon-level",
    "version": "1.0.0",
    "displayName": "Moon Jump level",
    "symbol": "specs/moon-level.svg",
    "contract": "specs/moon-level.contract.json"
  }]
}
```

O contrato indica os arquivos de cada asset e como verificá-los:

```json
{
  "primaryRole": "level",
  "roles": [
    { "name": "level", "required": true, "contentTypes": ["application/json"], "mode": "TEXT",
      "jsonSchema": { "type": "object", "required": ["tiles"], "properties": { "tiles": { "type": "array" } } } },
    { "name": "thumbnail", "required": false, "contentTypes": ["image/png"], "mode": "BINARY" }
  ]
}
```

Os papéis podem trazer um JSON Schema, que o PlayDrop verifica a cada salvamento. Publique uma nova versão da especificação quando o formato mudar; os assets antigos mantêm a versão deles.

## Declare o que um jogo suporta

```json
{
  "assetSpecSupport": [
    { "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
  ]
}
```

As capacidades são `READ`, `WRITE`, `EDIT`, `PREVIEW` e `IMPORT`.

## Salve e carregue as criações dos jogadores

```js
const levels = sdk.assets.custom.forSpec("asset-spec:your-name/moon-level");

await levels.saveDraft({ assetName: "crater-run", displayName: "Crater run",
  files: { level: new Blob([JSON.stringify(level)], { type: "application/json" }) } });
await levels.publish({ assetName: "crater-run", displayName: "Crater run", files: { level: levelBlob, thumbnail: pngBlob } });

const mine = await levels.listMine();
const latest = mine[0]?.latestPublicVersion;
if (latest) startLevel(await levels.loadJson({ assetRef: latest.assetRef, role: "level" }));

const community = await levels.listPublic({ limit: 20 }); // { assets, pagination }
```

- `saveDraft` guarda um rascunho privado; `publish` o torna público. Os dois precisam do conjunto completo de arquivos.
- As referências de asset têm o formato `asset:creator/name@r2`. `loadJson`, `loadText` e `downloadFile` leem assets publicados; `loadOwned`, `loadOwnedJson` e `loadOwnedFile` leem os do próprio jogador, incluindo rascunhos.
- `supports(versionRef, capability)` faz a verificação antes de abrir um asset de outra versão.
- Os erros usam códigos como `custom_asset_capability_unsupported` e `custom_asset_role_type_mismatch`.

Os jogadores precisam estar logados para salvar. Revise o que os jogadores publicam como você faria com qualquer conteúdo de usuário: a política de conteúdo do PlayDrop se aplica a ele.

## O que o conector aceita

Assets e especificações personalizados só de dados são enviados como os outros arquivos. Modelos executáveis, ou seja, assets `MODEL_3D` com a subcategoria `procedural` ou com o formato `CUSTOM`, são recusados pelo conector porque a API não executa código do criador; converta-os em arquivos fixos (bake) ou faça referência a uma versão publicada. Veja [assets de jogo](https://www.playdrop.ai/pt-br/create/learn/game-assets).

## Guias relacionados

- [Assets de jogo](https://www.playdrop.ai/pt-br/create/learn/game-assets): Imagens, som, vídeo e 3D no seu jogo: arquivos no pacote, assets do jogo no catalogue.json, assets e packs públicos e consulta em execução com sdk.assets.
- [catalogue.json](https://www.playdrop.ai/pt-br/create/learn/catalogue-json): Os campos do catalogue.json que os jogos do PlayDrop usam: identidade, listagem, modos de jogo, superfícies, login, Instantâneo, pré-carregamento, mídia, traduções, pontuações e servidores.
- [SDK de cliente](https://www.playdrop.ai/pt-br/create/learn/sdk): Referência do SDK de navegador: init, host, jogador e salvamentos, controles, social, multijogador, loja, anúncios, placares, conquistas, assets e IA.
