Encriptar las partidas guardadas

¿Por qué?

Porque el mundo de hoy no es el mundo de ayer. Una oligarquía capitalista dirige el mundo y nos obliga a consumir para mantener los engranajes de esta sociedad podrida. Por lo tanto, el mayor mercado para el consumo de videojuegos hoy en día es el móvil. Es un mercado de pobres almas obligadas a consumir compulsivamente contenidos digitales para olvidar la miseria de su vida cotidiana, los desplazamientos, o cualquier otro breve momento libre que tengan y que no utilicen para producir bienes o servicios para la clase dominante. Estos individuos necesitan seguir centrándose en sus videojuegos (porque no hacerlo les llenará de una tremenda angustia existencial), por lo que llegan a gastar dinero en ellos para ampliar su experiencia, y su forma preferida de hacerlo es a través de compras in-app y moneda virtual.

But what if someone were to find a way to edit the saved games and assign the items and currency without effort? That would be terrible, because it would help players consume the content much faster, and therefore run out of it sooner than expected. If that happens, they will have nothing that prevents them from thinking, and the tremendous agony of realizing their own irrelevance would again take over their life.

No, definitivamente no queremos que eso suceda, así que veamos cómo encriptar las partidas guardadas y proteger el orden mundial.

¿Cómo?

La clase File puede abrir un archivo en una ubicación y leer/escribir datos (enteros, cadenas y variantes). También soporta la encriptación. Para crear un archivo cifrado, se debe proporcionar una expresión de seguridad, como esta:

var f = File.new()
var err = f.open_encrypted_with_pass("user://savedata.bin", File.WRITE, "mypass")
f.store_var(game_state)
f.close()
var f = new File();
var err = f.OpenEncryptedWithPass("user://savedata.bin", (int)File.ModeFlags.Write, "mypass");
f.StoreVar(gameState);
f.Close();

Esto hará que el archivo sea ilegible para los usuarios, pero aún así no impedirá que compartan los archivos de guardado. Para resolver esto, utiliza el id único del dispositivo o algún identificador de usuario único, por ejemplo:

var f = File.new()
var err = f.open_encrypted_with_pass("user://savedata.bin", File.WRITE, OS.get_unique_id())
f.store_var(game_state)
f.close()
var f = new File();
var err = f.OpenEncryptedWithPass("user://savedata.bin", (int)File.ModeFlags.Write, OS.GetUniqueId());
f.StoreVar(gameState);
f.Close();

Ten en cuenta que OS.get_unique_id() no funciona en UWP o HTML5.

¡Eso es todo! Gracias por su cooperación, ciudadano.

Nota

This method cannot really prevent players from editing their savegames locally because, since the encryption key is stored inside the game, the player can still decrypt and edit the file themselves. The only way to prevent this from being possible is to store the save data on a remote server, where players can only make authorized changes to their save data. If your game deals with real money, you need to be doing this anyway.