# Formats de ressources personnalisés et créations des joueurs

Définissez votre format de ressource, déclarez les formats qu’un jeu lit ou écrit, et laissez les joueurs enregistrer et publier leurs créations avec sdk.assets.custom.

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

Les spécifications de ressources permettent à un jeu de définir son propre type de ressource, comme un niveau, un personnage ou un deck, sous la forme d’un contrat de fichiers. Les joueurs peuvent alors créer, enregistrer et publier des créations dans ce format, et d’autres jeux qui le prennent en charge peuvent les ouvrir.

## Définissez une spécification de ressource

Une spécification de ressource se déclare dans la liste `assetSpecs` de catalogue.json, à côté 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"
  }]
}
```

Le contrat nomme les fichiers de chaque ressource et indique comment les vérifier :

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

Les rôles peuvent comporter un schéma JSON, que PlayDrop vérifie à chaque enregistrement. Publiez une nouvelle version de la spécification quand le format change ; les anciennes ressources conservent leur version.

## Déclarez ce qu’un jeu prend en charge

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

Les capacités possibles sont `READ`, `WRITE`, `EDIT`, `PREVIEW` et `IMPORT`.

## Enregistrez et chargez les créations des joueurs

```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` conserve un brouillon privé ; `publish` le rend public. Les deux exigent l’ensemble complet des fichiers.
- Les références de ressources ressemblent à `asset:creator/name@r2`. `loadJson`, `loadText` et `downloadFile` lisent les ressources publiées ; `loadOwned`, `loadOwnedJson` et `loadOwnedFile` lisent celles du joueur, brouillons compris.
- `supports(versionRef, capability)` vérifie la compatibilité avant d’ouvrir une ressource d’une autre version.
- Les erreurs utilisent des codes comme `custom_asset_capability_unsupported` et `custom_asset_role_type_mismatch`.

Les joueurs doivent être connectés pour enregistrer. Vérifiez ce que publient les joueurs comme n’importe quel contenu d’utilisateur : la politique de contenu de PlayDrop s’y applique.

## Ce que le connecteur accepte

Les ressources personnalisées et les spécifications composées uniquement de données s’envoient comme les autres fichiers. Les modèles exécutables, c’est-à-dire les ressources `MODEL_3D` de sous-catégorie `procedural` ou au format `CUSTOM`, sont refusés par le connecteur, car l’API n’exécute pas le code des créateurs ; figez-les en modèle statique ou référencez une version publiée. Consultez [ressources de jeu](https://www.playdrop.ai/fr/create/learn/game-assets).

## Guides associés

- [Ressources de jeu](https://www.playdrop.ai/fr/create/learn/game-assets): Intégrez images, sons, vidéos et 3D à un jeu PlayDrop : fichiers inclus, ressources du jeu dans catalogue.json, ressources et packs publics, accès avec sdk.assets.
- [catalogue.json](https://www.playdrop.ai/fr/create/learn/catalogue-json): Les champs catalogue.json des jeux PlayDrop : identité, fiche, modes de jeu, surfaces, connexion, Instantané, préchargement, médias, traductions, scores et serveurs.
- [SDK client](https://www.playdrop.ai/fr/create/learn/sdk): SDK navigateur de PlayDrop : init, hôte, joueur et sauvegardes, manettes, social, multijoueur, boutique, publicités, classements, succès, ressources et IA.
