¡Hola de nuevo! Durante estas últimas semanas he estado lidiando con la preparación del Indie Dev Day de Barcelona y toda la promoción del juego (voy con un pequeño stand a exponer).
Pero he podido sacar tiempo para dar forma a uno de los sistemas que tenía pendientes por implementar, que aunque estaba planeado enel GDD, siempre a la hora de implementarlo en el juego puede dar problemas.
Como había comentado en el anterior diario de desarrollo, el objetivo era trabajar en mazmorras más pequeñas, entre 4 y 6 salas (contando entrada y salida), para que fueran relativamente cortas (unos 5-10 minutos) . La torre donde se desarrolla ‘The Shadowed Rune’ está formada por 7 pisos principales. Cada piso a su vez está dividido en varias secciones. Cada mazmorra aleatoria sería una de esas secciones. La última sección de cada nivel sería la lucha con un jefe final. Tras vencerlo ascenderás al siguiente piso de la torre. Todos los subniveles compartirían la misma ambientación.
¿El reto? Conseguir que estas ‘minimazmorras’ sean interesantes. Tal como reza la descripción del juego, la clave está en combinar niveles de acción, con niveles de puzle, que te obliguen a usar los elementos para resolverlos. La posición de las salas, por tanto debe ser aleatoria y ofrecer la suficiente variedad para sorprender al jugador.
Cada piso tiene una ambientación basada en un elemento, pero eso no limita que puedan aparecer otros, por supuesto, pero sí que influye en el tipo de puzles que aparecerán.
Otro de los motivos de dividir la estructura por salas es facilitar el juego cooperativo. Está claro que se podrían hacer salas totalmente inconexas y que pasaras de una a otra sin poder volver a la anterior. Pero creo que nos perderíamos uno de los puntos fuertes que va a tener ‘The Shadowed Rune’:
Cada sala (la llamo Cámara / Chamber dentro de la programación) la estoy diseñando por separado, para poder testearla y probarla con unas bases semialeatorias de conexión entre objetos - activadores - runas - enemigos. Otras serán puzles más cerrados, pero espero tener la suficiente variedad para que no se hagan repetitivas.
La base inicial es que la sala pueda ser superada con los propios elementos que te ofrece la sala. De esta forma nos aseguramos de que el jugador no se queda bloqueado porque le falte un elemento o una runa anterior. Pero… si tiene otras runas equipadas y tiene a su disposición otros elementos, podría conseguir acceder a zonas secretas, resolver los puzles más fácilmente y conseguir un mejor botín. (El juego está repleto de pequeñas salas y zonas ocultas con bodegas y botín, a las que se podrá acceder teniendo las runas adecuadas, pero sin que ello comprometa el progreso normal de la aventura.
Además esto permite que puedas superar el nivel entero y antes de cruzar la última puerta decidir dar una pequeña vuelta y explorar zonas que quizás con una runa obtenida en un último momento, te permita llegar a una zona oculta.
![](https://theshadowedrune.com/wp-content/uploads/2024/06/dungeon_layout.png)
Pasando a temas técnicos, puedo adelantar que cada piso de la torre se plantea como una rejilla de 4 x 4 (16 celdas) (Suficiente para conseguir distintos tipos de layout). Cuando sales del campamento, el personaje entra al primer nivel de la torre: “Los sotanos inundados”.
El juego en ese momento comienza la generación, eligiendo una de esas 16 casillas como objetivo y va desplazándose creando un camino según el algoritmo programado hasta que llega al límite fijado o bien se bloquea totalmente, al no tener más caminos, en ese caso, posiciona al personaje en la sala inicial y comienza la aventura.
Este sistema lo estoy haciendo desde cero, sin usar código de terceros, para asegurarme que lo estoy controlando en todo momento. El mayo reto en términos de diseño era crear un layout básico para las 16 posiciones de la torre y asegurarme de que siempre los caminos están conectados al crearse.
Estas fueron las primeras pruebas solo con el terreno y algunos objetos:
![Image from Gyazo](https://i.gyazo.com/4f3713081a0c3722f18c58ce6e17a093.gif)
Entrando en profundidad, para quien le pueda servir. Cada sala será diseñada en un pequeño nivel cerrado. Una vez testeada, se guarda en archivos para su posterior reutilización. De esta forma podemos tener cientos de salas sin necesidad de tener cargadas toda en memoria, ya que se cargan las que se van a usar, e incluso permite la combinación de “tiles” e “instances” en archivos separados, para aún conseguir más combinaciones.
![Image from Gyazo](https://i.gyazo.com/02bfa153cb4d16cc13049980035a7cfe.gif)
Una vez configurado todo inicialmente, diseñamos las salas con paredes y suelos básicos y se le incluyen las colisiones ajustadas al eje Z. Ahora el código ya sabe qué sala colocar en cada espacio. Sin embargo no sabe si a sus lados hay otras salas o no, quedando muchos caminos abiertos. Intenté solucionarlo creando pequeñas bodegas y caminos sin salida, pero no me terminó de convencer. Esas pequeñas bodegas podrían ser parte de las salas ya creadas, sin necesidad de crear tanto elemento adicional.
![](https://theshadowedrune.com/wp-content/uploads/2024/06/level-random-test-1.jpg)
Realmente la apariencia que se creaba era un poco “fea” ya que se crean restos que no podrían ser jugados, porque son inaccesibles, por lo que esta primera iteración fue descartada.
Una vez más, volvimos a la fase de diseño y cambiamos la forma de creación de las salas. En la primera versión se creaban todas las salas abiertas según su posición, si era una esquina, etc. pero siempre tenían el máximo de caminos abiertos. Esto creaba mucha basura alrededor en forma de tiles y objetos innacesibles.
Para la nueva versión, segmenté en tres fases la creación del layout:
1º Fase, se elige una zona de las 16 disponibles y se crea la sala de inicio.
2º Fase, se crea con un sistema de 4 direcciones, el layout de la mazmorra. En este punto las salas aún no se han creado, sino que se han señalado qué salas se han activado para la mazmorra.
3º Fase, como la mazmorra ya se ha creado completamente, ahora ya podemos comprobar de forma secuencial las relaciones entre salas. Cada sala comprueba las 4 direcciones (norte, sur, este y oeste) y elige su layout más adecuado, con las conexiones que necesita crear. De esta forma cada sala tiene ahora más consistencia y no tengo que buscar parches para cerrar caminos abiertos.
Este es el resultado tras las primeras pruebas:
![Image from Gyazo](https://i.gyazo.com/9d23897f782e3717b908bbad7e0cf91a.gif)
![Image from Gyazo](https://i.gyazo.com/803e59891892512663dfce65485bcba0.gif)
Como veis, ahora la mazmorra “ya parece mazmorra”, con todo conectado. Sin embargo, el sistema aún se tiene que pulir. He metido comprobaciones para asegurarme que cuando no se genera una mazmorra con un tamaño mínimo, resetee la generación. También debe crear siempre una puerta de entrada y otra de salida. Si no la crea, se resetea la generación de nuevo. Estos pasos el jugador no llega a verlos, ya que la generación ocurre en la transición entre niveles con un fundido en negro, por lo que estos pequeños retrasos son impercetibles. Más adelante seguiremos mejorando el sistema, pero por ahora es suficiente para seguir avanzando en otras áreas del juego.
Por otro lado, la parte más interesante de todo esto es la generación de contenido:
- Cada sala, una vez se ha elegido su disposición, puede rellenarse con lo que quiera, siempre que respete las entradas y salidas. Esto significa que puedo crear cientos de salas pequeñas con diferentes layouts, teniendo incluso separado el contenido de la decoración.
En estos momentos estoy contemplando variaciones de distintos layouts básicos:
- Sala grande, redondeada, estrecha, en rombo, partida en secciones, pasillos divididos, etc.
Y cada una además con distintas variaciones de contenido adaptado al layout:
- Enemigos, puzles, trampas, oleadas de enemigos, jefes, tesoros, tiendas, y combinación de los anteriores.
La diferencia entre una sala vacía y una ya preparada con contenido (así se ve mejor la escala).
![](https://theshadowedrune.com/wp-content/uploads/2024/06/empty.jpg)
![](https://theshadowedrune.com/wp-content/uploads/2024/06/content_room.jpg)
Con iluminación in game:
![](https://theshadowedrune.com/wp-content/uploads/2024/06/ingame.jpg)
¿Cómo superas cada nivel?
Llegando a la sala con la puerta cerrada. Cada nivel tendrá una puerta cerrada que se abrirá cumpliendo una condición de esa sala. El jugador deberá descubrirla:
- Resolver un puzle en la sala.
- Vencer a todos los enemigos de la sala.
- Vencer un minijefe.
- ????
Este devlog se me ha retrasado bastante ya que era una parte crucial del juego tener este sistema terminado. Para los siguientes haré actualizaciones más pequeñas y luego las recopilaré en sus respectivos devlogs. ¡Gracias por leer!
¡Nos vemos en el siguiente Devlog!