Dungeon Generation em Diablo 1

imagem

Diablo 1 é o clássico 1996 de hackers e barras roguelike. Essa foi uma das primeiras tentativas bem-sucedidas de apresentar as massas aos roguelike, que até então tinham gráficos de nicho na forma de arte ASCII. O jogo gerou várias sequências e muitas simulações. Ela é conhecida por sua atmosfera sombria e sombria, engrossando à medida que o jogador desce para as masmorras localizadas sob a cidade de Tristram. Foi um dos primeiros jogos com geração de mapas procedurais para mim, e a possibilidade de gerar níveis tão confiáveis ​​me chocou.

Recentemente, descobri que, devido à descoberta de vários arquivos com símbolos de depuração, vários fãs do jogo assumiram a tarefa de fazer engenharia reversa do código-fonte para limpá-lo e descobrir como era o código escrito pelos desenvolvedores. Assim começou minha excursão de uma semana ao estudo de como o desenvolvedor líder David Brevik criou esses níveis. Talvez por isso, a mágica do jogo tenha me desmoronado parcialmente, mas eu aprendi muitas técnicas que serão úteis para desenvolvedores de jogos semelhantes, portanto, neste artigo, eu as compartilharei.

Agradecemos a David Brevik e à equipe Blizard North por criar um jogo tão incrível, bem como a galaxyhaxz e a equipe Devilution por seu incrível trabalho em restaurar o código-fonte legível do projeto.

1. Introdução


Diablo é um jogo que consiste em peças isométricas. O jogo consiste em 4 etapas, cada uma com 4 níveis. Etapas do jogo: Catedral, Catacumbas, Cavernas e Inferno. Existem também vários níveis fixos, por exemplo, a cidade de Tristram, que não considerarei no artigo. O Diablo possui procedimentos de geração de nível separados para cada um dos quatro estágios; portanto, primeiro falarei sobre seus recursos e depois considerarei separadamente a operação de cada um dos estágios.

Eu só estava interessado em como os níveis eram gerados. Para aprender sobre missões, monstros, etc. Eu recomendo a leitura do Guia do Jarulf para Diablo e Hellfire , que descreve esses aspectos em detalhes.

Recursos Gerais


Embora cada estágio tenha seu próprio gerador de nível, todos eles têm características comuns.

Calabouços e Azulejos


Cada nível do jogo é gerado para preencher uma grade de 40 x 40 peças. O eixo X corresponde ao sudeste e o eixo Y corresponde ao sudoeste.

Esses blocos são usados ​​apenas para tarefas de geração de nível. Depois de criar um nível, cada bloco é dividido em 4 "fragmentos de masmorra", que são renderizados na tela.


Essa grade mais detalhada é usada para determinar blocos atravessados ​​e também fornece uma reutilização mais eficiente da memória gráfica. Anteriormente, escrevi sobre esquemas de divisão de blocos .

Isso significa que o cartão padrão Diablo consiste em mais de cem peças, muitas das quais são pequenas variações de outras, para levar em consideração todas as maneiras possíveis de conectá-las. Falaremos sobre isso mais tarde.

Para minha surpresa, diferentemente de outros jogos desta série, os mapas de masmorra não são compostos de blocos pré-criados. Quase tudo é criado usando algoritmos.

Processo em várias etapas


Cada procedimento de geração de masmorra é dividido em dois estágios. A pré-geração não lida com a escolha dos ladrilhos. Ele simplesmente gera uma matriz na qual são marcados azulejos aceitáveis, azulejos nos quais há portas e alguns outros detalhes de alto nível. No segundo estágio, esse espaço em branco da masmorra é convertido em uma matriz de blocos, após a qual a geração é executada e as alterações são feitas considerando esses blocos.

Isso deve ser incrivelmente conveniente para o designer. Você pode experimentar uma planta totalmente independente da escolha de azulejos e estilo. Mas, em muitos casos, eles estão interconectados, proporcionando um senso de nível mais holístico.

Todos os estágios da criação de espaços em branco nas masmorras começam com um nível cheio de "dureza" sólida, após o qual as partes individuais do nível se transformam recursivamente em ladrilhos. Vou discutir isso em mais detalhes abaixo.

Fragmentos acabados


Fragmentos acabados são blocos de nível pré-criados que são simplesmente inseridos em um nível gerado aleatoriamente. Eles são usados ​​para a maioria das missões de jogos. Em cada nível, pode haver apenas um fragmento finalizado, cuja localização em cada estágio é selecionada separadamente.


O açougue é um dos primeiros trechos pré-fabricados encontrados no jogo.

Mini sets


Os mini-kits são outra maneira de inserir conteúdo em um nível de conteúdo pré-criado. São pequenos pedaços, geralmente com aproximadamente 3 × 3, inseridos aleatoriamente na masmorra. Existe um esquema simples de correspondência de padrões, graças ao qual eles aparecem apenas nos lugares "certos". Geralmente, eles são codificados com requisitos adicionais, por exemplo, os mini-conjuntos não podem ser colocados próximos uns dos outros, não podem se sobrepor a fragmentos prontos, e assim por diante. Alguns mini-kits sempre pesquisam e substituem, enquanto outros fazem isso com uma probabilidade fixa.

Os mini kits Diablo são usados ​​para diversos fins. Eles são usados ​​para colocar objetos grandes de ladrilhos, como escadas, para corrigir combinações de ladrilhos que não se conectam bem entre si e para adicionar variação aleatória aos ladrilhos.

Salas temáticas


Os quartos temáticos são pequenos espaços delimitados por uma parede e uma porta. Geralmente neles, de maneira aleatória, certos objetos predeterminados estão localizados. Por exemplo, as bibliotecas sempre têm uma estante com duas velas de cada lado, vários suportes para livros e monstros aleatórios. As tocas de monstros contêm muitos monstros e um item aleatório, e assim por diante.

Nos níveis do estágio athedral, o gerador cria salas adequadas que são reconhecidas pelo preenchimento e reutilizadas. Em outros estágios, o algoritmo encontra espaços abertos nos quais paredes e uma porta são desenhadas para criar salas.

Cada tipo de sala temática possui certos requisitos para o tamanho e o estágio em que é gerada.

Substituições de ladrilhos


Algumas cartas têm uma adaptação especial das peças, mas todas têm uma característica comum: algumas peças podem ser substituídas por variações semelhantes. Os ladrilhos mais comuns (por exemplo, pisos e paredes planas) têm várias variações, o que reduz a monotonia do nível. As substituições de ladrilhos nunca são reutilizadas lado a lado.

Comparação de padrões e "correções"


Como mencionado acima, os mini-conjuntos são usados ​​como um mecanismo de busca e substituição que corrige as falhas do gerador. Mas, na maioria dos estágios, existem procedimentos que detectam e corrigem problemas mais específicos. Não vou entrar em detalhes, porque há apenas um monte deles. Basta dizer que Diablo é bastante problemático e, mais perto do lançamento, ficou óbvio que seria mais fácil adicionar reconhecimento de problemas específicos do que eliminar suas causas fundamentais.

Uma das "correções" mais comuns era o "bloqueio": verificava se era possível passar por toda a masmorra e recomeçava a geração, se não fosse.

Missões


A maioria das missões foi criada usando fragmentos prontos, mas alguns usaram sua própria lógica. Por exemplo, Zhar, o Louco, gera salas de biblioteca temáticas, a entrada para Água Envenenada é gerada por mini-discagem e Anvil of Fury possui um código de geração de nível específico. Não entrarei em detalhes, mas o código está cheio de verificações semelhantes para missões.

Catedral


A catedral é provavelmente a mais icônica das etapas de Diablo. É caracterizada por longas filas de arcos góticos, salas apertadas e muitos gargalos na forma de portas. Vamos ver como foi criado.

imagem

Calabouço em branco


A primeira coisa que o algoritmo faz é desenhar o núcleo do cartão. Ele seleciona aleatoriamente até três salas 10 × 10 em posições predeterminadas ao longo do eixo central X ou Y. Um amplo corredor que liga as salas também é desenhado ao longo do eixo. Se houver um fragmento acabado no nível, ele estará sempre localizado no centro de uma dessas salas. Essas salas centrais de calabouço são marcadas como inadequadas para novas paredes, de modo que permaneçam sempre grandes espaços abertos.

Todas as outras salas são geradas pela técnica de brotamento recursivo em uma função chamada L5roomGen , que é acionada em cada uma dessas salas e pela seleção de um eixo.

Função L5roomGen


  • Ela passa pelo retângulo da sala original, da qual você precisa começar a brotar, bem como pelo eixo preferido.
  • Com uma probabilidade de 1/4, o eixo preferido muda.
  • O tamanho aleatório da nova sala é selecionado, com 2, 4 ou 6 peças de cada lado.
  • Para cada lado da sala original ao longo do eixo selecionado (ou seja, SE / NS para X, SW / NE para Y):
    • O retângulo da nova sala está alinhado com o centro da borda da sala original
    • A verificação é feita antes disso, não havia nada desenhado e não chegamos ao final do mapa. Paredes requerem uma borda de um bloco.
    • Se a verificação for bem sucedida, uma sala é desenhada.
  • Para cada sala a ser L5roomGen , L5roomGen é chamado recursivamente, que passa pela nova sala e pelo eixo oposto ao usado anteriormente.

Por fim, esse procedimento começa com várias salas cortadas dentro dos ladrilhos "sólidos" e cola repetidamente novos retângulos para cortar novas áreas transitáveis. Nesta fase, todas as "salas" estão abertas de um lado, porque cada nova sala está localizada diretamente ao lado da anterior, sem passes para a colocação de paredes.

Em seguida, o gerador calcula o número de blocos atravessados ​​gerados. Se estiver abaixo do limite mínimo, que aumenta a cada nível, a masmorra é destruída e a tentativa de geração é realizada novamente.

Calabouço


Até o momento, o algoritmo possui apenas os blocos "sólidos" e de gênero. Precisamos substituí-los por revestimentos de parede reais. Para isso, Diablo usa o algoritmo dos quadrados de marcha, que descrevi em um artigo anterior .

No entanto, o jogo usa sua variação incomum. O conjunto de azulejos da catedral contém paredes, mas eles sempre estão localizados na extremidade do azulejo. Portanto, há um ladrilho com uma parede na borda nordeste, mas não há ladrilhos com uma parede na borda sudeste. Para criar paredes em outros lados, você precisa encontrar um ladrilho "sólido" que tenha uma parede adicional que se estenda para fora da borda do ladrilho. Parece estranho, mas na verdade é muito conveniente para classificar paredes por profundidade.


Para lidar com isso, Diablo pula algumas paredes durante a fase dos cubos de marchas:


Paredes adicionais são adicionadas mais tarde, no estágio "reparos". Eu acho que esse procedimento simples afeta mais o "estilo" da catedral. Como as paredes opostas são fixadas em ladrilhos sólidos, no caso de duas salas separadas por um revestimento, a parede oposta simplesmente não será criada. Isso significa que as divisórias entre as salas são "mais finas" do que as que você pode obter na resolução em que os quadrados de marcha são executados.

Depois de colocar as paredes principais, o gerador adiciona quatro colunas independentes a cada uma das salas centrais e uma colunata de arcos para o corredor central. Isso permite que você dê à catedral um senso de design com mais cuidado do que outros níveis, e também ajuda os jogadores a navegar.

O gerador então adiciona aleatoriamente paredes divisórias. Paredes separadas sempre vão diretamente ao longo do eixo de uma parede para outra. Eles começam nos cantos, de modo que as áreas são lindamente divididas em salas. Em 25% dos casos, uma parede é uma série de arcos, em 25% dos casos é uma série de arcos com uma grade bloqueando a entrada e, em todos os outros casos, é uma parede sólida. No caso de grades e paredes sólidas, em algum lugar ao longo da parede de separação, uma porta ou arco é adicionado aleatoriamente para tornar o espaço aceitável.

O procedimento de preenchimento detecta possíveis salas temáticas.

As escadas são colocadas para conectar-se a outros níveis. Se for impossível colocá-los, a tentativa de gerar a masmorra começa de novo.

Quanto ao arranjo de mini-conjuntos, "correções" e substituições, não os considerarei em detalhes. Acima de tudo, adoro o mini-kit PANCREAS1, que tem 1% de chance de colocar uma pilha de carne ensanguentada no piso. No final, 5 a 10 objetos de lâmpada são colocados nele para decorar a masmorra.

Catacumbas


Ao contrário da catedral, que parece ser um edifício projetado, as catacumbas parecem muito mais espontâneas. Eles são caracterizados por salas quadradas conectadas umas às outras por muitos corredores sinuosos. Em muitos lugares, em vez de portas, grandes aberturas estão localizadas. aumentando a probabilidade de o jogador estar cercado por muitos inimigos.

O algoritmo de geração mais complexo do jogo foi usado para gerar catacumbas. Suspeito que a falta de tempo tenha forçado os desenvolvedores a aplicar soluções mais simples nos estágios subseqüentes.

imagem

Calabouço em branco


O procedimento para criar um espaço de calabouço para catacumbas é bastante exclusivo. Em todos os outros estágios, há um único valor booleano indicando a presença ou ausência de sexo (mais um conjunto de bits para detalhes adicionais). As catacumbas armazenam a masmorra em branco na forma de um cartão ASCII, quase como o clássico de um roguel. E isso não é particularmente surpreendente, dada a admissão de David Brevik de que ele inspirou Diablo na Angband .

O gerador da sala principal é novamente um algoritmo recursivo, mas desta vez uma partição recursiva. A função CreateRoom chamada para toda a área da masmorra de 40 × 40 menos 1 lado a lado.

Função CreateRoom


  • A função CreateRoom um retângulo que indica a área dentro da qual você deseja gerar salas. Os detalhes também são passados ​​para a função sobre a sala original (inicialmente nula)
  • Se a área for muito estreita, a função será encerrada.
  • Um tamanho aleatório é selecionado para a sala de 4 a 9 peças de cada lado, levando em consideração o tamanho máximo da área em que você deseja colocar a sala.
  • Na área, uma posição aleatória é selecionada para colocar a sala.
  • A sala é renderizada em um mapa ASCII. Na figura, o símbolo '.' os pisos são indicados, o símbolo '#' é a parede circundante e as letras 'A' , 'B' , 'C' e 'E' são os quatro cantos.
  • Se uma sala tiver uma sala de origem:
    • Um ladrilho aleatório é selecionado nas bordas mais próximas das salas originais e novas.
    • Esta informação é registrada na lista de corredores, que será usada posteriormente.
  • As partes restantes da área, com exceção da sala atual, são cortadas, criando quatro retângulos.
  • O tamanho de cada retângulo é reduzido em dois blocos para criar um espaço entre as salas e, em seguida, a função CreateRoom é chamada recursivamente, a região para a qual esse retângulo é usado e a sala criada como fonte.

Se houver um fragmento finalizado no mapa, ele estará sempre na primeira sala criada pelo CreateRoom e suas dimensões serão feitas para que esse fragmento seja colocado nele.

Depois de chamar o CreateRoom obtemos um array ASCII semelhante ao mostrado abaixo (obrigado nomdenom por extraí-lo do código):

 A##B #..# A####B #..# #....# #..# #....# C##E #....# C####EA#####B #.....# #.....# A########B #.....# #........# #.....# #........# C#####E #........# A#B #........# #.# #........# #.# #........# #.# #........# #.# #........# #.# C########E #.# #.# A#BC#E #.# A####B #.# #....# #.# #....# #.# #....# #.# C####E #.# #.# A#####BC#E #.....# A###B #.....# #...# #.....# C###E #.....# C#####E 

Nesse caso, a sala "raiz", criada originalmente, era a mais baixa.

Em seguida, as informações do corredor coletadas anteriormente são aplicadas. Uma linha é desenhada entre cada par de pontos gravados. Quando cruza uma parede, 'D' escrito e, quando cruza um bloco sólido, ',' . Os corredores têm uma largura aleatória: 1, 2 ou 3. Os ladrilhos de canto são usados ​​para auxiliar na navegação.

Se as portas estiverem adjacentes a outra porta, elas serão puladas e os corredores poderão se sobrepor, o que permite ocultar a simplicidade do gerador.

Após gravar todos os corredores, o cartão ASCII é limpo. Os ladrilhos de canto se tornam ladrilhos, e os ladrilhos ' ' ao lado de ',' também se tornam paredes. Finalmente, os caracteres ',' são substituídos pelos caracteres '.' . Então, temos o plano de masmorra mostrado abaixo.

 #### #..# ###### #..# #....# #..# #....# #D## #....# #.# #D#### ##D#### #..# #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# #........# ### #.##D#### #........# #.### #.##...# #........###.D.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# #........##..#.# #.##...# ###D#######..#.# #.##...# #.......#..#.# #.###D## ###.....#..### #.# #.# #######D##.# #.# #.# #....#.# #.# #.# #....D.# #.# #.# #....###### #.# #.# ##D####....## #.# #.# #...........# #.# #.# ####....###D####.# ### ######.....##.# #####.D.....##.# #...D.#.....D..# #####.#.....#### ######### 

Como você pode ver, esse procedimento pode deixar bastante espaço vazio no mapa. Portanto, o próximo passo do gerador é "preencher os vazios". Ele procura por seções de parede adjacentes nas quais retângulos de piso adicionais possam ser colados. Os retângulos podem ter pelo menos 5 × 5 e não mais de 12 × 14 em tamanho.

O preenchimento de vozes continua até que um mínimo de 700 blocos seja obtido ou o limite de novas tentativas seja atingido. Se o gerador falhar em atingir 700 peças, a geração de masmorras começará do zero.

Isso nos dá o espaço em branco mostrado abaixo.

  ########## #........# ########### #........# #.........# #........# #.........# #........# #.........# #### #........# #.........# #..# #######..###.........# #..# #..............# #..# #..............# #D## #..............# #.# #D####.........# ##D#### #..# ########### #.....# #..# ###.....# ##D######## #.D.....# #........# #.#.....# ########........# ### #.##D#### #...............# #.### #.##...# #...............###.D.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #...............##..#.# #.##...# #......###D#######..#.# #.##...# #......# #.......#..#.# #.###D## #......# ###.....#..### #.# #.# #......#########D##.# #.# #.# #.........# #....#.# #.# #.# #.........# #....D.# #.# #.# #.........# #....###### #.# #.# #.........# ##D####....## #.# #.# #.........# #...........# #.# #.# #.........# ####....###D####.# ### #.........# ######.....##.# #.........# #####.D.....##.# #.........# #...D.#.....D..# ########### #####.#.....#### ######### 

Calabouço


Novamente, as catacumbas são diferentes da fórmula de nível padrão. Em vez do algoritmo de quadrados de marcha (que atribui blocos com base em 2 × 2 quadrados do espaço em branco da masmorra), ele usa seu próprio procedimento de correspondência de padrões, que examina cada um dos retângulos 3 × 3 do espaço em branco da masmorra e seleciona o bloco correspondente para a masmorra. Os padrões determinam o que cada ladrilho de calabouço deve ser: uma parede, piso, porta, ladrilho sólido ou uma combinação deles. Eu não entendo bem o porquê.

O restante da função lhe parecerá familiar da Catedral. Escadas para cima e para baixo são colocadas no mapa, a masmorra é verificada quanto à possibilidade de passagem completa e várias correções também são realizadas. Conforme descrito na seção Recursos gerais, as salas são inseridas, seguidas por muitos mini-conjuntos e substituições de ladrilhos.

Eu acho que os mini-sets de alguma forma afetam as portas, mas são muito chatos de ler sem ferramentas, então eu não me aprofundei neste tópico.

Cavernas


Os níveis das cavernas são preenchidos com vastos espaços abertos e rios de lava. As paredes desta área são ásperas e onduladas. Os únicos componentes retangulares aqui são os andaimes de madeira, que aparentemente apareceram depois das próprias cavernas.

Esta fase é uma das mais bonitas do jogo, graças à lava animada. Sente-se que é muito diferente dos níveis anteriores compostos por quartos. Portanto, fiquei muito surpreso que a parte principal da geração seja modelada de acordo com os princípios do palco da Catedral, e as cartas tenham uma aparência mais "caverna" usando truques complicados.

imagem

Calabouço em branco


A criação de um nível de caverna começa com uma sala 2 × 2 aleatória, localizada em algum lugar próximo ao centro do mapa. O gerador chama o procedimento DRLG_L3CreateBlock para cada borda deste bloco.

Ao desenhar retângulos nesse nível, o preenchimento normal não é usado. Os interiores são sempre sólidos, mas cada ladrilho na borda tem 50% de chance de se tornar um piso, caso contrário, permanece sólido.

Procedimento DRLG_L3CreateBlock


  • Essa função obtém a borda do retângulo, ou seja, ponto de partida, direção e comprimento.
  • O tamanho do bloco recém-criado é selecionado no intervalo de 3-4 para cada lado.
  • O novo bloco é colocado aleatoriamente em relação à borda de entrada.
  • Se não houver espaço suficiente para desenhar um bloco, a saída será realizada.
  • O bloco está desenhado.
  • Com uma probabilidade de 1/4, a saída é executada.
  • DRLG_L3CreateBlock é chamado DRLG_L3CreateBlock para três arestas, além da de onde viemos.

Embora esse procedimento seja semelhante ao L5roomGen , o uso de um tamanho de bloco muito menor e o desenho de bordas grossas proporcionam uma aparência muito mais orgânica. Além disso, ele não inclui uma borda de 1 ladrilho para paredes; portanto, diferente dos geradores anteriores, ele pode criar loops.

Após criar um esboço aproximado da forma da masmorra, o gerador aplica os procedimentos de erosão:

  • Primeiro, ele encontra áreas de ladrilhos 2 × 2 com ladrilhos sólidos na diagonal oposta. Muitas vezes, é difícil trabalhar com essas formações ao executar quadrados de marcha; portanto, um dos ladrilhos sólidos é substituído aleatoriamente por sexo.
  • Todos os ladrilhos únicos sólidos cercados por 8 pisos são substituídos por um piso.
  • Todas as seções longas e retas das paredes são desbastadas aleatoriamente, substituindo 50% das paredes por pisos.
  • As diagonais de blocos contínuos são eliminadas repetidamente.

Todos esses procedimentos adicionam mais ladrilhos para que o mapa fique mais aberto.

Se tiver menos de 600 pisos, o mapa será regenerado.

Calabouço


Os espaços em branco do calabouço são convertidos em ladrilhos usando quadrados de marcha. Ao contrário da Catedral e das Catacumbas, o conjunto de peças é muito mais conveniente aqui e contém quase todas as combinações necessárias para a marcha dos quadrados. Não há ladrilhos para paredes diagonalmente opostas, mas eles foram eliminados na fase da peça, para que nunca apareçam.

Então, como sempre, existem muitos mini-sets. O código possui vários mini-conjuntos que definem uma seção separada de paredes e a substituem por estalagmites e pisos, o que aumenta a abertura dos espaços.

Lagos de lava são adicionados. O algoritmo procura uma seção de parede adjacente usando preenchimento . Se ele conseguir encontrar uma seção de paredes / ladrilhos sólidos com menos de 40 ladrilhos completamente cercados por ladrilhos, eles serão substituídos por lava. Se o lago de lava não puder ser encontrado, a geração da masmorra começará novamente.


Uma parede 3 × 3 se transforma em um lago de lava

Em seguida, vários rios de lava são adicionados. O gerador faz várias tentativas para desenhar um rio começando no lago de lava e terminando na parede. Os seguintes requisitos são impostos ao rio: ele não deve cruzar-se, o rio tem um comprimento de 7-100 ladrilhos e deve haver um local adequado para a ponte sobre ele. O bloco da ponte garante que todo o mapa permaneça aceitável. Se houver espaço no mapa, podem ser adicionados até quatro rios.

Em seguida, são colocados quartos temáticos. Nesta fase, as paredes das salas temáticas são cercas de madeira, pelas quais você não pode passar, mas pode assistir. A cerca de madeira também é usada nos dois procedimentos a seguir. O primeiro coloca uma cerca em todas as seções restantes das paredes, tendo seções retas razoavelmente longas. O segundo desenha uma linha de cercas no mapa, de uma parede para a outra, e depois insere a porta. Ao contrário do procedimento para gerar uma catedral, ele não procura cantos para começar a criar essas paredes.

Inferno


O inferno é a perna final de Diablo. Nele, a ênfase principal já está nos monstros, e o design dos níveis segue o caminho. Esse estágio tem o menor conjunto de peças de todos, e a maior parte é usada para enormes escadas e pentagramas. Os níveis infernais geralmente consistem em várias salas quadradas e têm um layout simétrico.

imagem

Calabouço em branco


A geração do inferno começa com uma sala aleatória de 5 a 6 peças de cada lado (mais se houver um fragmento pronto para a missão) e, em seguida, o mesmo brotamento recursivo é aplicado como na Catedral. No entanto, a geração é limitada a 20 × 20.

É adicionado um corredor vertical e horizontal, esticado até a borda da área 20 × 20.

Em seguida, o espaço em branco da masmorra é espelhado horizontal e verticalmente para obter o tamanho completo.

Calabouço


Os espaços em branco do calabouço são novamente convertidos em ladrilhos usando quadrados de marcha. Então, semelhante à criação da catedral, paredes são adicionadas, como nas catacumbas e cavernas.

Conclusão


Eu realmente gostei de ler este código. Embora haja obviamente bugs, os nomes são atribuídos aleatoriamente e algumas partes não podem ser recriadas em código-fonte de alta qualidade, é claramente visível que esse código passou por um teste sério em batalha e está cheio de idéias inteligentes.

Aqui estão as lições mais importantes para mim:

  • O diabo está nos detalhes: os componentes individuais não são insanamente complexos, mas quando combinados, eles dão algo maravilhoso. Eu posso imaginar como os desenvolvedores se preocuparam em melhorar a qualidade até que os níveis passassem de apenas bons para incríveis. O número de blocos e a complexidade combinatória dos conjuntos de blocos também é muito alto - é impossível implementá-lo sem atenção à maneira como os elementos estão conectados.
  • Pesquisar e substituir a correspondência de padrões é uma ferramenta muito poderosa com a qual você pode implementar muitos efeitos diferentes. Ele corrige bugs de geração, adiciona variabilidade, insere conteúdo pré-criado, gerencia erosão e muito mais.
  • Dividir a geração da masmorra no mapa de patência (preparação da masmorra) e geração de ladrilhos também é uma técnica muito conveniente, tanto em termos de design quanto de depuração.
  • , . , .
  • , .

Source: https://habr.com/ru/post/pt460038/


All Articles