Generación de mazmorras en Diablo 1

imagen

Diablo 1 es el clásico hack and slash roguelike de 1996. Este fue uno de los primeros intentos exitosos de introducir a las masas a roguelike, que hasta entonces tenía gráficos de nicho en forma de arte ASCII. El juego generó varias secuelas y muchas simulaciones. Es conocida por su atmósfera oscura y sombría, que se vuelve más espesa a medida que el jugador desciende a las mazmorras ubicadas debajo de la ciudad de Tristram. Fue uno de los primeros juegos con generación de mapas de procedimientos para mí, y la posibilidad de generar niveles tan creíbles me sorprendió.

Recientemente descubrí que, debido al descubrimiento de varios archivos con símbolos de depuración, varios fanáticos del juego se encargaron de realizar una ingeniería inversa del código fuente para limpiarlo y descubrir cómo era el código escrito por los desarrolladores. Así comenzó mi excursión de una semana en el estudio de cómo el desarrollador principal David Brevik creó estos niveles. Quizás debido a esto, la magia del juego para mí colapsó parcialmente, pero aprendí muchas técnicas que serán útiles para los desarrolladores de juegos similares, así que en este artículo las compartiré.

Gracias a David Brevik y al equipo de Blizard North por crear un juego tan increíble, así como a galaxyhaxz y al equipo de Devilution por su increíble trabajo en la restauración del código fuente legible del proyecto.

Introduccion


Diablo es un juego que consiste en fichas isométricas. El juego consta de 4 etapas, cada una de las cuales tiene 4 niveles. Etapas del juego: Catedral, Catacumbas, Cuevas e Infierno. También hay varios niveles fijos, por ejemplo, la ciudad de Tristram, que no consideraré en el artículo. Diablo tiene procedimientos de generación de niveles separados para cada una de las 4 etapas, por lo que primero hablaré sobre sus características y luego consideraré por separado el funcionamiento de cada una de las etapas.

Solo me interesaba cómo se generaban los niveles. Para aprender sobre misiones, monstruos, etc. Recomiendo leer la Guía de Jarulf para Diablo y Hellfire , que describe estos aspectos en detalle.

Características generales


Aunque cada etapa tiene su propio generador de niveles, todos tienen características comunes.

Mazmorras y Azulejos


Cada nivel del juego se genera para llenar una cuadrícula de 40 x 40 fichas. El eje X corresponde al sureste, y el eje Y corresponde al suroeste.

Estos mosaicos se usan solo para tareas de generación de nivel. Después de crear un nivel, cada ficha se divide en 4 "fragmentos de mazmorra", que se muestran en la pantalla.


Esta cuadrícula más detallada se utiliza para determinar los mosaicos recorridos y también proporciona una reutilización más eficiente de la memoria de gráficos. Anteriormente, escribí sobre esquemas de división de mosaicos .

Esto significa que la tarjeta Diablo estándar consta de más de cien fichas, muchas de las cuales son pequeñas variaciones de otras, para tener en cuenta todas las formas posibles de conectarlas. Hablaremos de esto más tarde.

Para mi sorpresa, a diferencia de otros juegos de esta serie, los mapas de mazmorras no están compuestos de bloques creados previamente. Casi todo se crea utilizando algoritmos.

Proceso de etapas múltiples


Cada procedimiento de generación de mazmorras se divide en dos etapas. La pregeneración no tiene nada que ver con la elección de los mosaicos. Simplemente genera una matriz en la que se marcan los mosaicos transitables, los mosaicos en los que hay puertas y algunos otros detalles de alto nivel. En la segunda etapa, esta mazmorra en blanco se convierte en una matriz de mosaicos, después de lo cual se realiza la generación y se realizan cambios teniendo en cuenta estos mosaicos.

Esto debería ser increíblemente conveniente para el diseñador. Puede experimentar con un plano de planta completamente independiente de la elección de azulejos y estilo. Pero en muchos casos, están interconectados, proporcionando un sentido de nivel más holístico.

Todas las etapas de creación de espacios en blanco de mazmorras comienzan con un nivel lleno de "dureza" sólida, después de lo cual las partes individuales del nivel se convierten recursivamente en baldosas. Discutiré esto con más detalle a continuación.

Fragmentos terminados


Los fragmentos terminados son bloques de nivel creados previamente que simplemente se insertan en un nivel generado aleatoriamente. Se usan para la mayoría de las misiones de juego. En cada nivel solo puede haber un fragmento terminado, cuya ubicación en cada etapa se selecciona por separado.


Butcher's Den es uno de los primeros fragmentos prefabricados encontrados en el juego.

Mini sets


Los mini kits son otra forma de insertar contenido en un nivel de contenido pre-creado. Estas son piezas pequeñas, generalmente de aproximadamente 3 × 3 de tamaño, insertadas al azar en la mazmorra. Existe un esquema de coincidencia de patrones simple, gracias al cual aparecen solo en los lugares "correctos". A menudo están codificados con requisitos adicionales, por ejemplo, los mini-sets no pueden colocarse cerca uno del otro, no pueden superponerse con fragmentos ya hechos, etc. Algunos mini-kits siempre buscan y reemplazan, mientras que otros lo hacen con una probabilidad fija.

Los mini kits de Diablo se utilizan para muchos propósitos diferentes. Se utilizan para colocar objetos grandes de mosaicos, como escaleras, para arreglar combinaciones de mosaicos que no se conectan bien entre sí y para agregar variaciones aleatorias a los mosaicos.

Salas temáticas


Las habitaciones temáticas son pequeños espacios delimitados por una pared y una puerta. Por lo general, en ellos de manera aleatoria se ubican ciertos objetos predeterminados. Por ejemplo, las bibliotecas siempre tienen una estantería con dos velas a cada lado, varios sujetalibros y monstruos al azar. Las guaridas de monstruos contienen muchos monstruos y un elemento aleatorio, y así sucesivamente.

En los niveles de la etapa de la Catedral, el generador crea habitaciones adecuadas que se reconocen por relleno y se reutilizan. En otras etapas, el algoritmo encuentra espacios abiertos en los que se dibujan paredes y una puerta para crear habitaciones.

Cada tipo de sala temática tiene ciertos requisitos para el tamaño y la etapa en la que se genera.

Reemplazo de azulejos


Algunas cartas tienen una adaptación especial de las fichas, pero todas tienen una característica común: algunas fichas pueden ser reemplazadas por variaciones similares. Las baldosas más estándar (por ejemplo, pisos y paredes planas) tienen diversas variaciones, lo que reduce la monotonía del nivel. Los reemplazos de azulejos nunca se reutilizan uno al lado del otro.

Comparación de patrones y "correcciones"


Como se mencionó anteriormente, los mini-sets se utilizan como un mecanismo de búsqueda y reemplazo que corrige los defectos del generador. Pero en la mayoría de las etapas, existen procedimientos que detectan y solucionan problemas más específicos. No entraré en detalles, porque solo hay un montón de ellos. Baste decir que Diablo tiene muchos errores, y más cerca del lanzamiento se hizo evidente que sería más fácil agregar el reconocimiento de problemas específicos que eliminar sus causas fundamentales.

Una de las "soluciones" más comunes fue el "bloqueo": verificó si era posible atravesar toda la mazmorra y comenzó la generación nuevamente si no era así.

Misiones


La mayoría de las misiones se crearon usando fragmentos ya hechos, pero algunos usaron su propia lógica. Por ejemplo, Zhar el Loco genera salas de biblioteca temáticas, la entrada al agua envenenada se genera mediante una mini-marcación, y Anvil of Fury tiene un código de generación de nivel específico. No entraré en detalles, pero el código está lleno de verificaciones similares para misiones.

Catedral


La catedral es probablemente la más icónica de las etapas de Diablo. Se caracteriza por largas hileras de arcos góticos, habitaciones estrechas y muchos cuellos de botella en forma de puertas. Veamos cómo se creó.

imagen

Mazmorra en blanco


Lo primero que hace el algoritmo es dibujar el núcleo de la tarjeta. Selecciona aleatoriamente hasta tres habitaciones de 10 × 10 en posiciones predeterminadas a lo largo del eje central X o Y. También se dibuja un amplio corredor que conecta las habitaciones a lo largo del eje. Si hay un fragmento terminado en el nivel, siempre está ubicado en el centro de una de estas habitaciones. Estas salas de mazmorras centrales están marcadas como inadecuadas para nuevas paredes, por lo que siempre permanecen grandes espacios abiertos.

Todas las demás salas se generan mediante la técnica de L5roomGen recursiva en una función llamada L5roomGen , que se activa en cada una de estas salas, y seleccionando un eje.

Función L5roomGen


  • Ella pasa el rectángulo de la habitación original, desde el cual debe comenzar a brotar, así como el eje preferido.
  • Con una probabilidad de 1/4, el eje preferido cambia.
  • Se selecciona el tamaño aleatorio de la nueva sala, con 2, 4 o 6 fichas en cada lado.
  • Para cada lado de la sala original a lo largo del eje seleccionado (es decir, SE / NS para X, SW / NE para Y):
    • El rectángulo de la nueva sala se alinea con el centro del borde de la sala original.
    • Se verifica que antes de eso no se dibujó nada y no llegamos al final del mapa. Las paredes requieren un borde de una baldosa.
    • Si la verificación es exitosa, se dibuja una habitación.
  • Para cada sala que se L5roomGen , L5roomGen se llama de forma recursiva, que pasa la nueva sala y el eje opuesto al que se usaba anteriormente.

Finalmente, este procedimiento comienza con varias habitaciones cortadas dentro de los mosaicos "sólidos", y luego pega repetidamente nuevos rectángulos para cortar nuevas áreas transitables. En esta etapa, todas las "habitaciones" están abiertas por un lado, porque cada nueva habitación está ubicada directamente al lado de la anterior, sin pases para colocar paredes.

Luego, el generador calcula el número de mosaicos atravesados ​​generados. Si está por debajo del umbral mínimo, que aumenta con cada nivel, la mazmorra se destruye y el intento de generación se realiza de nuevo.

Mazmorra


Hasta ahora, el algoritmo solo tiene los mosaicos "sólidos" y de género. Necesitamos reemplazarlos con azulejos de pared reales. Para esto, Diablo utiliza el algoritmo de cuadrados de marcha, que describí en un artículo anterior .

Sin embargo, el juego usa su variación inusual. El conjunto de azulejos de la catedral contiene paredes, pero siempre se encuentran en el extremo más alejado del azulejo. Por lo tanto, hay una baldosa con una pared en el borde noreste, pero no hay baldosas con una pared en el borde sureste. Para crear muros en otros lados, debe encontrar un mosaico "sólido" que tenga un muro adicional que se extienda hacia afuera desde el borde del mosaico. Suena extraño, pero de hecho es muy conveniente para clasificar paredes por profundidad.


Para lidiar con esto, Diablo omite algunas paredes durante la fase de cubos de marcha:


Muros adicionales se agregan más tarde, en la etapa de "arreglos". Creo que este simple procedimiento afecta más el "estilo" de la catedral. Dado que las paredes opuestas están unidas a baldosas sólidas, en el caso de dos habitaciones separadas por una baldosa, la pared opuesta simplemente no se creará. Esto significa que los divisores entre las habitaciones son "más delgados" de lo que normalmente se puede obtener en la resolución en la que se ejecutan los cuadrados de marcha.

Después de colocar las paredes principales, el generador agrega cuatro columnas independientes a cada una de las habitaciones centrales y una columnata de arcos para el corredor central. Esto le permite darle a la catedral una sensación de diseño más cuidadosa que otros niveles, y también ayuda a los jugadores a navegar.

El generador agrega aleatoriamente muros divisorios. Los muros de separación siempre van rectos a lo largo del eje de un muro a otro. Comienzan desde las esquinas, por lo que las áreas están bellamente divididas en habitaciones. En el 25% de los casos, una pared es una serie de arcos, en el 25% de los casos es una serie de arcos con una rejilla que bloquea la entrada, y en todos los demás casos es una pared sólida. En el caso de rejillas y paredes sólidas, en algún lugar a lo largo de la pared de separación, se agrega una puerta o arco al azar para que el espacio sea transitable.

El procedimiento de llenado detecta posibles salas temáticas.

Se colocan escaleras para conectarse a otros niveles. Si es imposible colocarlos, entonces el intento de generar la mazmorra comienza de nuevo.

En cuanto a la disposición de mini-sets, "arreglos" y reemplazos, no los consideraré en detalle. Sobre todo, me encanta el mini-kit PANCREAS1, que tiene un 1% de posibilidades de colocar una pila de carne ensangrentada en el piso. Al final, se colocan 5-10 objetos de la lámpara para decorar la mazmorra.

Catacumbas


A diferencia de la Catedral, que parece ser un edificio diseñado, las catacumbas se sienten mucho más espontáneas. Se caracterizan por habitaciones cuadradas conectadas entre sí por muchos corredores sinuosos. En muchos lugares, en lugar de puertas, se encuentran amplias aberturas. aumentando la probabilidad de que el jugador esté rodeado de muchos enemigos.

El algoritmo de generación más complejo del juego se utilizó para generar catacumbas. Sospecho que la falta de tiempo ha obligado a los desarrolladores a aplicar soluciones más simples en etapas posteriores.

imagen

Mazmorra en blanco


El procedimiento para crear una mazmorra en blanco para las catacumbas es bastante único. En todas las demás etapas, hay un único valor booleano que indica la presencia o ausencia de sexo (más un conjunto de bits para detalles adicionales). Las catacumbas almacenan la mazmorra en blanco en forma de una tarjeta ASCII, casi como un clásico roguelike. Y esto no es particularmente sorprendente dada la admisión de David Brevik de que se inspiró para Diablo de Angband .

El generador de sala principal es nuevamente un algoritmo recursivo, pero esta vez una partición recursiva. La función CreateRoom llama para toda el área de mazmorra de 40 × 40 menos 1 mosaico de borde.

Función CreateRoom


  • La función CreateRoom pasa un rectángulo que denota el área dentro de la cual desea generar habitaciones. Los detalles también se pasan a la función sobre la sala original (inicialmente nula)
  • Si el área es demasiado estrecha, se sale de la función.
  • Se selecciona un tamaño aleatorio para la habitación de 4 a 9 fichas en cada lado, teniendo en cuenta el tamaño máximo del área en la que desea colocar la habitación.
  • En el área, se selecciona una posición aleatoria para colocar la habitación.
  • La sala se representa en un mapa ASCII. En la figura, el símbolo '.' las baldosas se indican, el símbolo '#' es la pared circundante y las letras 'A' , 'B' , 'C' y 'E' son las cuatro esquinas.
  • Si una habitación tiene una habitación fuente:
    • Se selecciona un mosaico aleatorio en los bordes más cercanos de las habitaciones originales y nuevas.
    • Esta información se registra en la lista de corredores, que se utilizará más adelante.
  • Las partes restantes del área, con la excepción de la habitación actual, se cortan, creando cuatro rectángulos.
  • El tamaño de cada rectángulo se reduce en dos mosaicos para crear un espacio entre las habitaciones, y luego la función CreateRoom se llama recursivamente, la región para la que se usa este rectángulo y la habitación creada como fuente.

Si hay un fragmento terminado en el mapa, siempre estará en la primera sala creada por CreateRoom, y sus dimensiones se hacen para que este fragmento se coloque en él.

Después de llamar a CreateRoom una matriz ASCII similar a la que se muestra a continuación (gracias nomdenom por extraerlo del código):

 A##B #..# A####B #..# #....# #..# #....# C##E #....# C####EA#####B #.....# #.....# A########B #.....# #........# #.....# #........# C#####E #........# A#B #........# #.# #........# #.# #........# #.# #........# #.# #........# #.# C########E #.# #.# A#BC#E #.# A####B #.# #....# #.# #....# #.# #....# #.# C####E #.# #.# A#####BC#E #.....# A###B #.....# #...# #.....# C###E #.....# C#####E 

En este caso, la sala "raíz", creada originalmente, era la más baja.

Luego se aplica la información del corredor recopilada previamente. Se dibuja una línea entre cada par de puntos registrados. Cuando cruza una pared, 'D' escribe 'D' , y cuando cruza un mosaico sólido ',' . Los corredores tienen un ancho aleatorio: 1, 2 o 3. Las fichas de esquina se utilizan para ayudar en la navegación.

Si las puertas están adyacentes a otra puerta, se omiten y los corredores pueden superponerse entre sí, lo que le permite ocultar la simplicidad del generador.

Después de grabar todos los corredores, se borra la tarjeta ASCII. Los azulejos de esquina se convierten en azulejos de pared, y los azulejos ' ' lado de ',' también se convierten en paredes. Finalmente, los caracteres ',' se reemplazan por los caracteres '.' . Entonces obtenemos el plan de mazmorra que se muestra a continuación.

 #### #..# ###### #..# #....# #..# #....# #D## #....# #.# #D#### ##D#### #..# #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# #........# ### #.##D#### #........# #.### #.##...# #........###.D.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# ###D#######..#.# #.##...# #.......#..#.# #.###D## ###.....#..### #.# #.# #######D##.# #.# #.# #....#.# #.# #.# #....D.# #.# #.# #....###### #.# #.# ##D####....## #.# #.# #...........# #.# #.# ####....###D####.# ### ######.....##.# #####.D.....##.# #...D.#.....D..# #####.#.....#### ######### 

Como puede ver, este procedimiento puede dejar bastante espacio vacío en el mapa. Por lo tanto, el siguiente paso del generador es "llenar los vacíos". Busca cualquier sección de pared adyacente a la que se puedan pegar rectángulos de piso adicionales. Los rectángulos pueden ser de al menos 5 × 5 y no más de 12 × 14 de tamaño.

El llenado vacío continúa hasta que se obtenga un mínimo de 700 fichas, o se alcance el límite de reintentos. Si el generador no pudo alcanzar 700 fichas, la generación de mazmorras comienza desde cero.

Esto nos da la mazmorra en blanco que se muestra a continuación.

  ########## #........# ########### #........# #.........# #........# #.........# #........# #.........# #### #........# #.........# #..# #######..###.........# #..# #..............# #..# #..............# #D## #..............# #.# #D####.........# ##D#### #..# ########### #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# ########........# ### #.##D#### #...............# #.### #.##...# #...............###.D.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #......###D#######..#.# #.##...# #......# #.......#..#.# #.###D## #......# ###.....#..### #.# #.# #......#########D##.# #.# #.# #.........# #....#.# #.# #.# #.........# #....D.# #.# #.# #.........# #....###### #.# #.# #.........# ##D####....## #.# #.# #.........# #...........# #.# #.# #.........# ####....###D####.# ### #.........# ######.....##.# #.........# #####.D.....##.# #.........# #...D.#.....D..# ########### #####.#.....#### ######### 

Mazmorra


Una vez más, las catacumbas son diferentes de la fórmula de nivel estándar. En lugar del algoritmo de cuadrados de marcha (que asigna fichas basadas en cuadrados de 2 × 2 del espacio en blanco de la mazmorra), utiliza su propio procedimiento de coincidencia de patrones, que examina cada uno de los rectángulos de 3 × 3 del espacio en blanco de la mazmorra y selecciona el mosaico correspondiente para la mazmorra. Los patrones determinan lo que debe ser cada loseta de mazmorra: una pared, piso, puerta, loseta sólida o una combinación de ambas. No entiendo bien por qué.

El resto de la función le parecerá familiar desde la Catedral. Se colocan escaleras hacia arriba y hacia abajo en el mapa, se verifica la mazmorra para ver la posibilidad de un pasaje completo y también se realizan varias correcciones. Como se describe en la sección Características generales, se insertan habitaciones, seguidas de muchos mini-sets y reemplazos de fichas.

Creo que los mini-sets de alguna manera afectan las puertas, pero son bastante aburridos de leer sin herramientas, por lo que no profundicé en este tema.

Cuevas


Los niveles de las cuevas están llenos de vastos espacios abiertos y ríos de lava. Las paredes de esta área son rugosas y onduladas. Los únicos componentes rectangulares aquí son andamios de madera, que aparentemente aparecieron más tarde que las cuevas.

Esta etapa es una de las más bellas del juego gracias a la lava animada. Uno siente que es muy diferente de los niveles anteriores compuestos por habitaciones. Por lo tanto, me sorprendió mucho que la parte principal de la generación esté modelada de acuerdo con los principios de la etapa de la Catedral, y que las cartas tengan un aspecto más "cueva" con trucos difíciles.

imagen

Mazmorra en blanco


La creación de un nivel de cueva comienza con una habitación aleatoria de 2 × 2 ubicada en algún lugar cerca del centro del mapa. El generador luego llama al procedimiento DRLG_L3CreateBlock para cada borde de este bloque.

Al dibujar rectángulos a este nivel, no se usa el relleno normal. Los interiores son siempre sólidos, pero cada mosaico en el borde tiene un 50% de posibilidades de convertirse en un piso, de lo contrario, permanece sólido.

Procedimiento DRLG_L3CreateBlock


  • Esta función obtiene el borde del rectángulo, es decir punto de partida, dirección y longitud.
  • El tamaño del bloque recién creado se selecciona en el rango de 3-4 para cada lado.
  • El nuevo bloque se coloca aleatoriamente en relación con el borde de entrada.
  • Si no hay suficiente espacio para dibujar un bloque, se realiza la salida.
  • El bloque está dibujado.
  • Con una probabilidad de 1/4, se ejecuta la salida.
  • DRLG_L3CreateBlock se llama de forma DRLG_L3CreateBlock para tres aristas, además de la que proviene.

Aunque este procedimiento es similar a L5roomGen , usar un tamaño de bloque mucho más pequeño y dibujar bordes gruesos le da un aspecto mucho más orgánico. Además, no incluye un borde de 1 mosaico para paredes, por lo tanto, a diferencia de los generadores anteriores, puede crear bucles.

Después de crear un bosquejo aproximado de la forma de la mazmorra, el generador aplica los procedimientos de erosión:

  • Primero, encuentra áreas de fichas de 2 × 2 con fichas sólidas diagonalmente opuestas. A menudo es difícil trabajar con tales formaciones al realizar cuadrados de marcha, por lo que uno de los mosaicos sólidos se reemplaza aleatoriamente por género.
  • Todas las baldosas simples sólidas rodeadas por 8 baldosas se reemplazan con una baldosa.
  • Todas las secciones de pared largas y rectas se endurecen aleatoriamente al reemplazar el 50% de las paredes con baldosas.
  • Las diagonales de los mosaicos continuos se eliminan repetidamente.

Todos estos procedimientos agregan más baldosas, por lo que el mapa se vuelve más abierto.

Si tiene menos de 600 baldosas, el mapa se regenera.

Mazmorra


Los espacios en blanco de las mazmorras se convierten en fichas utilizando cuadrados de marcha. A diferencia de la Catedral y las Catacumbas, el juego de fichas es mucho más conveniente aquí, y contiene casi todas las combinaciones necesarias para los cuadrados de marcha. No hay fichas para paredes diagonalmente opuestas, pero se eliminaron en la fase de la pieza de trabajo, por lo que nunca aparecen.

Luego, como de costumbre, hay muchos mini-sets. El código tiene varios mini-sets que definen una sección separada de paredes y la reemplazan con estalagmitas y pisos, lo que aumenta la apertura de los espacios.

Se añaden lagos de lava. El algoritmo busca una sección de muro adyacente usando relleno . Si logra encontrar una sección de paredes / baldosas sólidas de menos de 40 baldosas completamente rodeadas por baldosas, entonces son reemplazadas por lava. Si no se puede encontrar el lago de lava, entonces la generación de la mazmorra comienza de nuevo.


Una pared de 3 × 3 se convierte en un lago de lava

Luego se agregan varios ríos de lava. El generador hace varios intentos de dibujar un río que comienza en el lago de lava y termina en la pared. Se imponen los siguientes requisitos al río: no debe cruzarse, el río tiene una longitud de 7 a 100 baldosas y debe haber un lugar adecuado para el puente. El mosaico del puente asegura que todo el mapa permanezca transitable. Si hay espacio en el mapa, se pueden agregar hasta cuatro ríos.

Luego se colocan habitaciones temáticas. En esta etapa, las paredes de las habitaciones temáticas son cercas de madera, a través de las cuales no puedes pasar, pero puedes mirar. La cerca de madera también se usa en los dos procedimientos siguientes. El primero pone una cerca en todas las secciones restantes de las paredes, que tienen secciones rectas bastante largas. El segundo dibuja una línea de cercas en el mapa, de una pared a la opuesta, y luego inserta la puerta. A diferencia del procedimiento para generar una catedral, no busca esquinas para comenzar a crear estas paredes.

El infierno


El infierno es la etapa final de Diablo. En él, el énfasis principal ya está en los monstruos, y el diseño de niveles queda en el camino. Esta etapa tiene el conjunto de fichas más pequeño de todos, y la mayor parte se utiliza para enormes escaleras y pentagramas. Los niveles infernales generalmente consisten en varias habitaciones cuadradas y tienen un diseño simétrico.

imagen

Mazmorra en blanco


La generación del infierno comienza con una habitación aleatoria de 5-6 fichas en cada lado (más si hay un fragmento listo para la búsqueda en ella), y luego se aplica la misma incursión recursiva que en la Catedral. Sin embargo, la generación está limitada a 20 × 20.

Se agrega un corredor vertical y horizontal, estirado hasta el borde del área 20 × 20.

Luego, el blanco del calabozo se refleja horizontal y verticalmente para obtener el tamaño completo.

Mazmorra


Los espacios en blanco de las mazmorras se convierten de nuevo en fichas utilizando cuadrados de marcha. Luego, de manera similar a la creación de la Catedral, se agregan paredes, como en Catacumbas y Cuevas.

Conclusión


Realmente disfruté leyendo este código. Aunque obviamente hay errores en él, los nombres se asignan al azar y algunas partes no se pueden recrear en código fuente de alta calidad, es claramente visible que este código pasó una prueba seria por batalla y está lleno de ideas inteligentes.

Estas son las lecciones más importantes para mí:

  • El diablo está en los detalles: los componentes individuales no son increíblemente complejos, pero cuando se combinan, dan algo maravilloso. Me imagino cómo los desarrolladores se esforzaron por mejorar la calidad hasta que los niveles pasaron de simplemente buenos a increíbles. La cantidad de mosaicos y la complejidad combinatoria de los mosaicos también es muy alta; es imposible implementar esto sin prestar atención a cómo están conectados los elementos.
  • Buscar y reemplazar la coincidencia de patrones es una herramienta muy poderosa con la que puede implementar muchos efectos diferentes. Soluciona errores de generación, agrega variabilidad, inserta contenido pre-creado, maneja la erosión y mucho más.
  • Dividir la generación de mazmorras en el mapa de transitabilidad (preparación de mazmorras) y la generación de fichas también es una técnica muy conveniente, tanto en términos de diseño como de depuración.
  • , . , .
  • , .

Source: https://habr.com/ru/post/460038/


All Articles