Tenebrarium… cómo un mazmorreo procedural terminó siendo un mundo entero!

El pasado sábado 12 de septiembre, durante la jornada presencial del Chile Game Showcase 2026 en el Hub Providencia, estuve presentando ZOMBI ROCKSTAR. Ahí tuve la oportunidad de compartir mesa con un desarrollador muy interesante: Renato Campos, de Halley & Nato.

Renato trabaja en programación desde cero, utilizando C++ y raylib. Su proyecto, Tenebrarium, es un RPG/roguelike por turnos con generación procedural. Lo que más me impactó al probarlo fue la elegancia de su propuesta: todo está construido mediante caracteres ASCII y un cuidadísimo estilo retro de terminal. Es un juego con un potencial enorme, liviano, accesible para cualquier computador y que respeta al máximo las raíces del género.

Les comparto a continuación un artículo escrito por el propio Renato donde profundiza en la arquitectura técnica, las mecánicas y el proceso detrás de Tenebrarium. ¡Apoyen este e interesantes proyectos de la escena indie local!

Tenebrarium… cómo un mazmorreo procedural terminó siendo un mundo entero!

Del glyph suelto en una terminal a un roguelike con incursiones, gremios y showcase.

“La luz muere aquí, Los héroes también”

Todo partió como suele partir este tipo de proyectos: un puñado de caracteres ASCII moviéndose sobre una grilla, sin más ambición que comprobar si la idea funcionaba. Tenebrarium nació en C++ con Raylib como motor gráfico, pensado desde el día uno como un roguelike de mazmorra procedural, no como un mapa fijo dibujado a mano. Esa decisión temprana —generar el mundo en vez de construirlo pieza por pieza— terminó siendo la columna vertebral de todo lo que vino después: cada partida es distinta, cada piso se arma de cero, y el desafío técnico real nunca estuvo en el arte, sino en lograr que ese caos procedural se sintiera jugable, justo y coherente.

En su forma actual, Tenebrarium es un roguelike por turnos donde el jugador desciende 20 pisos de mazmorras generadas proceduralmente, eligiendo entre 5 clases —Warrior, Mage, Ranger y dos clases secretas por descubrir— para enfrentar criaturas que envenenan, drenan vida o se dividen al morir. Cada piso escala la dificultad, cada decisión puede ser la última, y la muerte es permanente: no hay vuelta atrás una vez que el personaje cae.

Trabajar en esto no fue en solitario. Halleykite, mi mejor amiga, se encargó del arte del estudio y de darle identidad visual al proyecto, mientras yo me metí de lleno en el código: la generación de mapas, la IA de los enemigos, el sistema de combate y todo lo que corre por debajo del glyph que ve el jugador. Con el tiempo, por motivos personales, Halley fue quedando al margen del proyecto: ya no le alcanzaba el tiempo para lo que Tenebrarium necesitaba en esta etapa. Aun así, sin su aporte inicial el juego simplemente no habría llegado a ser lo que es hoy.

De la grilla vacía a la mazmorra que se arma sola.

El corazón técnico de Tenebrarium es BSPDungeon.cpp, el generador procedural de mapas. La lógica usa BSP (Binary Space Partitioning): se toma un espacio de 80×40 y se subdivide recursivamente hasta una profundidad máxima de 5, tallando habitaciones dentro de cada subdivisión con un padding de 2 tiles para que nunca queden pegadas a los bordes. Entre los nodos hermanos del árbol se trazan corredores en L, que luego se adelgazan de 2 tiles a 1 para que el recorrido se sienta como un pasillo real y no como una avenida.

Sobre ese esqueleto de mapa entra en juego DungeonPopulator.cpp, que decide qué vive en cada piso: entre 1 y 3 enemigos por habitación con pesos ponderados según la profundidad del piso, entre 2 y 3 cofres (55% con monedas, 45% con un objeto, y un 12% de probabilidad de que en realidad sea un Mimic esperando), entre 1 y 2 habitaciones secretas selladas con muros ocultos (SecretWall), escaleras de subida y bajada, una puerta cerrada que se abre solo al limpiar el piso por completo, antorchas decorativas en el 70% de las habitaciones para ambientar, y jefes fijos en los pisos 5, 10, 15 y 20, con estadísticas multiplicadas por 2.5 y una recompensa de experiencia cinco veces mayor a la normal.

El flujo completo es simple de describir aunque no de calibrar: Dungeon::generate(piso, clase, incursión) llama al BSP para generar el mapa, luego al populator para llenarlo de contenido, y el resultado queda guardado en los miembros de la clase Dungeon. La estructura de datos base es un Tile (Suelo, Muro, Muro Secreto, Escaleras) con glyphs Unicode y colores propios, todo almacenado en un grid plano de 80×40 dentro de Map.hpp. La visibilidad se resuelve con field-of-view por raycasting Bresenham a un radio de 8 tiles, así que lo que el jugador ve realmente depende de líneas de visión calculadas, no de un simple círculo.

El punto de inflexión: que el juego no se sienta estático.

Al igual que en cualquier roguelike, el desafío no era solo generar contenido sino hacer que la dificultad respirara con el jugador. La fórmula de escalado combina el piso y la incursión actual: factor = (1 + (piso-1)*0.09) * (1 + (incursión-1)*0.10). En la práctica, esto significa que llegar al piso 20 de una incursión ya multiplica la dificultad base por 2.71 — un crecimiento que se siente gradual partida a partida, pero que a nivel sistémico es exponencial.

La IA de los enemigos corre en un hilo separado (aiThread_), moviéndose cada 600 milisegundos y protegida por un mutex para evitar condiciones de carrera con el hilo principal de renderizado. El combate no es uno-contra-uno por defecto: los enemigos que están a distancia Manhattan 2 entre sí se agrupan en combate, hasta un máximo de 5, lo que obliga al jugador a pensar en formaciones y no solo en golpear al primero que aparece. Como respiro estratégico, existe el objeto “Pala”, que permite saltarse un piso completo a cambio de un costo creciente cada vez que se usa — una válvula de escape para incursiones que se están complicando demasiado.

No todo el mundo es procedural, eso sí. La Aldea, el hub central entre incursiones, es un mapa hecho completamente a mano en un fichero REXPaint .xp, sin niebla de guerra, porque ahí el objetivo no es la sorpresa sino que el jugador respire, compre, mejore equipo y decida cuándo volver a bajar. El guardado funciona por serialización completa en texto plano (saves/save.dat), con auto-guardado cada vez que se cambia de piso, así que nunca se pierde el progreso de una incursión a medio camino.

Estética: el ASCII como decisión, no como límite.

Tenebrarium se presenta con un estilo terminal reforzado por un shader CRT, apoyado en más de 100 fuentes bitmap distintas para dar variedad visual sin salir nunca del lenguaje de glyphs. Esa decisión estética tiene dos referencias directas. La primera es Rogue, el juego original de 1980 que le dio nombre al género entero: de ahí viene la raíz misma de Tenebrarium —mazmorras generadas proceduralmente, representadas con caracteres ASCII, y muerte permanente como regla no negociable—. La segunda es Cogmind, el roguelike de ciencia ficción de Grid Sage Games. De ahí tomamos la idea de que el ASCII no es una limitación técnica sino una elección deliberada de estilo, y que los glyphs pueden ser tan expresivos como cualquier sprite. El shader CRT de Tenebrarium es, en el fondo, un homenaje a esa vibra retro que Cogmind lleva al extremo, construida sobre la base que Rogue sentó cuatro décadas antes.

También heredamos algo más profundo que lo visual: en Cogmind el jugador se construye a través de un sistema de partes que puede perder en cualquier momento. En Tenebrarium esa idea se traduce en las clases y habilidades —incluyendo las dos secretas— que el jugador va moldeando durante la partida, y que se pierden por completo con la muerte permanente. Ambos juegos comparten la misma apuesta de diseño: que explorar recompensa más que grindear, y que cada decisión pesa de verdad en un mundo procedural y letal.

Para que la vuelta a la Aldea no sea solo un respiro visual, el juego incorpora tiendas y quests, además de un bestiario desbloqueable que registra cada criatura enfrentada —con sus efectos de estado particulares— a medida que el jugador avanza por las incursiones.

De la mazmorra al estudio: identidad y comunidad.

Tenebrarium se publica en halleynato.itch.io, y detrás del juego hay un pequeño estudio con nombre propio: Halley&Nato Games, con cuenta de Instagram como @halleyyynato_oficial. El logo provisorio es un glyph “@” rojo sobre un fondo oscuro de terminal, con una espada minimalista superpuesta — una imagen pensada para reforzar justo esa estética entre lo retro-terminal y lo fantástico que define al juego.

El pipeline de releases corre con CI/CD por GitHub Actions y Butler para subir builds directo a itch.io. En el camino incluso tuvimos que resolver un conflicto de nombre con otro desarrollador de itch.io que ya tenía publicado un juego llamado Tenebrarium — un problema más de “estudio indie” que de código, pero que también forma parte de la historia del proyecto.

El juego corre en PC, con compatibilidad tanto para Windows como para Linux, y quien quiera seguir el desarrollo o contactarnos puede hacerlo por Instagram o directamente al correo nato.halleygames@gmail.com.

La versión v0.4.2 sumó combate grupal, iluminación dinámica de antorchas y ajustes de balance, construyendo sobre lo aprendido en las versiones v0.2 a v0.4, que incluyeron desde ajustes de CSS en la página de itch.io hasta devlogs documentando el avance del proyecto.

Conclusión: de la terminal al escenario.

Lo que empezó como un ejercicio de generación procedural en C++ terminó convirtiéndose en un sistema completo con progresión por incursiones, un hub navegable, combate táctico y una identidad de estudio propia. Tenebrarium fue seleccionado para el Chile Game Showcase 2026, con una transmisión online el sábado 5 de septiembre y una instancia presencial el sábado 12 de septiembre en el Hub Providencia — la prueba de que ese glyph rojo que empezó moviéndose sobre una grilla vacía ya tiene un lugar en la escena de desarrollo local.

No comments

Agregar un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos están marcados *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.