# Salvamentos na nuvem para jogos do PlayDrop

Salve e carregue o progresso com sdk.me.appData e sdk.me.updateAppData, para convidados e jogadores logados, com as regras de gravação, prévias e modo offline.

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

Os salvamentos na nuvem guardam o progresso de cada jogador no seu jogo no PlayDrop, para que ele acompanhe o jogador do site aos apps. É armazenado um objeto JSON por jogador e por jogo; não é preciso servidor nem sala multijogador.

## Leia e grave

Depois de `init()`, `sdk.me.appData` é o snapshot salvo: `{ data, seq, ts_event, ts_arrival }`, ou `null` antes do primeiro salvamento. Leia seu objeto em `data`. Grave o objeto inteiro com `updateAppData`, que retorna o snapshot salvo e atualiza `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
}
```

- Cada gravação substitui todo o objeto salvo: mantenha todos os campos de que você ainda precisa.
- Execute as gravações em sequência, como acima, para que um salvamento antigo nunca chegue depois de um mais recente, e mantenha a fila funcionando depois de uma falha.
- Mostre "Salvo" só depois que a promise for resolvida. Alterar `appData.data` na memória não salva nada.
- `appData` não tem métodos `get`, `set` ou `save`.

## Quando salvar

Salve em checkpoints, no fim das fases e nas compras, e não a cada quadro. Nunca salve durante prévias ou capturas: só grave quando `sdk.host.phase` for `play`. Mantenha o salvamento pequeno e versionado com um campo seu, como `saveVersion: 2`, para que uma versão futura do jogo possa migrá-lo.

## Convidados e jogadores logados

Você não precisa verificar `sdk.me.isLoggedIn` antes de salvar: os convidados do PlayDrop também mantêm seus salvamentos. Um jogador sem nenhuma sessão mantém o salvamento na memória durante aquela visita, então uma gravação resolvida não prova que o salvamento chegou à nuvem. Use `isLoggedIn` só para recursos que exigem uma conta real, como compras e multijogador hospedado.

## Offline

No navegador, os salvamentos precisam de conexão e não há fila offline: continue o jogo quando houver falha e tente de novo no próximo checkpoint. Hosts que anunciam suporte a dados no dispositivo, como os apps do PlayDrop que funcionam offline, guardam os salvamentos no dispositivo e os sincronizam quando há conexão.

## O que os salvamentos não são

Os salvamentos são privados de um jogador e de um jogo. Eles são separados dos [placares](https://www.playdrop.ai/pt-br/create/learn/leaderboards) e das [conquistas](https://www.playdrop.ai/pt-br/create/learn/achievements), que têm suas próprias APIs e aparecem no PlayDrop. Estados compartilhados entre jogadores, como uma partida ou um mundo, ficam em um [servidor de jogo](https://www.playdrop.ai/pt-br/create/learn/game-servers), nas coleções MongoDB do seu jogo.

## Teste

Os salvamentos pertencem a um jogo enviado. Envie uma versão privada pelo menos uma vez e depois teste pela `url` do recibo ou pelo frame Dev local descrito em [publicar pelo seu app de IA](https://www.playdrop.ai/pt-br/create/learn/mcp-publishing).

## Guias relacionados

- [Placares](https://www.playdrop.ai/pt-br/create/learn/leaderboards): Declare placares no catalogue.json, envie pontuações com sdk.leaderboards e mostre o topo e os vizinhos do jogador. Tipos de pontuação, limites e atualizações.
- [Conquistas](https://www.playdrop.ai/pt-br/create/learn/achievements): Declare conquistas padrão e incrementais com ícones no catalogue.json, desbloqueie-as e informe o progresso com sdk.achievements.
- [Servidores em tempo real](https://www.playdrop.ai/pt-br/create/learn/game-servers): Rode um servidor Colyseus 0.17 hospedado com um banco MongoDB para o seu jogo, conecte o navegador com o SDK, teste com dois jogadores e conheça os limites.
