Eu estive analisando alguns algoritmos e artigos sobre como gerar uma masmorra proceduralmente. O problema é que estou tentando gerar uma casa com quartos e eles não parecem atender às minhas necessidades.
Por um lado, as masmorras têm corredores, onde as casas têm corredores. E embora inicialmente pareçam iguais, um salão nada mais é do que a área que não é um quarto, enquanto um corredor é projetado especificamente para conectar uma área a outra.
Outra diferença importante em uma casa é que você tem uma largura e altura específicas e precisa preencher a coisa toda com salas e corredores, enquanto que em uma masmorra, há espaço vazio.
Acho que os corredores de uma casa são algo entre um corredor de masmorra (leva você para outros cômodos) e um espaço vazio na masmorra (não está explicitamente definido no código).
Mais especificamente, os requisitos são:
- Há um conjunto de salas predefinidas
que não consigo criar paredes e portas em tempo real. - Os quartos podem ser rotacionados, mas não redimensionados
Novamente, porque eu tenho um conjunto predefinido de quartos, só posso girá-los, não redimensioná-los. - As dimensões da casa são definidas e devem ser totalmente preenchidas com salas (ou salões). Ou
seja, eu quero preencher uma casa 14x20 com as salas disponíveis, certificando-se de que não haja espaço vazio.
Aqui estão algumas imagens para deixar isso um pouco mais claro:
Como você pode ver, na casa, o "espaço vazio" ainda pode ser percorrido e leva você de um cômodo para outro.
Então, tendo dito tudo isso, talvez uma casa seja apenas uma masmorra muito bem cheia de corredores. Ou é algo mais fácil do que uma masmorra. Talvez haja algo por aí e eu não o encontrei porque realmente não sei o que procurar.
É aqui que eu gostaria da sua ajuda: você poderia me dar dicas sobre como criar esse algoritmo? Alguma idéia de quais medidas serão necessárias? Se você criou um gerador de masmorra, como você o modificaria para atender aos meus requisitos? Você pode ser tão específico ou genérico quanto desejar. Eu estou olhando para escolher o seu cérebro, realmente.
Respostas:
Eu acho que esse é um bom caso para usar a partição de espaço binário ou ternário.
Na primeira passagem, divida o espaço da casa em corredores e {blocos de quartos}. Pegue o próximo pedaço grande, divida-o em {hall and chunk} ou {2 chunks and hall between they}. A cada passo, gire a direção do corte em 90 graus. Pare quando {não houver mais pedaços grandes} ou {área total do salão atingido o limite}.
Na segunda passagem, divida os pedaços restantes em salas. Pegue o próximo pedaço grande e divida-o. Pule dividindo alguns pedaços não tão grandes aleatoriamente, para ter alguns quartos grandes.
Se algum corredor estiver voltado para um corredor muito mais antigo, coloque uma parede (ou parede com porta) lá.
Conecte salas com salas diretamente ou através de outras salas já conectadas.
Por exemplo, você pode ver meu resultado criado manualmente ou C ++ - pseudo-código parcialmente feito . Tiro final:
fonte
L-system
.Você pode aproveitar o fato de que o design desejado agrupa as salas em salas retangulares cercadas por corredores. Com isso em mente, eu faria o seguinte:
O preenchimento de grandes espaços com salas pode ser feito facilmente se você começar com as salas nas bordas - elas têm restrições específicas, por exemplo, as salas voltadas para um corredor podem ter uma porta nessa parede, mas as salas voltadas para as "paredes externas" não pode (eles poderiam ter janelas, talvez). Os quartos "dentro" dos grandes blocos de quartos precisarão de pelo menos uma entrada.
fonte
Então, aqui está como eu resolvi esse problema. Mas, primeiro, gostaria de agradecer a @Shadows In Rain e @egarcia por suas respostas. Eles me deram uma boa direção que me ajudou a obter alguns resultados.
Usei o particionamento espacial do Shadows In Rain para gerar uma casa básica e depois segui o conselho da egarcia para preencher a área com quartos.
O particionamento de espaço foi bem direto, pois 90% do código foi feito pelo Shadows. A parte "preencher os quartos" foi um pouco mais desafiadora. Decidi usar um sistema de pseudo AI Planning que usa A * para posicionar as salas adequadamente. O bom de usar o planejamento em vez de apenas A * é que as condições prévias ajudam a reduzir significativamente o espaço de pesquisa.
Aqui estão algumas capturas de tela com os resultados:
Fase de geração da planta
Fase de colocação do quarto
Agora com portas de conexão!
fonte
Dahl & Rinde têm um trabalho de tese sobre a geração processual de ambientes internos que utiliza uma abordagem de esqueleto e regiões para preencher interiores de edifícios com salas e corredores. O documento inclui diagramas de classes para seu protótipo. Há também algumas boas referências em sua bibliografia, incluindo a mencionada A Pattern Language .
Seu trabalho foi desenvolvido com base nas seguintes suposições simplificadoras:
Aqui está uma breve visão geral do processo deles:
Finalmente, os apartamentos são divididos em quartos usando um diagrama ponderado do tipo Voronoi como base:
fonte