Un combate que se puede repetir: así comprueba el servidor tu partida
Prismloot tiene clasificaciones de profundidad y de colección. Cuando hay una clasificación, hay que poder fiarse de ella. Esta es la decisión técnica que tomamos para eso (el 6 de octubre) y cómo está funcionando.
Las alternativas
Comparamos cuatro caminos:
- Funciones en JavaScript que tiran el botín. Habría que escribir el botín, la forja y el desguace dos veces: una en el juego y otra en el servidor.
- Que mande el móvil y el servidor solo valide el top. El equipo se puede falsear, y repetir una partida con un equipo falso no demuestra nada.
- Otro proveedor de juegos online. Tiene el mismo problema que el primero.
- Un servidor alquilado. Queda como plan B si algún día el coste se dispara.
La decisión: el servidor es el propio juego
El servidor es el mismo código de Godot que el juego, pero sin ventana, ejecutándose en Cloud Run. Así el combate se escribe una sola vez. El flujo es este:
- Al empezar la partida, el servidor da la semilla.
- Tú juegas en el móvil y ves el botín al momento, porque el móvil calcula lo mismo con el mismo código.
- Al acabar, el móvil manda las puertas que elegiste. El servidor vuelve a jugar la partida con la semilla y con el equipo que él mismo tiene guardado, y escribe el botín.
- Si no coincide, gana el servidor.
El móvil nunca toca la base de datos: solo habla con nuestro servidor, que es el único que lee y escribe.
Lo que exige un combate repetible
Para que dos máquinas distintas jueguen exactamente lo mismo, el combate tiene reglas estrictas: solo sumas, restas, productos y divisiones (nada de potencias, exponenciales, logaritmos ni del reloj) y toda la aleatoriedad sale de un generador con semilla por piso. Incluso la variación de ±10 % de cada golpe sale de ese generador.
Y aun así nos mordió un detalle: Godot no siempre lee un decimal igual que lo escribió. Al pasar las tiradas de los afijos por JSON, 2.853 de cada 20.000 cambiaban en el último bit. Para el jugador eso es invisible, pero el móvil y el servidor jugarían con números ligeramente distintos. Ahora cada tirada se guarda en una forma canónica de tres decimales.
Cuánto cuesta
El simulador juega unas 8.000 partidas en dos minutos, alrededor de 15 milisegundos cada una. Repetir una partida en el servidor es barato.
Versiones
Cada vez que cambia el código que decide resultados (combate, botín, cuenta), cambia una «huella de reglas». El servidor mantiene una revisión por cada versión de las reglas, y cada versión del juego habla con la suya. Así, mientras Apple revisa una versión nueva, la anterior sigue funcionando.
Todo esto está en pruebas internas. Si te interesa verlo con tus propios ojos, apúntate a la beta.
Esta entrada también está en: English