Recientemente, jugué mucho en
Enter The Gungeon . Este es un increíble juego de infierno de balas terriblemente desafiante que me recuerda mucho a
Binding of Isaac . Pero cuanto más lo jugaba, más me daba cuenta del sutil genio del diseño de la mazmorra.
Hay muchos generadores de procedimientos que crean esquemas de nivel lógico que aseguran el ritmo correcto del juego y recompensan a los jugadores, y hay otros generadores que crean niveles con bucles y esquemas compactos. Pero es raro encontrar ambos tipos en un juego. El único juego que conozco en el que hubo un intento de implementar tal cosa es
Inexplorado .
Así que, naturalmente,
lancé el descompilador para que
Gungeon me revelara todos sus secretos. En este artículo compartiré contigo lo que logré encontrar.
A primera vista, los niveles de
Gungeon parecen bastante simples. Aquí hay un ejemplo típico de mapa.
Tarjeta típica de nivel 1El jugador comienza en la entrada.

corre por los cofres


y tendero

para recoger el botín y luego finalmente derrota al jefe

. Si te topas con un largo callejón sin salida, puedes usar teletransportes para regresar rápidamente a las habitaciones. Obviamente, las habitaciones separadas fueron creadas a mano y habitadas por varios enemigos que necesitan ser disparados. Al avanzar a los siguientes niveles del juego, el jugador ve el mismo patrón una y otra vez, solo que las etapas se hacen más grandes.
Hasta ahora, parece que esto no es nada interesante. En Internet puede encontrar muchos generadores que conectan pasillos a habitaciones aleatorias.
La función del generador se vuelve notable cuando comienzas a jugar. Los niveles parecen ... un poco más planificados de lo que cabría esperar de la casualidad. La sala del jefe siempre está a una distancia razonable desde el principio. Las habitaciones con enemigos siempre se entremezclan razonablemente con habitaciones tranquilas, bancos e intersecciones. Y lo más importante: muchos cofres se encuentran detrás de las bisagras con una cruz unidireccional.
La línea roja es un corredor unidireccional. Si desea ingresar a una habitación con un cofre, debe recorrer un largo camino. La gran mayoría de los cofres se encuentran al final de un bucle unidireccional o lo suficientemente profundo dentro del nivel, lo que obliga al jugador a luchar a través de muchas habitaciones, solo para llegar al cofre. No hay recompensa sin riesgo.
El secreto de este pasaje es que los esquemas generales se crean manualmente. Aquí está el diagrama utilizado para generar el nivel que se muestra arriba.
Las habitaciones normales son habitaciones seleccionadas al azar con enemigos, salas de intersección o salas grandes con múltiples salidas. Las recompensas (Recompensa) y el jefe (jefe) no necesitan explicarse. No muestra habitaciones "conectadas", es decir, habitaciones sin enemigos, a menudo con riesgos naturales. Las salas restantes están predefinidas o seleccionadas de una tabla de sala especial.
En
Gungeon, hay bastantes esquemas llamados "flujos" (flujo). En los niveles Hollow, son los menos (4), y en el Gungeon Proper, los más (8). Estos no son esquemas simples, su diseño se crea sobre la base de una determinada característica que se puede notar con múltiples pasajes. Puede ser un bucle gigante, o una bifurcación importante en muchos sentidos, o la necesidad de llegar al banco para pasar el nivel. Son tan notables que los corredores de velocidad notaron diferencias e
hicieron calendarios para encontrar al jefe lo más rápido posible. He preparado una lista completa de esquemas que se pueden descargar
desde aquí .
Es posible que haya notado que el patrón de flujo y el mapa no coinciden completamente. Debajo del banco hay una habitación extra. inconsistente con el esquema, y extrañas salas de pasillo

. Estudiemos todo el proceso, contiene muchas ideas inteligentes.
El proceso comienza seleccionando aleatoriamente un archivo continuo como el que se muestra arriba. Esta
es la estructura de datos del "gráfico" , es decir, almacena las interconexiones de las habitaciones, pero no su ubicación. Cada sala contiene metadatos sobre el tipo de sala y las conexiones que debería tener. Las conexiones tienen una dirección: cada diagrama de flujo comienza desde el nodo raíz y luego forma un árbol de nodos secundarios. Luego, conexiones adicionales rompen la estructura de árbol para crear bucles. Creo que esto se debe principalmente a las peculiaridades del desarrollo del juego, pero simplifica el procedimiento para analizar el mapa, porque todos los bucles tienen un principio y un final claramente definidos.
Conversión de flujo
Un archivo continuo se puede convertir de varias maneras. Primero, algunas salas específicas serán reemplazadas por series de salas de longitudes aleatorias. Esta función se usa solo en niveles posteriores más grandes. Además, algunas partes del archivo continuo tienen rutas alternativas, y una de ellas se selecciona al azar. Esta función se usa solo dos veces.
Luego se “inyectan” algunos nodos adicionales. Esta función es bastante flexible y se usa para muchos propósitos diferentes.
Cada "inyección" contiene datos que determinan qué tipo de objeto debe insertarse, dónde debe insertarse, la probabilidad de creación y las condiciones que deben cumplirse (por ejemplo, la presencia de una
ronda maestra , una
maldición alta o que el jugador aún no ha guardado el personaje ) Por ejemplo, las habitaciones secretas generalmente se crean en callejones sin salida, pero tienen una probabilidad de 1/5 de estar unidas a cualquier habitación. Tienen una probabilidad del 90% de ocurrencia y no requieren condiciones adicionales.
Casi todas las salas especiales del juego están determinadas por la inyección del sitio, incluidos los comerciantes (sin incluir la tienda principal), las cárceles, las salas con chimeneas y los ascensores.
Una de las celdas de la prisión que se puede inyectar en un nivel.En la misma etapa, el generador selecciona una habitación específica para cada nodo. Esto depende principalmente de la etapa actual y del tipo de habitación necesaria. Hay una gran lista de habitaciones, casi 300 para la primera etapa, pero el generador intenta no seleccionar la misma habitación dos veces.
Los nodos del conector funcionan de manera diferente. Sus habitaciones se seleccionan más tarde, mientras se crea el esquema. A menudo se trata de habitaciones largas y estrechas, por lo que es muy importante elegir una habitación con la orientación correcta.
Objetos compuestos
Una vez completada la creación de la secuencia, se divide en "objetos compuestos". Cada objeto compuesto es un bucle separado de las habitaciones o un conjunto de habitaciones conectadas sin bucles (es decir, un
árbol ). Esto se logra al encontrar el bucle más pequeño en el mapa y cortarlo como un objeto compuesto. La operación se repite hasta que no haya bucles en el mapa. El resto del mapa se convierte en un conjunto de árboles divididos y conexiones entre objetos compuestos individuales.
La misma corriente después de la inyección y divisiónEsquema de objeto compuesto
Luego, cada objeto compuesto se crea por separado, en un mapa separado. Se unirán más tarde.
Para planificar un objeto compuesto, la primera habitación se coloca en un lugar arbitrario. Luego, las salas se agregan al circuito una por una seleccionando un par de salidas, una de las cuales se relaciona con la nueva sala y la otra con el circuito existente. Las salidas son ubicaciones predefinidas en los metadatos de cada habitación. Luego, la nueva sala se coloca de modo que su salida esté directamente conectada a la salida de la sala anterior. Entonces el proceso se repite.
Más específicamente, los objetos del árbol compuesto se colocan atravesando el árbol
en profundidad . El algoritmo selecciona solo aquellos pares de salidas que conducen a la aparición de una nueva habitación sin cruzarse con las anteriores. En general, el algoritmo prefiere elegir salidas que estén lejos de las existentes. Si es imposible colocar una habitación,
volverá y regenerará la elección de habitaciones, repitiendo este proceso hasta tres veces.
Mientras tanto, los objetos de bucle compuesto se colocan agregando elementos del bucle a su vez a ambos lados de la línea. Para empezar, se seleccionan aleatoriamente pares de salidas (se da preferencia a paredes opuestas, este-oeste o norte-sur). Cuando el bucle está medio creado, comienza a dar preferencia a los pares de salidas que unen dos bordes abiertos del bucle. Después de crear todas las salas, el algoritmo necesita agregar otra conexión entre las dos últimas salas. Elige otro par de salidas. Si es posible, diseña entre estas salidas una pequeña habitación rectangular. De lo contrario, busca un camino entre las salidas y crea una "habitación", que es simplemente un pasillo estrecho. La longitud del corredor debe ser de 4 a 30 unidades (en minas de hasta 50).
Montaje final
En esta etapa, pequeñas partes separadas de la mazmorra están conectadas entre sí, pero los objetos compuestos deben estar conectados para crear un mapa completo.
El mismo mapa que los objetos compuestos antes del ensamblaje finalComo puede ver, los compuestos restantes en este caso no dan una selección muy grande. Pero puede haber casos más complejos que antes. El algoritmo omite el mapa, comenzando desde la habitación con la mayor cantidad de conexiones. Como antes, se selecciona un par de salidas para cada conexión creada. Si dos habitaciones están en partes separadas del mapa, estas dos partes del mapa están alineadas para crear un camino corto. De lo contrario, se utiliza una búsqueda de ruta para crear la ruta.
Y aquí es donde termina la creación del diagrama de nivel. Solo queda elegir enemigos y decoraciones para las habitaciones, y este es un tema completamente diferente.
En conclusión
Parece que el objetivo principal de los desarrolladores era crear un generador de procedimientos que proporcionara una jugabilidad satisfactoria. Obviamente, para que se implementara correctamente, tuvieron que realizar muchas iteraciones: encontré una gran cantidad de código de generación, que, al parecer, no se usa, porque los desarrolladores han cambiado su fórmula de procedimiento en busca de la perfección.
Un truco curioso es que generan primero las partes más complejas / importantes del mapa. El generador se centra en crear bucles estrechos y corredores cortos en las partes más centrales del nivel, y luego intenta conectar todo lo demás con ellos.
Al igual que con mi
estudio de la generación de nivel de Diablo 1 , me llamó la atención lo eficiente que es generar parte de la mazmorra en forma abstracta; en este caso, es un gráfico sin información de ubicación. Todo se vuelve más específico solo más tarde. La función de "inyección" sería simplemente imposible si inmediatamente trabajáramos con un mapa de mosaico. Gracias a la abstracción de los detalles de la ubicación de las habitaciones, te permite controlar el estilo del juego y la escala de nivel.
Además, me impresionó la extensibilidad del sistema en su conjunto. Unity fomenta un enfoque activo
basado en datos . Agregar una nueva sala, esquema o incluso un comportamiento especial se puede realizar simplemente agregando nuevos objetos a las tablas correspondientes. Esto debe haber sido de gran ayuda, porque Dodge Roll ya ha lanzado algunos DLC gratuitos y, sin lugar a dudas, admite la creación de
modificaciones .
Bonos
Estudiar este generador fue mi primera oportunidad para investigar la creación de un juego profesional en Unity. Los desarrolladores de Dodge Roll hicieron lo mejor que pudieron y escribieron un buen código. Está bien leído, y en algunos lugares es bastante divertido, parece que su amor por los juegos de palabras se ha extendido al código. Me gustaron estos:
- El motor de fluido en el juego se llama
DeadlyDeadlyGoopManager
- El código de generación de mazmorra se llama
Dungeonator
- Los diversos pasos se llaman
CASTLEGEON/GUNGEON/MINEGEON/CATACOMBGEON
etc. Me pregunto si los desarrolladores se inspiraron en Diablo 1, que utiliza un esquema muy similar. - Literalmente, cada habitación tiene su propio nombre, generalmente en forma de juego de palabras (o en honor a algunos Joe; probablemente este es un artista con gran vanidad).
También noté que inicialmente el estudio tenía planes para escenarios en los temas del espacio, la jungla y el salvaje oeste. Por desgracia, no estaban destinados a aparecer. Dodge Roll decidió que su trabajo en
Gungeon se había completado . Esperaré su próximo juego y espero que le pongan tanto amor y atención.