O Dwarf Fortress não é de código aberto e, embora exista muita conjectura e engenharia reversa que possam ajudar no funcionamento de tudo isso, vou me concentrar em algumas técnicas básicas para otimizar um roguelike 3D (não gráficos 3D, mundo 3D) do mesmo tipo.
Como é o caso de todos os videogames, há muita fumaça e espelhos que estão criando a ilusão de complexidade a partir de regras e sistemas simples. Eles variam desde o uso de números aleatórios simples para movimentos sem objetivo até a pré-montagem de uma malha de alto nível de nós para busca de caminhos.
Movimento
Falando em busca de caminhos, esse pode ser um problema muito difícil de resolver para grandes espaços, como um mapa DF (até 768x768x64 IIRC). No entanto, o problema pode ser simplificado e acelerado das seguintes maneiras:
- Rede de nós pré-cozidos: Quando o mapa é criado, o mundo pode ser dividido em partes, e cada parte pode ter suas saídas e entradas mapeadas. Quando um pedaço é atualizado, como quando um muro é construído, apenas a rede desse pedaço precisa ser atualizada.
- Localização de caminho em etapas: a execução de um caminho em todo o mapa, célula por célula, levaria muito tempo; em vez disso, você encontraria a rede de chunk maior, que mapeia toda a conexão entre os chunks e, em seguida, executa apenas um caminho intra-chunk quando movendo-se de pedaço para pedaço. Isso faz duas coisas para você. Ele acelera a localização do caminho, dividindo-o em várias partes menores, e também permite que a unidade mude a direção parcialmente ao longo do caminho quando um pedaço é atualizado. Seria redirecionado pela rede grande se qualquer um dos nós necessários para a atualização cruzada.
- Direção aleatória: quando não se move para uma meta, a unidade precisa apenas andar sem rumo. Muitos roguelikes apenas movem a unidade em uma direção aleatória, o que não é natural. Várias técnicas de direção podem ser usadas, as simples são favoráveis ao movimento em linha reta e têm menos e menos chance de se mover nas direções que irradiam para trás, o que teria apenas cerca de 1% de chance. Portanto, a unidade algumas vezes revertia completamente a direção, mas apenas raramente.
Não abordarei o básico da busca de caminhos. A maioria dos roguelikes usa A *, mas existem outros métodos para esfolar o gato. Mmmm couro de gato ..
Tarefas pessoais
Uma das principais coisas que faz as unidades do DF aparecerem e se sentirem vivos é a sua lista de objetivos pessoais. Na verdade, muitos jogos roguelike têm isso em um nível básico. Essencialmente, cada unidade tem uma lista de desejos (e para os seus filhos, tarefas que eles podem escolher que você está pedindo que sejam feitas) e eles escolherão com base na personalidade deles (estatísticas).
Algumas tarefas têm requisitos. Para fazer uma saia de couro, o dorf deve estar em uma loja com itens X. Então, todos esses são verificados e adicionados como tarefas à sua lista. Simples assim.
Como na maioria das vezes uma unidade estará em trânsito, as verificações do que as unidades estão fazendo podem ser muito rápidas, apenas algumas unidades farão uma escolha a qualquer momento e, portanto, no geral, não há desaceleração nem para centenas ou milhares de unidades. E lembre-se, no DF, de abelhas a trogloditas e árvores, são unidades.
Ao fazer algumas pesquisas adicionais, fica claro que, hilariamente, o DF está fazendo um trabalho terrível de busca de caminhos em geral. Não está dividindo o mapa em partes, está dividindo o mapa em segmentos ou áreas conectadas (o que é melhor do que nada, com certeza); portanto, minha avaliação acima é ainda menos um exemplo de como o DF funciona do que eu pensava. :) O que não quer dizer que o DF seja nada menos que incrível por um milhão de outras razões.
Isso mostra que o que é importante em um jogo é o jogo. Nem gráficos, nem boa programação, nem boa escrita, nem boa música, nem mesmo a interface; nada mais é 1% tão importante quanto o próprio jogo.