# Mukautetut resurssimuodot ja pelaajien luomukset PlayDropissa

Määrittele oma resurssimuotosi asset spec -määrityksellä, ilmoita pelin lukemat ja kirjoittamat muodot ja anna pelaajien tallentaa ja julkaista luomuksia.

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

Asset spec -määritysten avulla peli voi määritellä oman resurssityyppinsä, kuten tason, hahmon tai korttipakan, tiedostojen sopimuksena. Pelaajat voivat sitten tehdä, tallentaa ja julkaista luomuksia tässä muodossa, ja muut sitä tukevat pelit voivat avata ne.

## Määrittele asset spec

Asset spec ilmoitetaan catalogue.json-tiedoston `assetSpecs`-luettelossa `apps`-kentän rinnalla:

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

Sopimus nimeää kunkin resurssin tiedostot ja sen, miten ne tarkistetaan:

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

Rooleilla voi olla JSON Schema, jonka PlayDrop tarkistaa jokaisella tallennuksella. Julkaise määrityksestä uusi versio, kun muoto muuttuu; vanhat resurssit säilyttävät versionsa.

## Ilmoita, mitä peli tukee

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

Kyvykkyydet ovat `READ`, `WRITE`, `EDIT`, `PREVIEW` ja `IMPORT`.

## Tallenna ja lataa pelaajien luomuksia

```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` säilyttää yksityisen luonnoksen; `publish` tekee siitä julkisen. Molemmat tarvitsevat täydellisen tiedostojoukon.
- Resurssiviitteet näyttävät tältä: `asset:creator/name@r2`. `loadJson`, `loadText` ja `downloadFile` lukevat julkaistuja resursseja; `loadOwned`, `loadOwnedJson` ja `loadOwnedFile` lukevat pelaajan omia resursseja luonnokset mukaan lukien.
- `supports(versionRef, capability)` tarkistaa tuen ennen kuin toisen version resurssi avataan.
- Virheet käyttävät koodeja, kuten `custom_asset_capability_unsupported` ja `custom_asset_role_type_mismatch`.

Pelaajien on oltava kirjautuneita tallentaakseen. Tarkista, mitä pelaajat julkaisevat, kuten mitä tahansa käyttäjien sisältöä: PlayDropin sisältökäytäntö koskee sitä.

## Mitä connector hyväksyy

Pelkkää dataa sisältävät mukautetut resurssit ja määritykset ladataan kuten muutkin tiedostot. Suoritettavat mallit eli `MODEL_3D`-resurssit, joiden alaluokka on `procedural` tai muoto `CUSTOM`, connector hylkää, koska rajapinta ei suorita tekijän koodia; leivo ne valmiiksi tai viittaa julkaistuun versioon. Katso [pelin resurssit](https://www.playdrop.ai/fi/create/learn/game-assets).

## Liittyvät oppaat

- [Pelin resurssit](https://www.playdrop.ai/fi/create/learn/game-assets): Toimita kuvat, äänet, video ja 3D pelin mukana: paketoidut tiedostot, pelin omat resurssit, julkiset resurssit ja paketit sekä haku sdk.assets-rajapinnalla.
- [catalogue.json](https://www.playdrop.ai/fi/create/learn/catalogue-json): PlayDrop-pelien catalogue.json-kentät: tunniste, pelisivu, pelitavat, näkymät, kirjautuminen, Instant, esilataus, media, käännökset, pisteet ja palvelimet.
- [Client SDK](https://www.playdrop.ai/fi/create/learn/sdk): Selain-SDK:n viite: elinkaari, identiteetti ja tallennukset, ohjaimet, sosiaaliset toiminnot, moninpeli, kauppa, mainokset, tulostaulut, resurssit ja tekoäly.
