¿Cómo implemento un sistema de "savegame" basado en contraseña de estilo retro?

20

¿Cómo crearía un sistema de contraseña para un juego de un jugador como los que se usan en juegos de consola más antiguos?

Por ejemplo, Mega Man X ahorra trabajo al darle una serie de números que puede ingresar más tarde para cargar su guardado.

Acumulador
fuente
3
No hagas lo que Donkey Kong (NES) hizo, que es permitirte guardar en el cartucho pero NO CONSERVAR EL CONTEO DE VIDAS, para tener muchas vidas desde el primer nivel (como 24), guardar, irte a la cama, DESPERTAR UP WITH 3 - Odiaba eso
Alec Teal
10
Nota pedante: un sistema de contraseña no guarda un estado del juego, carga uno predefinido .
Lilienthal
55
@Lilienthal no necesariamente. Tal vez es solo una especie de "volcado" del estado de algunas variables, barajado con un algoritmo determinista de dos vías.
o0 '.
2
@Lohoris Sí, si tiene suficiente entropía en su contraseña, puede considerarlo como una especie de estado guardado lo suficientemente cercano como para parecerse a los juegos guardados actuales. Después de todo, ambos requieren una forma de exportar e importar el estado del juego. Sin embargo, la entropía requerida para cualquier cosa que se parezca a una verdadera salvación (ubicación / punto de control exacto, vidas, enemigos asesinados, recuentos de municiones, ...) requeriría una contraseña muy larga y un algoritmo muy complejo. Para los casos en que la decisión de usar contraseñas en los juegos guardados tiene sentido (si es que hay alguna), la máxima debería ser cierta.
Lilienthal
3
@AlecTeal ¿Qué sería exactamente "estúpido"? Estoy evaluando una contraseña contra la cantidad de datos almacenados en los juegos contemporáneos, donde son claramente inadecuados para la gran mayoría.
Lilienthal

Respuestas:

32

Primero, desglosa tu estado de juego (o más bien, los aspectos del estado que deseas guardar). En el caso de un juego de estilo Mega Man, puedes rastrear a cuál de los jefes de nivel final que has matado, la cantidad de power-ups similares a tanques de energía que tienes, y así sucesivamente.

Empaque todos esos datos en un campo de bits, es decir, asigne un número apropiado de bits a cada valor:

  • Jefe asesinado 1 (un bit)
  • Jefe asesinado 2 (un bit)
  • Jefe asesinado 3 (un bit)
  • Jefe asesinado 4 (un bit)
  • Tanques de energía ( x de 5 en total) (3 bits)
  • Desbloqueado algún logro (un bit)

Nuestro ejemplo tiene un total de 8 bits, lo que significa que un solo carácter puede representar una contraseña. En la práctica, es probable que tu juego tenga más estado y, por lo tanto, requiera más bits totales y, por lo tanto, más personajes. Como se señaló en los comentarios aquí y en otras partes de esta pregunta, este enfoque funciona para juegos "retro" u otros juegos donde el tamaño del estado del juego capturado es razonable. Más allá de cierto punto, puede descubrir que la complejidad de las contraseñas necesarias para codificar su estado es demasiado grande.

Para disminuir la probabilidad de que la observación casual descifre la contraseña, puede transformar el diseño de bits para que introduzca bits ficticios (que no tienen efecto en el estado del juego pero que hacen que la contraseña se vea diferente cuando interpreta todos los bits como caracteres) o se ejecuta a través de una operación reversible similar a un hash para codificar los bits de manera que todos los bits de la "casilla X eliminada " no estén uno al lado del otro, haciendo que las contraseñas de estado secuencial correspondientes se vean muy diferentes o introduzcan valores de suma de verificación.

Si cavas, hay bastante información sobre los sistemas empleados para algunos de los juegos con contraseña más populares que existen:

Puede leer sobre ellos para obtener inspiración adicional.


fuente
44
Recuerde asegurarse de que la contraseña de "guardar estado" sea fácil de escribir y, de preferencia, no sea ambigua (por ejemplo, use '0' u 'O' pero no ambas).
minnmass
44
@minnmass puntos de bonificación si implícitamente convierte caracteres similares a su estándar, de modo que escribir 'O' en lugar de '0' todavía se traduce en '0'.
8
@ NPSF3000 Porque en este caso la "contraseña" no es una medida de autenticación; la "contraseña" es el medio de almacenamiento en sí.
Schilcote
66
@ NPSF3000 si la pregunta no lo aclara, debe volver a leer la pregunta o aprender el material de referencia.
hobbs
2
@ NPSF3000 OP dice claramente "Estilo retro" y hace referencia a Megaman para confirmar, lo cual no es ambiguo. Aprenda sobre el tema, comprenda que esto no está relacionado con la seguridad y deje de intentar defender lo que comenzó como una ignorancia honesta y perdonable.
MickLH
3

Esos juegos solo salvaron un estado, creo. La contraseña solo hace referencia a un nivel para cargar. Solo usa un diccionario para algo como esto.

Si es un poco más complejo como tener cierta arma o refuerzo, puede cifrar el estado en un código hash corto (pero lo suficientemente largo).

Pero te recomiendo encarecidamente que no uses esto. La contraseña se difundirá rápidamente en Internet y pronto todos ganaron su juego.

Madmenyo
fuente
99
Las contraseñas que se propagan en Internet pueden ser buenas. Hacer trampa puede ser divertido, y en un juego para un solo jugador, los jugadores solo se engañan a sí mismos.
Anko
@ Anko Sí, no me gusta hacer trampa y apenas lo hice, así que soy parcial. Pero, según mi propia experiencia, mis juegos acumularían polvo mucho más rápido y antes cuando me engañara.
Madmenyo
"... solo hace referencia a un nivel para cargar". No es cierto en todos los casos por el momento. Algunas contraseñas también hacen referencia a jefes, muertos, potenciadores ganados, etc. En segundo lugar, aconsejar que la contraseña se pueda difundir es una cosa, un problema en nuestro mundo hiperconectado. Decir que las opciones de trampa deberían eliminarse porque a USTED no le gusta hacer trampa es otra. Lo que te gusta no es exactamente lo que les gusta a los demás. No se trata de lo que te gusta, es el consumidor . Hacer trampa / atajos son una opción importante, especialmente para juegos de un solo jugador.
WernerCD
@WernerCD en primer lugar hablo de sistemas más complejos, solo comienzo con un sistema de contraseña simple. NO estoy reclamando nada. En segundo lugar, no estoy diciendo nada sobre hacer trampa en la respuesta. Solo estoy dando mi respuesta BIASED en un comentario e incluso diciendo que soy parcial y consciente de su punto de que no es lo que me gusta. Pero si nadie dice lo que le gusta o no le gusta, ¿cómo podría saber lo que les gusta a los demás? Todavía creo que un sistema como ese es debido y el engaño del siglo XXI se logra de manera diferente. La próxima vez deberías leer más detenidamente antes de escribir un comentario como ese en mi humilde opinión.
Madmenyo
Si tienes partidas guardadas, las personas también compartirán partidas guardadas.
Dewi Morgan
1

Bueno, básicamente podrías hacerlo de esta manera:

Jefes asesinados = 7

Cantidad de monedas = 36

Posee Espada = 0 (No)

Posee Corazón = 1 (Sí)

Nivel actual = 6

Mundo actual = 9

Salud = 100

Código = 7V36R0A1T6O9A100

Básicamente cada letra separa los tipos

aanda tv
fuente
-3

Si bien las soluciones como el sistema de personaje a estado de Josh Petrie tienen beneficios (tamaño de guardado pequeño, funciona en todas las copias del juego), combinan el diseño del juego y el sistema de estado para que sean intrínsecamente al sistema de contraseña. Cualquier cambio en la contraseña o estado o diseño y todo el sistema se desmorona.

Una solución mucho más simple sería construir su sistema de guardado como de costumbre, y simplemente agregar un sistema de contraseña en la parte superior. Esto puede ser tan simple como guardar la contraseña en el guardado (posiblemente duplicando el nombre del archivo) y validarla en la carga, o tan complejo como usar una de las muchas bibliotecas de cifrado (lo cual es bastante trivial).


Parece haber cierta confusión en torno a esta respuesta.

1) El operador simplemente ha pedido una contraseña que les permita cargar un guardado ... no es necesario que la contraseña sea el guardado.

2) Muchos juegos de hoy en día tienen un requisito de almacenamiento significativo, acabamos de construir internamente un sistema rápido de guardar / cargar que producía archivos de 10 MB ... ¡para un juego de preguntas! El sistema de guardado de Josh Petrie , aunque válido, es muy limitado: tan pronto como el sistema de la tienda deje de ser trivial, las contraseñas tendrían que tener una longitud enorme para conservar todos los datos pertinentes.

Por ejemplo, ¿qué pasa si hay 30 jefes? 20 logros? ¿Estamos a la mitad de un logro? ¿A qué nivel está él? ¿Cuántos bits estamos reservando para salud, vidas, monedas, xp? ¿Qué pasa si la instantánea no es de estado entre niveles ... sino a mitad de un nivel? Las posiciones del jugador, enemigos, proyectiles, terreno destruido / alterado de repente se suman a una gran cantidad de estado que necesita ser almacenado.

En perspectiva, suponiendo un alfabeto de 30 caracteres y una contraseña de diez letras, tenemos aproximadamente 50 bits de información para almacenar. No es raro ver que un juego / motor use hasta 320 bits solo para almacenar la posición, rotación y escala de un solo objeto. Claro, puedes hacer todo tipo de trucos de optimización para hacer más con menos ... pero finalmente estás usando el tiempo dedicado a hacer que el juego sea divertido, una de las peores optimizaciones que puedes hacer.

NPSF3000
fuente
3
Creo que el problema aquí, y con su comentario anterior, es que la seguridad criptográfica no es el objetivo de guardar el estado del juego como bits dentro de una contraseña. Las contraseñas compuestas de una manera tal son fácilmente reversibles, pero difícil de adivinar hashes , y nada más. Y por esa misma razón, no causa un acoplamiento indebido en la forma en que te estás imaginando; si el estado del juego se vuelve más o menos complicado, también lo hace el hash (que invalida los hashes anteriores), pero el sistema funciona igualmente bien antes y después.
Seth Battin
@Seth Battin "no causa un acoplamiento indebido en la forma en que te estás imaginando" ¡Oh, genial! Entonces, un juego en el que estoy trabajando ahora tenía un archivo guardado medido en megabytes ... ¡todo lo que necesito hacer es ofuscarme un poco y mostrarlo en una pantalla y listo! Ahora tenemos un sistema de contraseña perfectamente bueno?
NPSF3000
3
Parece que tu juego no es apropiado para este método.
Seth Battin
@ NPSF3000 ¿Cuál es el punto de las contraseñas en este caso? Si se trata de evitar que otras personas que usan la misma máquina usen sus juegos guardados sin permiso, ¿por qué no simplemente iniciar sesión una vez por juego con nombre de usuario / contraseña? Si se trata de especificar qué guardar quieren, es un "id de juego guardado", no una contraseña, y probablemente debería ser más amigable. Tal como están las cosas, si lo leo bien, ¿está solicitando una contraseña diferente, no especificada por el usuario, cada vez que cargan un nuevo guardado? ¿POR QUÉ? ¿Qué ventaja útil le da eso a alguien?
Dewi Morgan
1
@DewiMorgan No estoy requiriendo nada, simplemente estoy respondiendo a la pregunta de op: "¿Cómo crearía un sistema de contraseña para un juego de un jugador? Por ejemplo, Mega Man X ahorra trabajo al darte una serie de números que puede ingresar más tarde para cargar su guardado ". Mi solución hace eso, sin acoplar el sistema de guardar y el sistema de contraseña. La respuesta más votada tiene los mismos inconvenientes que la mía, con la adición de que requiere que todo el juego esté diseñado para adaptarse al método.
NPSF3000