Procedural. Pro-ce-du-ral. Suena casi castizo. Una palabra eminentemente anglosajona nos resulta más cómoda de enunciar que procedimental. Ya no digamos «de generación automática o algorítmica», porque estaríamos enfocando solo hacia parte del concepto. Procedural, dicho a lo bruto, es cuando creas un algoritmo que genera contenido aleatorio en base a unas directrices.
Por ejemplo: «voy a generar palabras que sólo contengan la letra ‘a’»: aa/a/aaa/aa/aaaaaaaa/aaaaaa/; etcétera. En castellano usamos generación por procedimientos por pura proximidad, porque alude al método de creación con algoritmos, pero antes convendría explicar a qué tipo de algoritmos.
Un acercamiento teórico
Antes de seguir avanzando vamos a intentar quedarnos con un par conceptos. Primero: algoritmo recurrente. Este tipo de algoritmo expresa la solución de un problema haciendo una llamada recursiva. Esto es: que hace llamadas a sí mismo, cambiando el valor de un parámetro en la llamada a la propia función. En la programación funcional u OOP cada frase dentro de ese lenguaje tiene una razón de ser, existe una acción para cada objeto, atendiendo a su propia lógica. La procedural es un idioma sin palabras, sólo caracteres. Sin léxico, pero con gramática.
Helechos, copos de nieve, relámpagos, cataratas: todos tienen en común su genealogía fractal
Observemos la naturaleza. Helechos, copos de nieve, relámpagos, cataratas. Todos comparten genealogía en el plano y el espacio. Son objetos de geometría diversa cuya estructura se repite: fractales. El ejemplo del romanescu es clásico por una razón sencilla: se puede observar su repetición regular a simple vista. Es, además, autosimilar [fractalizada] porque su forma nace a partir de repeticiones análogas a la misma figura. Diríase que cada forma hace una llamada a la anterior y, con la respuesta que recibe, sirve de base a la posterior.
Pero el mejor ejemplo, el más presente y que sigue simples fórmulas recursivas, es el árbol. Imaginemos que vamos a programar el diseño de un árbol. Definimos dos cosas: tallo y rama. Y creamos una instrucción que diga: «cuando llegues a tallo, saca dos ramas». Al programar y ejecutar nuestra orden, ¿qué ocurre? Primera iteración: tenemos dos ramas. Segunda iteración: de cada extremo de esas dos ramas salen otras dos. Y así sucesivamente. No escribimos órdenes para cada iteración, simplemente una orden recursiva.
La generación procedural usa algoritmos basados en nodos, conexiones que comunican niveles de profundidad
Imagina que estás un edificio pero se numera del tejado al suelo. El nivel son las plantas: si tienes siete plantas, de la 1 a la 7 y quieres ir a la 5, significa que has de pasar por las 7, 6 y 5. El nivel de profundidad es 3. ¿Por qué? Porque has pasado por tres plantas hasta llegar a donde querías. En este caso coincide porque hemos utilizado una numeración sucesiva.
Ahora imagina que el edificio tiene numeración impar, como el lado izquierdo de las calles españolas. Con cinco plantas, del tejado al suelo, la numeración sería 9-7-5-3-1. Aunque nos saltamos todos los pares por la tipología de la numeración, no hacemos así con el número de profundidad. Porque siempre contamos uno a uno los niveles que atravesamos para llegar hasta donde queremos. Todo esto se denominan nodos. La generación procedural usa algoritmos basados en nodos, conexiones que comunican niveles de profundidad.
Procedural no es lo mismo que aleatorio
No, no sólo no es lo mismo sino que es algo bastante distinto. Convendría decir que la aleatoriedad no existe en los videojuegos. Siempre hay reglas básicas. Lo que entendemos por aleatoriedad en forma, no en fondo. Este magnífico artículo explica de manera cristalina cómo aplica la aleatoriedad en la generación de distintas mazmorras en forma y tamaño, pero conectadas mediante una serie de valores que acotan la libertad total, pudiendo desencadenar el caos, la injugabilidad.
Vayamos a uno de los ejemplos más populares en la actualidad. No Man’s Sky (Hello Games, 2016) es un alegato a la programación procedural. Desde su banda sonora, pura música generativa obra de Paul Wolinski, líder de 65daysofstatic, hasta sus límites jugables. En No Man’s Sky hubiesen podido hacer las cosas de otra manera. Crear cinco planetas, al primero llamarlo Raticulín, con la siguiente descripción: «es rojo y tiene veinte pinos y un río, está en las coordenadas cartesianas X 450 e Y 200. Hay un señor triste que baila al verte». Y así con los otros cuatro y mezclarlos para que del sexto en adelante sean variables de estos cinco.
Pero, en cambio, han creado funciones de programación donde dicen órdenes tales que: «el nombre tiene seis caracteres aleatorios, el color va entre el hexadecimal 7111 y 8222, el número de árboles siempre es >15 y <30 y la posición de X siempre es 1/2 de la Y». Y no sólo eso: han tenido en cuenta si un planeta está lo suficientemente lejos de su estrella sol como para soportar vida. Han recolectado reglas científicas sobre cómo se formaría un ecosistema en determinadas condiciones climáticas, cómo evolucionaría su flora y su fauna. Lleva el concepto de Spore (Maxis, 2008) hasta un paroxismo de biodiversidad digital sin precedentes.
El diablo está en las acotaciones
La virtud de la programación procedural no está en la libertad que nos concede, sino en cómo nos la concede. Se produce una interesante paradoja: cuanto más complejo es el algoritmo de generación, más fácil es que escapen cosas al control del programador. Es como este artículo: si contiene demasiadas oraciones subordinadas y yo no doy la talla como redactor, en algún momento se escapará de mi control y nadie querrá seguir leyendo. Si damos demasiada libertad al algoritmo podemos encontrarnos con una ruptura, una superposición, o dos valores tan alejados uno del otro que no puedan materializarse.
De ahí su atractivo, su capacidad de sugerir. Pero exige una serie de límites y para ello se crean algoritmos de ramificación y poda para, de la pila de posibles soluciones, se destaquen las óptimas sobre las factibles y se anulen aquellas que directamente salen de los parámetros de acotación. Esto es algo muy habitual en los roguelike o cualquier juego que implique mazmorras aleatorias: ayudarse mediante enemigos patrullando, asignando comportamientos de pathfinding, mapeando los laberintos para descubrir y controlar todos los accesos, entradas, salidas, pasillos, enemigos, etcétera.
El equipo de desarrollo de The Talos Principle (Croteam, 2014) creó bots de comportamiento inteligente para adaptarse al entorno y testear así las capacidades resolutivas de sus niveles. Estos bots hicieron un trabajo equivalente a quince mil horas de testeo de juego. El californiano Edmund McMillen, destacado diseñador de videojuegos y pionero en pequeñas obras en flash, expone así la clave de su éxito a propósito de The Binding of Isaac:
También hay vías intermedias, lo que podríamos definir como semiprocedural. Un reciente ejemplo sería The Division (Ubisoft Massive, 2016). En el videojuego de Massive Entertainment sólo son procedurales los interiores, la disposición de los muebles, mientras que el edificio tiene unas reglas fijas. Esto ahorra bastante diseño. En los First Person Walkers también se utiliza de manera selectiva y, en casos como This War of Mine (11 bit studios, 2014), se da cierta retórica narrativa al evolucionar la historia mediante una serie de eventos aleatorios y no mediante un guión fijo y escriptado.
La generación procedural, como hemos visto, no es infinita, pero sí lo suficientemente amplia como para que esos árboles no nos dejen ver la finitud del bosque. Todo depende del nivel de profundidad en el que nos hayamos sumergido.
40 años programando una forma de pensar
La principal ventaja de este método algorítmico radica en la no necesidad de almacenar grandes cantidades de memoria en disco duro. Su implementación ahorra plazos de desarrollo y plantilla —diseñadores de niveles, departamento de arte— y permite agilizar los tiempos de lectura. El problema se sitúa, como decíamos, en la carga de procesamiento de datos, exigiendo mayor velocidad a los procesadores, y motores gráficos más eficientes que no produzcan cuellos de botella al generar con la misma calidad todos los objetos y efectos.
Si bien en algunos videojuegos son aspectos marginales, en shooters es habitual aplicarlo a mapeado de texturas; en algunos MMO se utilizan assets de librerías y se recombinan para decorar de manera distinta cada poblado; Gran Turismo 5 (Polyphony Digital, 2010) lo implementó en un generador de circuitos aleatorio; los orcos de La Tierra Media: Sombras de Mordor (Monolith Productions, 2014) cambiaban constantemente de tipología desde un amplio espectro de opciones; Red Dead Redemption (Rockstar San Diego, 2010) mostraba una batería de misiones aleatorias cada vez que viajábamos de un punto a otro. Incluso Tetris (Alekséi Pázhitnov, 1984) escupe sus piezas de manera procedural.
Por un puñado de procedimientos
Vayamos a los inicios. En los albores de la década de los ochenta se dan dos títulos capitales: Rogue (Michael Toy y Glenn Wichman, 1980) y Elite (David Braven e Ian Bell, 1984). Rogue, como insinúa el nombre, dio origen al género roguelike, aunque en ningún caso es el primero, dándose DND en 1974 y Dungeon un año después, ambos ambientados en el universo Dungeon And Dragons; incluso Beneth Apple Manor, en 1978, como precedente directo del uso procedural. Todos ellos comparten características: mazmorreo, interfaz visual en ASCII, niveles aleatorios y la muerte permanente del protagonista, enviándote directamente a la pantalla de título.
2048 mundos persistentes en apenas ocho bits de memoria
Elite marcó un hito histórico. Programado bajo un ordenador obsoleto, el Acorn Electron —una versión económica del sistema BBC Micro—, Elite debía ser económico en términos informáticos. Y vaya si lo lograron: 8 galaxias, 256 planetas en cada una. El generador de planetas pseudoaleatorio componía la información de cada planeta, incluyendo descripción e índices asociados a su posición en la galaxia, tipos de minerales y precios de las mercancías, sin necesidad de almacenarlos en la memoria del ordenador, sino mediante semillas. Un sistema de valores fijos al comienzo de cada partida, tal y como haría Akalabeth: World of Doom (Richard Garriott, 1979), piedra angular sobre la que se construiría la saga Ultima.
Elite, piedra angular del revival que estamos viviendo en la actualidad, fue un fiasco en ventas
Del primero siguieron la senda Telengard (1982), Moria (1983) o Hack (1985). El segundo fue un fiasco en ventas pero objeto de culto entre los círculos académicos y piedra angular del revival que estamos viviendo en la actualidad. Por aquel entonces también destacó Rescue on Fractalus! (LucasFilms Games, 1984) el cual, si bien no era procedural, sí utilizaba tecnología fractal para recrear la orografía del planeta extraterrestre en el que estaba inspirado el juego. The Sentinel en 1986 hacía algo bastante parecido y, en 1991, el demencial ToeJam & Earl utilizaba la aleatoriedad para la generación de ítems y niveles.
Procedurizadme todo eso, por favor
1996 fue el año del siguiente paso, con Diablo (Blizzard North) y Daggerfall (Bethesda). Daggerfall, segunda entrega de la saga The Elder Scrolls, logró un mapeado de 229,848 km² pletórico de mazmorras, NPC’s, misiones y objetos generados de manera procedural, en tiempo real y 3D. En Diablo apenas se generaban algunos contenidos algorítmicamente, sobre la marcha, en lugar de ser ítems prefijados de antemano.
Una década después Tarn Adams creó un capricho procedural sin precedentes. Dwarf Fortress, que debe su nombre a su propia modalidad de juego, demandaba una serie de requisitos para ser jugado: el mundo es generando descargando un freeware de Internet. Este mundo es único: altura, condiciones climáticas, temperatura ambiental, pueblos y NPC’s. Conflictos bélicos, flora y fauna son generados exclusivamente al comienzo de cada partida. También en 2006 aparece RoboBlitz, de Naked Sky Entertainment, el cual aplica texturas generadas procedimentalmente.
En 2008 el uso de técnicas procedurales es ya un movimiento en auge. Valve lanza Left 4 Dead. La Inteligencia Artificial puede dictaminar el curso de las partidas analizando cada parámetro de nuestro juego: si nos está resultando demasiado fácil, los enemigos aparecerán con más vida y resistencia, mientras que nosotros encontraremos menos munición y salidas para escapar. Esto mantiene nuestra atención y guardia en alto en todo momento. Derek Yu publica completamente gratis Spelunky y Will Wright, maestro creador de SimCity, hace lo propio con Spore, un videojuego en el que se creaban microorganismos y generaban galaxias enteras donde crecer y evolucionar como ecosistema. La banda sonora, parte de Brian Eno en colaboración con Peter Chilvers, también utilizaba música procedural.
Minecraft tampoco es infinito: 4.080.576.000 Km² relativamente estables
Por entonces, los endless runners —un único nivel, infinito, de contenido generado en tiempo real— empezaron a destacar entre el juego flash. Y antes de entrar en la nueva década Borderlands (Gearsoft Software, 2009) presumía de más de tres millones de armas gracias a un sistema que utilizaba la inteligencia artificial del juego para combinar los materiales y generar aleatoriamente tipos de armas.
Y Minecraft (Mojang, 2009), claro, el sempiterno Minecraft, donde igual el youtuber KurtJMac va en busca de su confín, a pie, retransmitiendo por temporadas o dos empleados del Ministerio de Medio Ambiente de Dinamarca, Simon Kokkendorf y Thorbjørn Nielsen, deciden recrear a escala 1:1. Minecraft tampoco es infinito, vaya, son 4.080.576.000 Km² relativamente estables —aunque las matemáticas nos dirían que el mapa podría llegar hasta los 4.722.366.482.869.645 Km², el límite teórico de la arquitectura de 32 bits—, pero para cualquier jugador es más que suficiente en la vida que nos queda por vivir.
Con el nacimiento de una nueva década, el retorno a una vieja moda reformulada. Star Citizen (Cloud Imperium Games, 2016), No Man’s Sky (Hello Games, 2016) con sus 18 trillones de planetas, EVE Valkyrie (CCP Games, 2016), con su firme ecosistema, o Elite: Dangerous (Frontier Developments, 2014), puesta a punto del clásico fundacional, siendo este último el único publicado más allá de la beta, proponen el retorno en la conquista espacial, la vuelta a la Realidad Virtual y la fe en la infinitud procedural. El futuro es ahora.
¿Por qué ahora?
Como decíamos sobre el algoritmo recursivo, la generación procedural está basada en funciones iterativas; esto es: que repiten un proceso tantas veces como sean necesarias con objeto de alcanzar la meta que marca la programación. En la actualidad, con el poder de la nube —como lo propuesto para el nuevo Crackdown (Reagent Games, 2016), en el que no habrá dos derrumbamientos de un edificio iguales— o las actuales plataformas de octava generación, más potentes y eficaces en la gestión de sus recursos, ponen en alza este tipo de programación.
También es el momento de la computación en la nube gracias a la ampliación en redes de fibra y la consiguiente mejora en la velocidad de transmisión de datos. De esta manera se aligera la carga de trabajo de las máquinas que ejecutan el software, dosificando recursos a través de servidores conectados a Internet. En un videojuego, por ejemplo, estos servidores pueden encargarse de algunos elementos como la carga de texturas o generación de entornos —incluso algunas físicas del juego, partículas, iluminación, etcétera—. Los datos se cotejan en tiempo real, mandándose a la caché temporal de la consola, y formando la imagen final que vemos en pantalla.
Desde luego, la generación procedural es quizá la tendencia más importante a considerar en la actual programación de videojuegos. A colación de su economía de recursos, Oliver Franklin-Wallis señalaba en su artículo Games of the future will be developed by algorithms, not humans cómo los triple A, los juegos de presupuesto millonario, implican un coste insostenible a medio plazo y, por tanto, el futuro lógico pasa por apostar en mundos diseñados por algoritmos, no por programación y diseño tradicional.
Algoritmos para todos
La programación procedural, como paradigma, como concepto, puede extrapolarse a cualquier campo. La música quizá sea la segunda disciplina artística donde más se ha utilizado. Música compuesta mediante algoritmos capaz de generar material estructuralmente coherente: música generativa. Esta música nace en parte de la teoría de la gramática generativa propuesta en 1965 por Noam Chomsky. En el marco teórico, ésta estudia la sintaxis de las lenguas y describe su estructura gramatical mediante una construcción jerárquica.
Brian Eno experimentó durante los ‘90 con el software SSEYO Koan y creó un camino intermedio entre la música en vivo y la pregrabada. Cada pieza sonaba diferente en cada reproducción, mediante procesos que diseñaban armonías y otros constructos sonoros a partir de una serie de acotaciones programadas en el algoritmo. Como ejemplo tenemos a los arpegiadores. La mayoría se estructuran en escalas cromáticas pero es fácil alterar alguno de los componentes de su cadena para dejar un espacio a notas aleatorias, muy útil en composición creativa.
David Cope modelizó el estilo compositivo de Bach y lo implementó en un algoritmo para crear piezas como esta; y el multidisciplinar Raúl Ibarra programó su sistema/teorema Noise Boox, un software donde se tomaba en cuenta el estado de una partida para generar música en consecuencia, creándose melodías en tiempo real a tenor de la cantidad y cercanía de los enemigos u otros elementos a tener en cuenta.
En el visual art es fácil encontrar videoclips generados a partir de fractales. La mayoría de reproductores de audio incluyen visualizadores interactivos, como iTunes o Winamp. Incluso algunos como Magnetosfere no solo tienen en cuenta los valores acústicos del rango dinámico de la música, sino que utilizan fórmulas físicas como la gravedad o el magnetismo para generar imágenes en tiempo real. Otro ejemplo de programación aleatoria se da con la iluminación de muchos conciertos.
Hace algunos meses surgió en Twitter una propuesta, el Dada-Data, instando a los twitteros crear poemas aleatorios a partir de sus tweets. Generar poesía como la escritura automática, nacida de la accidentalidad. Incluso Poetweet, una aplicación que encuentra rima entre lo absurdo, corrió como la pólvora. ¿Cabe la programación algorítmica en 140 caracteres? No pocos creativos entienden esta postura como parte de los procesos del flujo creativo, algo natural. Como suele decirse, no existe orden en la creación, sino un caos sutilmente ordenado.
Entonces, ¿se dice procedural o procedimental?
La nomenclatura, desde luego, es difusa. Como señala Javier Carpio, desarrollador de videojuegos para Gazpacho Games: «generación procedural no refiere únicamente a una generación de contenido de manera pseudoaleatoria, sino más bien a todo aquello que haga uso de un proceso de generación automatizada. Pongamos de ejemplo la generación de un mapa para un juego. Podríamos tirar por la vía fácil: tomar el mapa como si fuera un conjunto de casillas, diseñar un puñado zonas prefabricadas y, a golpe de número aleatorio, ir asignando a cada casilla una zona de las que hemos diseñado».
Y continúa: «pero también podríamos complicar el asunto: sumar al número aleatorio con el que decidimos las zonas del mapa un ruido Perlin, para dar prioridad a cierto tipo de zonas —algo habitual en generación de terrenos—; montar un sistema de redes bayesianas con las que dar más probabilidad a que una zona determinada ocurra cuando otra ya ha ocurrido; o hacer uso de algoritmos evolutivos para que el mapa vaya adquiriendo complejidad y se acerque a unas condiciones predeterminadas».
No existe término que no genere debate sobre su validez una vez acuñado
Sirvan ejemplos como el rogue-like-like o rogue-lite, donde una simple terminación basta para erradicar o sumar una característica que lo acerca a conveniencia al juego raíz o grupo temático. Una cosa sí tenemos clara: la revolución procedural ha llegado. Y, como todo lo bueno, es para quedarse.
Ver 16 comentarios