Como implemento um sistema "savegame" baseado em senha de estilo retro?

20

Como criar um sistema de senha para um jogo para um jogador como os usados ​​em jogos de console mais antigos?

Por exemplo, o Mega Man X salva o trabalho, fornecendo uma série de números que você pode inserir posteriormente para carregar o seu salvamento.

Acumulador
fonte
3
Não faça o que Donkey Kong (NES) fez - que permite salvar no cartucho, mas NÃO PRESERVE A CONTAGEM DE VIDAS - para que você tenha muitas vidas desde o primeiro nível (como 24), salve, vá para a cama, WAKE UP COM 3 - Eu odiava que
Alec Teal
10
Nota pedante: um sistema de senha não salva o estado do jogo, ele carrega um estado predefinido .
Lilienthal
5
@ Lilienthal não necessariamente. Talvez seja apenas algum tipo de "despejo" de algumas variáveis ​​de estado, embaralhadas com um algoritmo determinístico de duas vias.
o0 '.
2
@Lohoris Sim, se você tiver entropia suficiente em sua senha, poderá considerá-lo um tipo de estado salvo próximo o suficiente para se parecer com os jogos atuais. Afinal, ambos exigem uma maneira de exportar e importar o estado do jogo. No entanto, a entropia necessária para qualquer coisa que se assemelhe a um salvamento verdadeiro (local / ponto de verificação exato, vidas, inimigos mortos, munição, ....) exigiria uma senha muito longa e um algoritmo muito complexo. Nos casos em que a decisão de usar senhas em jogos de savana faz sentido (se houver alguma), a máxima deve ser verdadeira.
Lilienthal
3
@AlecTeal O que exatamente seria "estúpido"? Estou avaliando uma senha contra a quantidade de dados armazenados em jogos contemporâneos, onde eles são claramente inadequados para a grande maioria.
Lilienthal

Respostas:

32

Primeiro, divida o estado do jogo (ou melhor, os aspectos do estado que você deseja salvar). No caso de um jogo no estilo Mega Man, você pode rastrear quais dos chefes de nível final que você matou, o número de upgrades de tanques de energia que você tem e assim por diante.

Empacote todos esses dados em um campo de bits, ou seja, atribua um número apropriado de bits a cada valor:

  • Chefe morto 1 (um bit)
  • Chefe morto 2 (um bit)
  • Chefe morto 3 (um bit)
  • Chefe morto 4 (um bit)
  • Tanques de energia ( x de 5 total) (3 bits)
  • Desbloqueou alguma conquista (um bit)

Nosso exemplo tem um total de 8 bits, o que significa que um único caractere pode representar uma senha. Na prática, é provável que seu jogo tenha mais estado e, portanto, exija mais bits totais e, portanto, mais caracteres. Conforme observado nos comentários aqui e em outros lugares nesta pergunta, essa abordagem funciona para jogos "retrô" ou outros jogos em que o tamanho do estado do jogo capturado é razoável. Além de um certo ponto, você pode descobrir que a complexidade das senhas necessárias para codificar seu estado é muito grande.

Para diminuir a probabilidade de observação casual decifrar a senha, você pode transformar o layout dos bits para introduzir bits fictícios (que não afetam o estado do jogo, mas que tornam a senha diferente quando você interpreta todos os bits como caracteres) ou executar através de alguma operação reversível, semelhante a um hash, para embaralhar os bits de maneira que todos os bits da "caixa morta X " não fiquem próximos um do outro, fazendo com que as senhas de estado seqüencial correspondentes pareçam muito diferentes ou introduzam valores de soma de verificação.

Se você procurar por aí, há muitas informações sobre os sistemas empregados para alguns dos jogos com senha mais populares do mercado:

Você pode ler sobre eles para obter inspiração adicional.


fonte
4
Lembre-se de garantir que a senha "salvar estado" seja facilmente digitada e, de preferência, inequívoca (por exemplo, use '0' ou 'O', mas não as duas).
Minnmass
4
@minnmass pontos de bônus se você converter implicitamente caracteres semelhantes ao seu padrão, para que digitar 'O' em vez de '0' ainda se traduza em '0'.
8
@ NPSF3000 Porque, neste caso, a "senha" não é uma medida de autenticação; a "senha" é o próprio meio de armazenamento.
21915 Schilcote
6
@ NPSF3000 Se não estiver claro para você a partir da pergunta, será necessário relê-la ou aprender o material de apoio.
Hbbs
2
@ O NPSF3000 OP diz claramente "Estilo Retro" e faz referência a Megaman para confirmar, o que não é ambíguo. Aprenda sobre o assunto, entenda que isso não está relacionado à segurança e pare de tentar defender o que começou como uma ignorância honesta e perdoável.
MJT #
3

Esses jogos salvaram apenas um estado em que acredito. A senha apenas referencia um nível a ser carregado. Basta usar um dicionário para algo assim.

Se for um pouco mais complexo, como ter uma certa arma ou reforço, você pode criptografar o estado em um código hash curto (mas longo o suficiente).

Mas eu recomendo fortemente que você não use isso. A senha se espalhará rapidamente na Internet e logo todos ganharão seu jogo.

Madmenyo
fonte
9
Senhas espalhadas na internet podem ser boas. Trapacear pode ser divertido e, em um jogo para um jogador, os jogadores só se enganam.
Anko
@ Anko Sim, eu não gosto de trapacear e mal fiz isso, então sou tendenciosa. Mas, por experiência própria, meus jogos acumulariam poeira muito mais rápido e mais cedo, quando eu trapaceei.
Madmenyo
"... apenas referencia um nível para carregar." Não é verdade em todos os casos, de longe. Algumas senhas também fazem referência a chefes, mortos, upgrades ganhos, etc. Em segundo lugar, aconselhar que a senha pode ser espalhada é uma coisa - um problema em nosso mundo hiperconectado. Dizer que as opções de trapaça devem ser removidas porque VOCÊ não gosta de trapaça é outra. O que você gosta não é exatamente o que os outros gostam. Não é sobre o que você gosta, é o consumidor . Trapaças / atalhos são uma opção importante - especialmente para jogos para um jogador.
WernerCD
@WernerCD Em primeiro lugar, falo sobre sistemas mais complexos, apenas inicio com um sistema de senha simples. Eu não estou reivindicando nada. Em segundo lugar, não estou dizendo nada sobre trapacear na resposta. Estou apenas dando minha resposta ao BIASED em um comentário e até dizendo que sou tendencioso e ciente de seu ponto de vista de que não é o que eu gosto. Mas se ninguém disser o que ele gosta ou não, como você saberia o que os outros gostam? Eu ainda acho que um sistema como esse é devido tempo e a trapaça do século 21 é alcançada de maneira diferente. Da próxima vez que você deve ler com mais atenção antes de escrever um comentário como esse IMHO.
Madmenyo
Se você tiver jogos de saves, as pessoas também os compartilharão.
Dewi Morgan
1

Bem, você poderia basicamente fazê-lo desta maneira:

Chefes mortos = 7

Quantidade de moedas = 36

Possui Espada = 0 (Não)

Possui Coração = 1 (Sim)

Nível Atual = 6

Mundo Atual = 9

Saúde = 100

Código = 7V36R0A1T6O9A100

Basicamente, todas as letras separadas

aanda tv
fonte
-3

Embora soluções como o sistema personagem-estado de Josh Petrie tenham benefícios (pequeno tamanho de gravação, funciona em todas as cópias do jogo), elas combinam o design dos jogos e o sistema de estado a serem intrinsecamente ao sistema de senhas. Qualquer alteração na senha ou estado ou design e todo o sistema se desfaz.

Uma solução muito mais simples seria criar seu sistema de salvamento normalmente e simplesmente adicionar um sistema de senha por cima. Isso pode ser tão simples quanto salvar a senha no salvamento (possivelmente dobrando como nome do arquivo) e validá-la no carregamento, ou tão complexa quanto usar uma das muitas bibliotecas de criptografia existentes (o que é bastante trivial).


Parece haver alguma confusão em torno dessa resposta.

1) O op simplesmente pediu uma senha que permita carregar um salvamento ... não é necessário que a senha seja salva.

2) Hoje em dia, muitos jogos têm um requisito significativo de armazenamento de economia, acabamos de criar um sistema rápido de salvar / carregar internamente que produzia arquivos de 10 MB ... para um jogo de perguntas! O sistema de salvamento de Josh Petrie , embora válido seja muito limitado - assim que o sistema de armazenamento se tornar não trivial, as senhas teriam que ter um comprimento enorme para persistir todos os dados pertinentes.

Por exemplo, o que acontece se houver 30 chefes? 20 conquistas? Estamos no meio de uma conquista? Em que nível ele está? Quantos bits estamos reservando para saúde, vidas, moedas, pontos de experiência? E se o instantâneo não estiver no estado entre os níveis ... mas na metade do nível - as posições do jogador, inimigos, projéteis, terreno destruído / alterado de repente somam muito estado que precisa ser armazenado.

Para perspectiva, assumindo um alfabeto de 30 caracteres e uma senha de dez letras, temos aproximadamente 50 bits de informações para armazenar. Não é incomum ver um jogo / mecanismo usar até 320 bits apenas para armazenar a posição, rotação e escala de um único objeto. Claro, você pode fazer todos os tipos de truques de otimização para fazer mais com menos ... mas, no final das contas, você está gastando o tempo dedicado a tornar o jogo divertido - uma das piores otimizações que você pode fazer.

NPSF3000
fonte
3
Acho que o problema aqui, e com o seu comentário acima, é que a segurança criptográfica não é o objetivo de salvar o estado do jogo como bits dentro de uma senha. As senhas compostas dessa maneira são facilmente reversíveis, mas difíceis de adivinhar hashes e nada mais. E pelo mesmo motivo, não causa acoplamentos indevidos da maneira que você está imaginando; se o estado do jogo se tornar mais ou menos complicado, o mesmo ocorre com o hash (que invalida os hashes anteriores), mas o sistema funciona igualmente bem antes e depois.
Seth Battin
@Seth Battin "não causa acoplamentos indevidos do jeito que você está imaginando" Oh legal! Então, um jogo no qual estou trabalhando agora tinha um arquivo salvo medido em megabytes ... tudo o que preciso fazer é ofuscar um pouco e exibi-lo na tela e pronto! Agora temos um sistema de senhas perfeitamente bom?
NPSF3000
3
Parece que seu jogo não é apropriado para esse método.
Seth Battin
@ NPSF3000 Qual é o sentido das senhas neste caso? Se é para impedir que outros usuários da mesma máquina usem seus savegames sem permissão, por que não fazer apenas um login uma vez por jogo com nome de usuário / senha? Se é para especificar qual salvamento eles desejam, esse é um "ID do jogo saveg", não uma senha, e provavelmente deve ser mais amigável. Como está, se eu leio direito, você está exigindo uma senha diferente, não especificada pelo usuário, sempre que carregar um novo salvamento? PORQUE? Que vantagem útil isso dá a alguém?
Dewi Morgan
11
@DewiMorgan Não estou exigindo nada, estou apenas respondendo à pergunta do op: "Como eu faria um sistema de senha para um jogo para um jogador? Por exemplo, Mega Man X economiza trabalho, fornecendo uma série de números que você pode inserir posteriormente para carregar seu salvamento ". Minha solução faz isso, sem acoplar o sistema de salvamento e o sistema de senhas. A resposta mais votada tem as mesmas desvantagens da minha, além de exigir que todo o jogo seja projetado para se adequar ao método.
NPSF3000 27/07/2015