Para responder brevemente a su pregunta principal primero, las principales ventajas de un mundo de juego generado por procedimientos son:
El mundo puede ser enorme , mucho más grande que cualquier mundo de juego diseñado manualmente.
El mundo (o al menos partes de él) se puede regenerar para cada juego, aumentando potencialmente el valor de repetición, ya que el jugador siempre tendrá algo nuevo que descubrir.
Por el contrario, las principales desventajas de la generación de procedimientos son que:
Dependiendo de los métodos de generación utilizados, puede ser difícil asegurarse de que el mundo siempre se puede jugar, es decir, que el jugador no puede quedarse atascado sin ninguna forma de proceder solo porque tienen mala suerte con la generación mundial.
Incluso si puedes evitar generar mundos completamente imposibles de jugar, la generación de mundos aleatorios puede conducir a un nivel de dificultad muy variable: a veces, el jugador puede encontrar todo lo que necesita convenientemente alineado para la toma, a veces pueden pasar mucho tiempo sin encontrar nada útil .
Durante largos períodos, tales fluctuaciones aleatorias tienden a promediar, pero si la dificultad del juego es, por ejemplo, muy pesada (típica para los juegos de supervivencia), un mal comienzo podría arruinar un juego, mientras que un comienzo muy afortunado podría privarlo de todo desafío.
La generación procesal mal hecha puede hacer que el mundo se sienta monótono y aburrido: después de haber visto una docena de laberintos generados aleatoriamente, todos comienzan a verse iguales, incluso si difieren en detalles.
Además, si el mundo del juego se regenera por completo para cada juego, no habrá ubicaciones o características fijas que el jugador pueda reconocer de los juegos anteriores. Tal falta de familiaridad podría hacer que sea más difícil para el jugador participar en el juego a nivel emocional o compartir experiencias con otros jugadores.
También hay una cosa que podría contar en cualquiera de las listas: en un juego donde el mundo se regenera aleatoriamente para cada juego, no puede haber una guía de "recorrido", ya que cada juego será diferente.
(Esta irrepetibilidad también podría ser un problema para las pruebas y la depuración, aunque se puede evitar al menos parcialmente al permitir que se especifique la semilla RNG, al menos en modo de depuración, y / o al proporcionar el comando "trampa" que se puede utilizar para juego de avance rápido a diferentes etapas).
Sin embargo, si observa la lista de desventajas, verá que describe principalmente las desventajas de la generación pura de procedimientos; muchos de ellos pueden evitarse mezclando contenido generado manualmente y procesalmente .
Por ejemplo, el jugador siempre puede comenzar en una ciudad fija, diseñada manualmente, tal vez rodeada por una región de origen más amplia o más fija, pero se pueden generar al azar lugares más alejados de la ciudad para proporcionar siempre regiones desconocidas para que el jugador explore.
También podría haber otras ciudades diseñadas manualmente u otras ubicaciones ubicadas (más o menos) al azar en el mundo, de modo que el jugador tendrá que encontrarlas, pero sabrá qué esperar una vez que lleguen allí. Por el contrario, las características prominentes, como las montañas, podrían colocarse manualmente (al menos en las proximidades de la ubicación de inicio fija), pero los detalles de su terreno podrían asignarse al azar.
En cuanto a la ubicación aleatoria que causa puntos muertos y variaciones de dificultad, eso puede abordarse mediante la implementación de varias comprobaciones de coherencia y equilibrio en la parte superior de su algoritmo de generación mundial de procedimientos. Por ejemplo, si el jugador necesita un elemento en particular para poder cruzar el agua, puede incluir un código que asegure que se coloque al menos uno de esos elementos para que el jugador pueda alcanzarlo sin cruzar el agua.
Del mismo modo, es posible que también desee ajustar sus reglas de colocación de objetos para que no se coloquen varitas de asombro de equilibrio antes de que el jugador haya alcanzado el nivel x , y tal vez para asegurarse de que al menos uno se coloque en una ubicación fija donde el jugador pueda alcanzar antes de llegar al escenario donde lo van a necesitar para sobrevivir.
Por cierto, una forma común de hacer que el contenido generado por procedimientos y manualmente se mezcle de manera más o menos fluida es comenzar el proceso de generación manual utilizando el generador de mundo de procedimientos (quizás ajustado adecuadamente, por ejemplo, para generar una aldea o un pico de montaña donde lo desee) ) para inicializar la región que está diseñando y luego ajustarla manualmente para agregar y ajustar los detalles que desee. (Esto también puede permitir un almacenamiento de nivel muy compacto, al guardar solo los cambios manuales y la semilla del generador y los parámetros utilizados).
Otras formas de combinar contenido manual y de procedimiento incluyen dejar espacios en blanco en sus niveles diseñados manualmente, para que se completen con contenido aleatorio (por ejemplo, un castillo podría incluir un laberinto generado aleatoriamente en las mazmorras, con solo el contorno y las salidas fijas), o el diseño manual podría especificar solo el esquema general de algunas partes del nivel (por ejemplo, la ubicación de casas en una ciudad) y dejar que los detalles (como la apariencia exacta de cada casa) se elijan al azar.
De hecho, incluso muchos juegos que tienen un mundo de juegos completamente fijo usan alguna forma de generación de procedimientos como parte de su proceso de diseño de niveles, ya que hay algunos aspectos de la generación mundial (como producir un terreno de aspecto natural o colocar árboles individuales en un bosque) que son difíciles y / o tediosos de hacer a mano, pero relativamente fáciles de automatizar.
Por el contrario, la mayoría de los generadores de mundo de procedimientos utilizarán al menos algunos objetos y elementos diseñados manualmente para construir el mundo. Incluso se podría tener fácilmente múltiples niveles de generación aleatoria / manual anidada: por ejemplo, un mundo generado por procedimientos podría incluir una ciudad generada manualmente rodeada de bosques generados por procedimientos con un contorno dibujado manualmente, con árboles generados por procedimientos con hojas diseñadas manualmente.
También tenga en cuenta que la generación de contenido procesal no es necesariamente incompatible con un mundo fijo: simplemente puede elegir una semilla RNG fija y usarla para generar su mundo. Esto puede ser útil si quieres un mundo enorme para que los jugadores exploren, pero quieres mantenerlo igual para cada juego y cada jugador.
Tenga en cuenta que, si hace esto (o posiblemente incluso si no lo hace), realmente debería diseñar su generador de mundo para que funcione de manera jerárquica, utilizando múltiples instancias de RNG, de modo que, por ejemplo, el generador de mapas general mantenga una sola instancia de RNG que usaría para generar subregiones, asignando a cada subregión un valor de inicialización diferente que el generador de región luego usaría para inicializar una instancia de RNG separada que usaría para generar la región, y así sucesivamente. Esto es para evitar el "efecto mariposa", donde cambiar incluso el más mínimo detalle de la parte más pequeña del mapa podría hacer que el RNG no esté sincronizado y hacer que todo lo demás en el mundo sea completamente diferente.
Otra forma importante de evitar el efecto mariposa, particularmente si estás generando el mundo "sobre la marcha" mientras el jugador lo explora, es evitar los RNG normales por completo (excepto los procesos que suceden "instantáneamente" desde el punto de vista del jugador, como generar un nuevo nivel cuando el jugador ingresa) y en su lugar utiliza métodos de generación de números aleatorios que no almacenan ningún estado interno. Por ejemplo, al elegir la semilla para una subregión que el jugador está a punto de ingresar, el generador global del mundo podría tomar las coordenadas de la subregión (y su propia semilla general) y alimentarlas a una función hash para generar la semilla de la subregión. De esa manera, cada región siempre se verá igual, independientemente del orden en el que el jugador las ingrese.
PD. Después de toda esa digresión, permítame abordar brevemente su pregunta final sobre el código real utilizado para la generación de procedimientos. Por desgracia, no creo que sea realmente responsable en ningún sentido significativo sin muchos más detalles de los que has proporcionado, ya que hay literalmente tantas maneras diferentes de hacer la generación mundial de procedimientos como juegos que los usan.
Por ejemplo, el bisabuelo de todos los juegos de exploración generados por procedimientos es probablemente Rogue , cuyo algoritmo de generación de niveles simplemente consistía en colocar aleatoriamente un montón de habitaciones rectangulares dentro de un nivel rectangular más grande y conectar esas habitaciones con pasajes (y colocar una escalera para el siguiente nivel en uno de ellos). Sus diversos sucesores , desde Nethack hasta la serie Diablo , han elaborado este sistema de muchas maneras, pero la mayoría ha conservado la idea básica de distintos niveles que consisten en habitaciones, mazmorras y laberintos ubicados más o menos al azar en un mapa de cuadrícula.
Por el contrario, para los juegos que cuentan con configuraciones abiertas al aire libre, es probable que desee comenzar con algún tipo de algoritmo de generación de terreno fractal y construir otras características (ríos, bosques, ciudades, etc.) además de eso. O podría hacer algo como lo que hace Minecraft y generar una textura de procedimiento 3D aleatoria que determine qué partes de su paisaje son tierra y aire respectivamente (escaladas y sesgadas para que los bloques más bajos tengan más probabilidades de ser molidos), y luego superponer características como el agua , suelo / roca, vegetación, etc. encima de ella.
Por supuesto, nada de lo anterior se aplica si, por ejemplo, está escribiendo un juego de exploración espacial , en cuyo caso solo necesitará generar un montón de sistemas estelares colocados aleatoriamente de acuerdo con alguna función de densidad, y luego generar un azar conjunto de estrellas y planetas en cada uno de ellos. O tal vez está configurando a sus jugadores para explorar un paisaje no euclidiano , en cuyo caso se enfrentará a un conjunto completamente diferente de desafíos (como el hecho de que el volumen dentro de un radio dado crece exponencialmente en lugar de polinomialmente, por lo que muy difícil mantener un mapa grande en la memoria).