# Formatos de recursos personalizados y creaciones de jugadores

Define tu formato con una especificación de recurso, declara qué formatos lee o escribe un juego y deja que los jugadores publiquen con sdk.assets.custom.

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

Las especificaciones de recurso permiten que un juego defina su propio tipo de recurso, como un nivel, un personaje o una baraja, como un contrato de archivos. Así, los jugadores pueden crear, guardar y publicar creaciones en ese formato, y otros juegos compatibles pueden abrirlas.

## Define una especificación de recurso

Una especificación de recurso se declara en la lista `assetSpecs` de catalogue.json, junto a `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"
  }]
}
```

El contrato indica los archivos de cada recurso y cómo comprobarlos:

```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" }
  ]
}
```

Los roles pueden incluir un JSON Schema, que PlayDrop comprueba en cada guardado. Publica una nueva versión de la especificación cuando cambie el formato; los recursos antiguos conservan su versión.

## Declara qué admite un juego

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

Las capacidades son `READ`, `WRITE`, `EDIT`, `PREVIEW` e `IMPORT`.

## Guarda y carga creaciones de jugadores

```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 un borrador privado; `publish` lo hace público. Ambos necesitan el conjunto completo de archivos.
- Las referencias de recurso tienen el formato `asset:creator/name@r2`. `loadJson`, `loadText` y `downloadFile` leen recursos publicados; `loadOwned`, `loadOwnedJson` y `loadOwnedFile` leen los del propio jugador, borradores incluidos.
- `supports(versionRef, capability)` comprueba la compatibilidad antes de abrir un recurso de otra versión.
- Los errores usan códigos como `custom_asset_capability_unsupported` y `custom_asset_role_type_mismatch`.

Los jugadores tienen que iniciar sesión para guardar. Revisa lo que publican los jugadores como harías con cualquier contenido de usuarios: se le aplica la política de contenido de PlayDrop.

## Qué acepta el conector

Los recursos personalizados y las especificaciones que solo contienen datos se suben como cualquier otro archivo. El conector rechaza los modelos ejecutables, es decir, los recursos `MODEL_3D` con la subcategoría `procedural` o el formato `CUSTOM`, porque la API no ejecuta código de los creadores; hornéalos en un formato estático o haz referencia a una versión publicada. Consulta [recursos de juego](https://www.playdrop.ai/es/create/learn/game-assets).

## Guías relacionadas

- [Recursos de juego](https://www.playdrop.ai/es/create/learn/game-assets): Incluye imágenes, sonido, vídeo y 3D en tu juego: archivos incluidos, recursos propios, recursos y paquetes públicos, y búsqueda en ejecución con sdk.assets.
- [catalogue.json](https://www.playdrop.ai/es/create/learn/catalogue-json): Campos de catalogue.json que usan los juegos: identidad, ficha, modos, pantallas, sesión, instantáneo, precarga, medios, idiomas, puntuaciones y servidores.
- [SDK de cliente](https://www.playdrop.ai/es/create/learn/sdk): SDK de navegador de PlayDrop: init, host, jugador, partidas guardadas, mandos, social, multijugador, tienda, anuncios, clasificaciones, logros, recursos e IA.
