Para responder brevemente à sua pergunta principal primeiro, as principais vantagens de um mundo de jogo gerado processualmente são:
O mundo pode ser enorme , muito maior do que qualquer mundo de jogo projetado manualmente.
O mundo (ou pelo menos partes dele) pode ser regenerado para cada jogo, aumentando potencialmente o valor de repetição, pois o jogador sempre terá algo novo para descobrir.
Por outro lado, as principais desvantagens da geração processual são as seguintes:
Dependendo dos métodos de geração utilizados, pode ser difícil garantir que o mundo seja sempre jogável, ou seja, que o jogador não fique preso sem ter como proceder apenas porque sente azar com a geração mundial.
Mesmo que você evite gerar mundos completamente não jogáveis, a geração aleatória de mundos pode levar a um nível de dificuldade altamente variável: às vezes, o jogador pode encontrar tudo o que precisa apenas alinhado convenientemente para a tomada, às vezes pode demorar muito tempo sem encontrar algo útil .
Por longos períodos, essas flutuações aleatórias tendem a ficar na média, mas se a dificuldade do jogo for, por exemplo, muito pesada (típica para jogos de sobrevivência), um começo ruim pode estragar um jogo, enquanto um começo de muita sorte pode roubar todos os desafios.
A geração de procedimentos mal executados pode fazer o mundo parecer monótono e chato: depois de ver uma dúzia de labirintos gerados aleatoriamente, todos começam a ter a mesma aparência, mesmo se diferirem em detalhes.
Além disso, se o mundo do jogo for completamente regenerado para cada jogo, não haverá locais ou recursos fixos que o jogador possa reconhecer dos jogos anteriores. Essa falta de familiaridade pode dificultar o envolvimento do jogador em um nível emocional ou o compartilhamento de experiências com outros jogadores.
Também há uma coisa que você pode contar em qualquer uma das listas: em um jogo em que o mundo é regenerado aleatoriamente para cada jogo, não pode haver um guia de "orientação", pois todas as orientações serão diferentes.
(Essa irrepetibilidade também pode ser um problema para teste e depuração, embora possa ser pelo menos parcialmente evitada, permitindo que a semente RNG seja especificada, pelo menos no modo de depuração, e / ou fornecendo o comando "cheat" que pode ser usado para avanço rápido para diferentes estágios.)
No entanto, se você olhar para a lista de desvantagens, verá que ela descreve principalmente as desvantagens da geração processual pura ; muitos deles podem ser evitados misturando o conteúdo gerado manualmente e processualmente .
Por exemplo, o jogador sempre pode começar em uma cidade fixa, projetada manualmente, talvez cercada por uma região residencial mais ou menos fixa, mas lugares mais afastados da cidade podem ser gerados aleatoriamente para sempre fornecer regiões desconhecidas para o jogador explorar.
Também pode haver outras cidades criadas manualmente ou outros locais colocados (mais ou menos) aleatoriamente no mundo, de modo que o jogador tenha que encontrá-los, mas saberá o que esperar quando chegar lá. Por outro lado, características importantes como montanhas podem ser colocadas manualmente (pelo menos nas proximidades do local fixo de partida), mas os detalhes de seu terreno podem ser randomizados.
Quanto ao posicionamento aleatório, causando impasses e variação de dificuldade, isso pode ser resolvido através da implementação de várias verificações de consistência e equilíbrio no topo do algoritmo de geração de procedimentos do mundo. Por exemplo, se o jogador precisar de um item específico para poder atravessar a água, você pode incluir algum código para garantir que pelo menos um desses itens seja colocado para que o jogador possa alcançá-lo sem atravessar a água.
Da mesma forma, você também pode ajustar suas regras de posicionamento de itens, para que nenhuma varinha de incrível equilíbrio seja colocada antes que o jogador atinja o nível x , e talvez para garantir que pelo menos uma seja colocada em um local fixo onde o jogador possa alcançar antes de chegar ao estágio em que eles precisarão para sobreviver.
A propósito, uma maneira comum de fazer com que o conteúdo processual e manualmente gerado seja mesclado de maneira mais ou menos transparente é iniciar o processo de geração manual usando o gerador de mundo processual (talvez aprimorado adequadamente, por exemplo, para gerar uma vila ou um pico de montanha onde você desejar) ) para inicializar a região que você está projetando e, em seguida, aprimorando-a manualmente para adicionar e ajustar os detalhes desejados. (Isso também pode permitir um armazenamento de nível muito compacto, salvando apenas as alterações manuais e a semente do gerador e os parâmetros usados.)
Outras maneiras de combinar conteúdo manual e processual incluem deixar espaços em branco nos níveis projetados manualmente, para serem preenchidos por conteúdo aleatório (por exemplo, um castelo pode incluir um labirinto gerado aleatoriamente nas masmorras, com apenas o contorno e as saídas corrigidos), ou o design manual poderia especificar apenas o esboço geral de algumas partes do nível (por exemplo, a localização de casas em uma cidade) e deixar os detalhes (como a aparência exata de cada casa) para serem escolhidos aleatoriamente.
De fato, mesmo muitos jogos com mundo de jogo totalmente fixo usam alguma forma de geração procedural como parte de seu processo de criação de níveis, pois existem alguns aspectos da geração mundial (como produzir terreno com aparência natural ou colocar árvores individuais em uma floresta) que são difíceis e / ou entediantes de fazer manualmente, mas relativamente fáceis de automatizar.
Por outro lado, a maioria dos geradores de procedimentos mundiais usará pelo menos alguns objetos e elementos projetados manualmente para construir o mundo. Pode-se facilmente ter vários níveis de geração aleatória / manual aninhada: por exemplo, um mundo gerado procedimentalmente pode incluir uma cidade gerada manualmente cercada por bosques gerados processualmente com um contorno desenhado manualmente, com árvores geradas processualmente com folhas projetadas manualmente.
Observe também que a geração de conteúdo procedural não é necessariamente incompatível com um mundo fixo: você pode escolher uma semente RNG fixa e usá-la para gerar seu mundo. Isso pode ser útil se você deseja um mundo enorme para os jogadores explorarem, mas deseja manter o mesmo para todos os jogos e jogadores.
Observe que, se você fizer isso (ou possivelmente não o fizer), realmente deverá projetar seu gerador mundial para funcionar de maneira hierárquica, usando várias instâncias de RNG, de modo que, por exemplo, o gerador de mapa geral mantenha uma única instância de RNG que ele usaria para gerar sub-regiões, atribuindo a cada sub-região um valor de semente diferente que o gerador de região usaria para propagar uma instância de RNG separada que usaria para gerar a região e assim por diante. Isso é para evitar o "efeito borboleta", onde a alteração dos mínimos detalhes da menor parte do mapa pode deixar o RNG fora de sincronia e fazer com que todo o resto do mundo seja completamente diferente.
Outra maneira importante de evitar o efeito borboleta, principalmente se você estiver gerando o mundo "on the fly", conforme o jogador o explora, é evitar RNGs normais inteiramente (exceto para processos que acontecem "instantaneamente" do ponto de vista do jogador, como gerar um novo nível quando o jogador entra) e, em vez disso, use métodos aleatórios de geração de números que não armazenam nenhum estado interno. Por exemplo, ao escolher a semente para uma sub-região na qual o jogador está prestes a entrar, o gerador mundial geral pode pegar as coordenadas da sub-região (e sua própria semente geral) e alimentá-las com uma função de hash para gerar a semente da sub-região. Dessa forma, cada região sempre terá a mesma aparência, independentemente da ordem em que o jogador as insere.
Ps. Depois de toda essa digressão, deixe-me abordar brevemente sua pergunta final sobre o código real usado para a geração de procedimentos. Infelizmente, não acho que seja realmente responsável, em nenhum sentido significativo, sem muito mais detalhes do que você forneceu, pois existem literalmente tantas maneiras diferentes de gerar a geração processual do mundo quanto os jogos que as utilizam.
Por exemplo, o bisavô de todos os jogos de exploração gerados proceduralmente é provavelmente Rogue , cujo algoritmo de geração de nível consistia simplesmente em colocar aleatoriamente um monte de salas retangulares em um nível retangular maior e conectar essas salas a passagens (e colocar uma escada para o próximo nível em um deles). Seus diversos sucessores , da Nethack à série Diablo , elaboraram esse sistema de várias maneiras, mas a maioria manteve a ideia básica de níveis distintos, consistindo de salas, masmorras e labirintos mais ou menos aleatoriamente colocados em um mapa de grade.
Por outro lado, para jogos com configurações externas abertas, provavelmente você desejará começar com algum tipo de algoritmo de geração de terreno fractal e criar outros recursos (rios, florestas, cidades etc.) além disso. Ou você pode fazer algo parecido com o que o Minecraft faz e gerar uma textura processual aleatória em 3D , determinando quais partes de sua paisagem são solo e ar respectivamente (dimensionadas e inclinadas para que blocos mais baixos tenham mais probabilidade de serem terra) e depois sobrepor recursos como água , solo / rocha, vegetação etc. em cima.
Obviamente, nenhuma das opções acima se aplica se você estiver, digamos, escrevendo um jogo de exploração espacial ; nesse caso, você só precisará gerar um monte de sistemas estelares colocados aleatoriamente de acordo com alguma função de densidade e, em seguida, gerar uma aleatória conjunto de estrelas e planetas em cada um deles. Ou talvez você esteja definindo seus jogadores para explorar uma paisagem não-euclidiana ; nesse caso, você estará enfrentando um conjunto completamente diferente de desafios (como o fato de o volume dentro de um determinado raio aumentar exponencialmente e não polinomialmente, tornando-o realmente difícil manter um mapa grande na memória).