# Skylagring for PlayDrop-spill

Lagre og hent fremgang med sdk.me.appData og updateAppData for gjester og innloggede spillere, med regler for skriving, forhåndsvisninger og spill uten nett.

Source: https://www.playdrop.ai/nb/create/learn/cloud-saves

Skylagring tar vare på hver spillers fremgang i spillet ditt på PlayDrop, slik at den følger spilleren fra nettstedet til appene. Ett JSON-objekt per spiller og spill lagres; du trenger ingen server eller flerspillerrom.

## Les og skriv

Etter `init()` er `sdk.me.appData` det lagrede øyeblikksbildet: `{ data, seq, ts_event, ts_arrival }`, eller `null` før den første lagringen. Les objektet ditt fra `data`. Skriv hele objektet med `updateAppData`, som returnerer det lagrede øyeblikksbildet og oppdaterer `sdk.me.appData`.

```js
const sdk = await playdrop.init();
let progress = { level: 1, coins: 0, ...(sdk.me.appData?.data ?? {}) };
let queue = Promise.resolve();

// Resolves with the saved snapshot; rejects when the save failed.
function save(changes) {
  progress = { ...progress, ...changes };
  const snapshot = { ...progress };
  const attempt = queue.then(() => sdk.me.updateAppData(snapshot));
  queue = attempt.catch(() => {}); // a failed save must not block the next one
  return attempt;
}

try {
  await save({ level: 2 });
  showSaved();
} catch (error) {
  showSaveError(); // progress stays in memory; the next save sends it again
}
```

- Hver skriving erstatter hele det lagrede objektet: behold alle feltene du fortsatt trenger.
- Utfør skrivinger etter hverandre, som ovenfor, slik at en eldre lagring aldri kommer frem etter en nyere, og hold køen i gang etter en feil.
- Vis «Lagret» først når promisen er oppfylt. Å endre `appData.data` i minnet lagrer ingenting.
- `appData` har ikke metodene `get`, `set` eller `save`.

## Når du skal lagre

Lagre ved sjekkpunkter, slutten av brett og kjøp i stedet for i hvert bilde. Lagre aldri under forhåndsvisninger eller opptak: skriv bare når `sdk.host.phase` er `play`. Hold lagringen liten og versjonert med et eget felt, som `saveVersion: 2`, slik at en senere versjon av spillet kan migrere den.

## Gjester og innloggede spillere

Du trenger ikke sjekke `sdk.me.isLoggedIn` før du lagrer: PlayDrop-gjester beholder også lagringene sine. En spiller uten noen økt i det hele tatt beholder lagringen i minnet under det besøket, så en fullført skriving beviser ikke at lagringen kom frem til skyen. Bruk `isLoggedIn` bare for funksjoner som krever en ekte konto, som kjøp og hostet flerspiller.

## Uten nett

I en nettleser krever lagring nettverkstilkobling, og det finnes ingen kø for lagringer uten nett: fortsett å spille ved feil og prøv igjen ved neste sjekkpunkt. Verter som oppgir støtte for enhetsdata, som PlayDrop-apper som fungerer uten nett, beholder lagringer på enheten og synkroniserer dem når de er på nett.

## Hva lagringer ikke er

Lagringer er private for én spiller og ett spill. De er atskilt fra [topplister](https://www.playdrop.ai/nb/create/learn/leaderboards) og [prestasjoner](https://www.playdrop.ai/nb/create/learn/achievements), som har egne API-er og vises på PlayDrop. Tilstand som deles mellom spillere, som en kamp eller en verden, hører hjemme på en [spillserver](https://www.playdrop.ai/nb/create/learn/game-servers) i MongoDB-samlingene til spillet ditt.

## Test

Lagringer hører til et opplastet spill. Last opp en privat versjon minst én gang, og test deretter fra `url` i kvitteringen eller fra den lokale Dev-rammen som er beskrevet i [publisering fra KI-appen din](https://www.playdrop.ai/nb/create/learn/mcp-publishing).

## Relaterte veiledninger

- [Topplister](https://www.playdrop.ai/nb/create/learn/leaderboards): Deklarer topplister i catalogue.json, send poengsummer med sdk.leaderboards og vis toppen og spillerens naboer. Poengtyper, grenser og oppdateringsregler.
- [Prestasjoner](https://www.playdrop.ai/nb/create/learn/achievements): Deklarer vanlige og trinnvise prestasjoner med ikoner i catalogue.json, lås dem opp og rapporter fremgang med sdk.achievements.
- [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.
