warren

Un roguelike con progresión persistente, en Lua, controlado desde el terminal. Runs generados, clases, mutadores y "legacy" entre partidas - con modo headless y verificación del determinismo.

warren
TL;DR

Un roguelike con progresión persistente en Lua, controlado desde la terminal. Recorridos generados, clases y mutadores, un sistema de legado entre partidas. La clave: un recorrido es a la vez aleatorio y plenamente determinista, porque el mismo seed debe producir exactamente el mismo recorrido.

Introducción

Un roguelike vive de la aleatoriedad: cada recorrido una disposición de niveles distinta, objetos distintos, decisiones distintas. Pero si esa aleatoriedad fuera de verdad aleatoria, no se podría ni probar el juego ni comparar resultados de forma justa. warren resuelve esa paradoja con un seed que hace el mundo fresco para el jugador y repetible para la máquina.

Todo lo demás está construido en torno a esta única propiedad: las clases, los mutadores y la capa de legado entre partidas. El determinismo aquí no es un límite a la diversión sino el cimiento sobre el que pueden apoyarse tanto las pruebas como una progresión con sentido.

Aleatorio para el jugador, repetible para la máquina

Todo el recorrido se deriva de un solo número. El mismo seed engendra siempre el mismo mundo, pero el jugador ve igualmente frescura porque el seed cambia en cada partida. La aleatoriedad es así aparente en el sentido técnico y real en el sentido percibido: la disposición de niveles, los objetos y los eventos están calculados, no sorteados de nuevo.

rng.lua · lua
local rng = Rng.new(seed)
local room = rng:pick(roomTemplates)
local loot = rng:pick(lootTable)

La clave está en que cada tirada pasa por este único generador alimentado por el seed. Basta con que una sola llamada busque aleatoriedad fuera de él, y el determinismo se hace añicos, por eso todo el recorrido debe pasar con disciplina por la misma fuente.

El determinismo como herramienta de prueba

Como el seed determina por completo el recorrido, se puede volver a jugar sin un humano. warren tiene un modo headless que juega solo sobre un seed dado y comprueba que el resultado es idéntico cada vez. Eso convierte una lotería en algo que se puede someter a regresión: si un cambio de código rompe el determinismo, la prueba lo atrapa enseguida.

➜
Consejo

Prueba el determinismo de forma contrafactual: introduce una llamada de aleatoriedad inesperada fuera del generador principal y comprueba que un recorrido del mismo seed deja de coincidir. Si la prueba no lo nota, no está vigilando nada.

El legado, el rastro de los recorridos anteriores

La progresión persistente significa que la muerte del héroe no borra todo. Entre recorridos queda una capa de legado: clases desbloqueadas, mutadores que cambian las reglas, pequeños bonos permanentes. Así la siguiente partida empieza de forma distinta a la anterior, aunque el motor siga siendo plenamente determinista sobre su seed.

Separar estas dos capas importa aquí. El seed rige un solo recorrido, el legado se transmite entre ellos, y los dos no deben mezclarse, porque de lo contrario la progresión contaminaría la repetibilidad de una sola partida.

Qué viene del seed y qué del legado

ElementoFuente
Disposición de nivelesseed
Objetos y eventosseed
Clases desbloqueadaslegado, permanente
Mutadores que cambian las reglaslegado, permanente

Más proyectos

Más trabajos de la misma categoría - mira cómo abordamos retos parecidos.

¿Tiene un proyecto similar?

Escríbenos - el presupuesto es gratuito y llega en una hora.