Saves que sobrevivem a uma reinstalação e a um telemóvel novo
Um jogo diário pede um compromisso medido em meses. Quebre-o e não há notas de versão que resolvam.
Três falhas distintas
«Perder um save» são na verdade três erros diferentes, e precisam de três soluções diferentes: a escrita interrompida, a reinstalação e o telemóvel novo.
A escrita interrompida
O save ingénuo é um ficheiro, aberto, truncado, escrito. Se o processo morrer entre o truncar e o escrever, e em telemóvel pode morrer, o ficheiro fica vazio e o progresso do jogador desapareceu.
A solução é uma escrita atómica: serializar para um ficheiro temporário, garantir que foi
gravado, e só depois movê-lo para o lugar. Uma mudança de nome dentro do mesmo sistema de
ficheiros é atómica, por isso o save é sempre ou a versão antiga ou a nova, nunca uma versão
a meio. Guarde a versão anterior como .bak e recorra a ela se a principal não
abrir. O Pinteza faz isto em todos os saves através de um único SafeFileIO,
porque no momento em que dois caminhos de código escrevem ficheiros de duas maneiras, um
deles está errado.
A reinstalação e o telemóvel novo
Os ficheiros locais não sobrevivem a uma desinstalação. O que sobrevive é a cópia de segurança do próprio sistema operativo: iCloud no iOS, Auto Backup no Android. Ambas são gratuitas, ambas estão ligadas à conta do próprio jogador, e nenhuma exige que mantenha um servidor ou que peça a alguém para criar uma conta.
No Android isto exige uma regra de backup explícita no manifesto. Publique sem ela e o comportamento do Auto Backup não é o que imaginaria. Teste como deve ser: instalar, jogar, desinstalar, reinstalar, e confirmar que o progresso lá está. Não uma vez, num aparelho.
A armadilha do restauro
O restauro na nuvem cria um erro que não existe localmente. Se algum direito de acesso for escrito num ficheiro de que o sistema faz cópia, um backup restaurado concede esse direito no novo dispositivo sem pagar. Tudo o que um jogador comprou tem de ser lido do recibo da própria loja em cada arranque, e nunca persistido num save com cópia de segurança. A fonte da verdade é a loja, não o seu ficheiro.
O espelho disto: o estado em cache tem de ser invalidado quando chega um restauro. Um inventário restaurado que o jogo já tenha em memória será ignorado e depois sobrescrito pela cópia desatualizada, o que parece exatamente um restauro a falhar em silêncio.
Versionamento, antes de precisar dele
Todos os saves são um invólucro com um número de versão, desde a primeira publicação. Não porque o formato vá mudar, mas porque vai, e acrescentar um campo de versão a ficheiros que já estão nos telemóveis dos jogadores é uma tarde muito pior do que ter tido um desde o início.
O que testar de facto
- Matar a aplicação a meio de uma escrita e voltar a abrir.
- Encher o disco e tentar guardar.
- Desinstalar, reinstalar, confirmar que o progresso volta.
- Restaurar uma cópia num dispositivo que nunca correu o jogo.
- Restaurar uma cópia que contenha uma compra, e confirmar que o direito vem da loja e não do ficheiro.



