Gosto da maneira como o Age of Empires II gera mapas aleatórios (boa variedade, transições decentes de biomas, mapas parecidos aleatórios sem parecer caótico), mas estou lutando para replicar o estilo. Tentei usar, por exemplo, o ruído Perlin, mas tudo sai muito homogêneo ou, se não, o valor Perlin -> as heurísticas do terreno são muito sensíveis e frágeis para criar uma variedade de tipos de mundo.
Lembro-me do tipo de mapa AoE2 "The Unknown" anunciava "100.000 mapas possíveis", sugerindo algum uso de números de sementes, mas não sei como usá-los para produzir a variedade que vi.
Quais algoritmos e heurísticas eu poderia usar para produzir mapas aleatórios que parecem mapas aleatórios AoE2?
Edite para ser mais específico:
Pensando mais no meu problema e estudando o que eu gosto no mecanismo de mapas aleatórios do AoE2, acredito que meu maior problema é gerenciar a distribuição da água e da vida vegetal no mapa . Vejo agora que também prendi isso em minha mente com "transições de biomas que fazem sentido", mas esse é um problema diferente (embora eu espere que meu uso continuado do ruído Perlin seja difícil de resolver).
Eu adicionei vários mapas aleatórios do AoE2 que destacam o que eu gosto no mecanismo de mapeamento deles, que meus próprios esforços não conseguem reproduzir. Todas as capturas de tela são tiradas do tipo de mapa aleatório, "Personalizado" -> "O desconhecido". Não instruí o jogo a usar geografias específicas, como arquipélagos.
Mais abaixo estão as imagens do meu próprio mecanismo de mapas. Cada pixel corresponde a um bloco de mapa AoE2.
Uma complicação do meu projeto é que eu quero que os mapas sejam muitas e muitas vezes maiores que os mapas do AoE2. Portanto, qualquer mecanismo que eu use deve ser capaz de criar toda a gama de biomas em cada mapa, e não um conjunto restrito de biomas por mapa, como o AoE2 usa.
Mapas do Age of Empires II
Aqui está um exemplo que apresenta lagos interiores e algum tipo de coisa parecida com um rio. Gosto de como o mapa inclui uma grande quantidade de água espalhada, mas essa água ainda está um pouco concentrada - existem grandes extensões de terra disponíveis para a construção de seu império. Você não precisa gastar o jogo inteiro planejando sua cidade na água.
Aqui está um exemplo semelhante em que o jogo foi inteligente o suficiente para conectar ilhas com pântanos atravessáveis. Não consigo imaginar como um algoritmo baseado em ruído criaria o pântano lá, e apenas nesses lugares. Além disso, observe como o jogo criou a terra, de modo que cada jogador tenha sua própria e grande área de terra para começar. Ele não criou trechos aleatórios de terra e, em seguida, adivinhou qual seria o menos terrível para cada jogador começar.
Eu gosto que este mapa também faça uso pesado de água, mas não inclui muitos lagos do interior. Compare com a primeira imagem. Gosto da maneira como o AoE2 cria geografias completamente diferentes usando os mesmos blocos de construção. Minha tentativa de usar o ruído Perlin falhou aqui - ou recebo oceanos enormes e enormes que diminuem a massa terrestre ou a Terra de 10.000 lagos. Também achei difícil conseguir ilhas e continentes conectados (pense na América do Norte / do Sul).
Compare esta imagem com a imagem acima. Eles mostram que a aridez de um mapa não depende do nível da água. A primeira imagem apresenta um mapa quase desprovido de água, mas contém florestas e grama. A segunda imagem tem uma quantidade moderada de água, mas é um deserto. Gosto que isso seja possível (pense em ter o Novo México ou o Saara e a Costa Rica em seu mundo).
Meus próprios mapas
Li em vários lugares que uma boa maneira de construir mapas é colocar em camadas vários níveis de ruído Perlin, cada um representando uma dimensão diferente dos dados. Seguindo as recomendações populares, fui com a elevação e a umidade, selecionando os tipos de terreno da tabela Whittaker aqui .
Peguei dois mapas perlin, quantizei os valores de cada um em números inteiros por meio de um simples e if perlin_val < x { i=some_int } else if perlin_val < y...
, em seguida, mapeei os pares inteiros (elevação, umidade) para uma tabela de tipos de terreno (por exemplo, [1,0] -> deserto tropical, [1,1 ] -> prados). Os oceanos foram incluídos neste sistema - elevação = 0 oceano definido.
Há uma boa variação e, de várias maneiras, parece um mundo real, mas existem alguns problemas:
Primeiro, não há padrão para as profundezas do oceano. Você esperaria águas rasas perto da costa e águas profundas mais longe, não há rima ou razão para saber onde é
Segundo, toda a água está concentrada nos oceanos; não há lagos ou rios, porque o ruído de Perlin não cai repentinamente para um valor mais baixo no meio de um continente.
Criar um equilíbrio entre quantidades de cada bioma é muito, muito difícil. Atribuo isso a:
O ruído Perlin segue uma distribuição normal, portanto, é difícil estimar como ajustar a probabilidade de cada mapeamento de dimensão.
Tentar equilibrar várias dimensões é difícil - talvez eu queira mais (2,3), então eu aumenta as chances de conseguir (n, 3). Bem, agora eu tenho muito (3,3) e tudo parece errado.
Quando ampliei o ruído o suficiente para obter dados suaves, não estava obtendo uma amostra muito completa dos valores de Perlin. Então, eu ajustaria minhas distribuições para o mapa na minha frente, recarregaria um novo mapa aleatório e obteria resultados muito diferentes.
Tentei resolver o problema dos rios / lagos produzindo água a partir de um terceiro conjunto de valores Perlin. Uma decisão binária de água / terra e, em seguida, aplique todas as coisas acima na terra. Isso torna drasticamente mais fácil controlar a distribuição de água (ainda não perfeita, mas melhor), mas introduz o problema de que existem muitas transições de biomas que não fazem sentido. Por exemplo, trechos inexplicáveis de deserto no meio de prados verdejantes, neve na praia etc. Também ainda é difícil controlar proporções de biomas terrestres, pelas razões mencionadas acima.
Observando os problemas acima, tentei um algoritmo mais simples que apenas mapeou o ruído Perlin para uma dimensão. Agora eu tenho uma variedade de tipos de terreno escalando de 0 = oceano profundo -> 1 = oceano raso -> 2 = praia ... -> N = neve. Enquanto isso gera ilhas e continentes e facilita o equilíbrio da proporção de cada terreno, os tipos de terreno são muito agrupados. Toda massa terrestre se parece com um mapa de elevação, geralmente sem tipos de terreno espalhados por sua superfície. Toda massa de terra tem aproximadamente as mesmas características, sempre na mesma ordem e sempre na mesma forma de anel.
fonte
Respostas:
Confira o excelente artigo de Amit Patel, que considero um recurso essencial para a geração procedural de terrenos ...
http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
O principal que ele faz é usar a estrutura gráfica para modelar seu terreno, e não mapas de ruído diretos (Perlin et al). Não vou incorporar as ilustrações dele, mas leio o artigo e acho que será útil fazê-lo pensar em uma abordagem diferente.
Se você estiver criando um jogo do tipo CIV / AOE, a colocação de recursos será importante. Você não pode ter recursos-chave muito raros ou recursos de alto valor muito comuns. Se você presume que cada polígono é uma zona com uma determinada característica (veja as ilustrações do artigo, isso fará mais sentido), eu poderia ver a atribuição de recursos a cada polígono com base em algum algoritmo de sua escolha. Você pode se tornar bastante inteligente, fazendo com que os recursos em um polígono sejam estatisticamente influenciados pelos vizinhos, de modo que uma floresta ao lado de um deserto possa ser rara, mas a floresta ao lado de pastagens seja mais comum, por exemplo.
fonte
Crio scripts de mapas aleatórios para o Age of Empires 2 . Meu mais recente é para a versão HD.
Se você deseja entender como criar mapas para o Age of Empires 2, existe este excelente guia para o RMS (Script de mapa aleatório) .
O Age of Empires usa um sistema especialista, permitindo que os scripts escrevam rotinas para as regras de geração, das quais você pode aprender muito. Quanto às regiões, imagino que seria simplesmente o caso de mascarar áreas e aplicar scripts / rotinas diferentes às áreas mascaradas de acordo. Você pode ver facilmente as regras de geração dos scripts de mapa existentes abrindo-os em um editor de texto. Eu escrevo o meu no bloco de notas
fonte