Por um longo tempo, uma das melhores maneiras de usar processadores poderosos para entretenimento foi o
Dwarf Fortress - um jogo no qual o mundo inteiro consiste em caracteres ASCII e que consome com prazer um gigabyte de memória e uma grande fração do tempo do processador.
Mas, diferentemente de outros jogos, no caso do
DF, a jogadora sente que realmente precisa de tudo o que precisa. Seus cálculos detalhados criam um mundo inteiro com edifícios, cidades, comerciantes, rios, vulcões, monstros e, é claro, gnomos. Se uma pessoa criou tudo isso, isso seria uma conquista fantástica;
Dwarf Fortress é um programa que cria todos esses objetos por conta própria.
O autor do jogo, Tarn Adams, concordou em responder às nossas perguntas sobre sua criação, que, apesar da existência de muitas imitações, ainda permanece um jogo completamente único.
Gamasutra: soubemos que o Dwarf Fortress está sendo lançado no Steam e itch.io em uma versão paga com uma interface simplificada. Eles dizem que isso se deve aos seus próximos custos de tratamento. É difícil para um desenvolvedor independente permanecer à tona?Adams: Sim, você deve fazer um grande esforço para não deixar o negócio, e quase todos os desenvolvedores são forçados a inventar maneiras criativas de pagar por aluguel de casas e outras necessidades primárias. E às vezes você se depara com problemas que não consegue lidar. Tivemos sorte até agora, mas temos que mudar com o tempo: sair e conseguir um novo emprego, mudar para Patreon e agora no Steam com coceira ou desenhar desenhos a lápis, o que está muito longe de criar videogames.
Como é a sua construção diária de código para o Dwarf Fortress ? Quais idiomas você usa? Quais bibliotecas? Quais IDEs se você os usar? Em que computador você está desenvolvendo o jogo?Trabalho em um laptop Toshiba comum e normal, com Windows 10. Escrevo código em uma terrível combinação de C / C ++ na Comunidade MSVC. Para a versão legada, eu uso o OpenGL, para a versão principal, SDL e para o som, o FMod. Não uso mais nada no Windows, com exceção de parte dos cabeçalhos do MSVC (e antes), que uso há décadas. Não estou completamente ciente do que está acontecendo nas versões Linux / Mac, porque não as desenvolvo regularmente.
O Dwarf Fortress está em desenvolvimento há quase 17 anos e sua base de códigos deve ter atingido proporções gigantescas. Na minha máquina, criar um mundo com configurações padrão requer mais de 1,2 gigabytes de RAM. O problema com esses megaprojetos é que eles se tornam muito grandes e não se encaixam inteiramente no cérebro. Quais estratégias você usa para manter o projeto inteligível e compreensível para o trabalho?Eu tenho um sistema de nomes rigoroso e não economizo nomes longos de variáveis e funções, para que tudo fique legível mesmo depois de alguns anos. Em geral, tento cuidar do futuro eu mesmo. Todos os meus comentários no código visam isso. Eu uso ativamente a função "localizar nos arquivos". Mas há situações em que eu novamente tenho que descobrir o que acontece, por exemplo, ao expandir o sistema antigo ou corrigir o bug; nesse caso, pode levar apenas uma hora ou mais para pesquisar. Isso me permite deixar comentários úteis adicionais sobre os quais não pensei inicialmente.
Lembro que Threetoe (parceiro de Tarn no desenvolvimento de jogos) escreve histórias e, em seguida, você tenta criar um mecanismo de jogo no qual elas possam acontecer. Ainda me parece que essa é uma maneira inspiradora de trabalhar. As histórias que você rejeitou foram muito complicadas de implementar? Já aconteceu que o enredo de um deles foi completamente repetido no jogo?De certa forma, acho que são todos muito complicados. Motivações de caráter, estabelecimento de metas etc. fique para trás como elas acontecem nas histórias. No entanto, esse ainda é um processo útil, porque sempre existem elementos mais leves para gerar histórico; Além disso, podemos abordar a mecânica básica dos personagens, mesmo que nunca a alcancemos.
A Wikipedia diz que o número da versão do jogo (agora 0,44) mostra a que distância você está da conclusão (44%). O que espera a Fortaleza dos Anões no futuro? Você tem algum pressentimento sobre o que vai acontecer? Que aspectos sérios você ainda tem para implementar?Estou terminando o lançamento com os vilões, que será lançado nos próximos meses. Ele deveria estar bem curioso. Em seguida, implementaremos os gráficos e aumentaremos a usabilidade do jogo para versões no Steam / coceira. Em seguida, melhoraremos o processo de cerco e faremos mais trabalhos, e depois passaremos para a Big Wait. Esta é a maior reestruturação e expansão da história do
DF . Isso nos permitirá gerar mitos sobre a criação e criar sistemas de magia totalmente procedimentais, além de abrir várias janelas para visualizar diferentes partes do mundo, etc. Este será um ótimo complemento. Depois, haverá uma liberação com propriedade / leis / costumes. Depois disso, o pedido ainda não foi determinado, mas trabalharemos na economia, navios e outros componentes importantes que ainda não estão disponíveis. Ainda temos muito o que fazer! Nem chegamos à metade da versão 1.0. Mas a versão 1.0, o desenvolvimento do jogo, na verdade não terminará ... talvez, no momento do seu lançamento, simplesmente não tenhamos muito tempo.
Nos jogos, há um equilíbrio entre enredo e simulação, entre uma história pré-escrita que está na maioria dos jogos e a criação de um mundo profundo com um conjunto de regras que permitem que muitas histórias diferentes surjam. Eu diria que Dwarf Fortress é um dos argumentos mais sérios a favor da simulação. Os personagens na fase de geração do mundo ou durante o jogo fazem algo que até surpreende você? Você pode dar exemplos interessantes / cativantes?Sim, isso acontece o tempo todo! Isso se deve em parte ao fato de que quando você joga, é difícil manter todas as regras em mente. No entanto, todas as minhas histórias memoráveis são bugs, porque raramente tenho a oportunidade de jogar o jogo por um tempo suficiente, portanto, do ponto de vista da jogabilidade que ocorre independentemente, elas são de pouco interesse (mesmo que me surpreendam). Boas histórias podem ser encontradas em fóruns, streamers e assim por diante.
A fronteira entre micro e macro: por que você fez assim, entre o que os gnomos podem fazer eles mesmos e o que o jogador ordena que as fortalezas façam?Esse é um equilíbrio difícil, e nem sempre é fácil de observar, mas no momento o conceito é que o jogador é o "porta-voz oficial da vontade da fortaleza" e os anões exibem autonomia, que deve estar presente fora de suas funções oficiais. Isso permite que eles sejam atores de suas próprias histórias, que são a principal fonte da narrativa emergente (emergente). Ao mesmo tempo, o jogador deve ser capaz de controlar o fluxo principal de sua parte do jogo (na verdade, isso não é crítico, mas geralmente é mais interessante do que observar a simulação).
Esses dois objetivos podem entrar em conflito, e isso geralmente ocorre porque o jogador continua gostando do jogo - por exemplo, se a alavanca de emergência realmente precisar ser abaixada, o sistema de prioridade de tarefas pode praticamente fazer o gnomo fazer isso de forma autônoma ou não, dependendo da situação. se ele deveria "saber" sobre isso ou não. No passado, tivemos problemas em adicionar muita burocracia quando, por exemplo, tínhamos um anão intendente envolvido na entrega de equipamentos. Mas esse sistema era muito lento, propenso a erros e jogadores confusos. É muito importante pensar em como cada mecânica de jogo individual pode adicionar histórias em potencial, e o intendente quase não teve nenhum papel nisso.
Quais são as etapas do programa para construir o mundo?Ela aloca memória para o cartão. Em seguida, ela escolhe qual polo terá (por exemplo, norte, sul) (ou leva em consideração os parâmetros passados pelo jogador). O Seed do gerador de números aleatórios define os valores básicos dos campos do mapa (altitude, precipitação, temperatura, drenagem, atividade vulcânica, vida selvagem) para uma grade de tamanho variável, levando em consideração vários parâmetros (oceanos, tamanhos de ilhas, outras variabilidades) e, em seguida, o programa os preenche fracamente. A mudança de temperatura depende dos pólos e o programa seleciona pontos para os picos mais altos. Aqui, ela faz a primeira passagem para ver como o processo é executado e tenta alterar as alturas para que o mapa caiba nos parâmetros desejados. Nesse estágio, se o mundo não pode ser corrigido, ele é descartado e tudo começa de novo.
Em seguida, o primeiro campo derivado é definido - vegetação - dependendo da altura, quantidade de precipitação, temperatura, etc. O programa verifica se os biomas correspondem aos intervalos especificados nos parâmetros. Nesta fase, as alturas do nível médio são suavizadas para criar áreas mais planas, e os vulcões são colocados de acordo com o campo de atividade vulcânica.
Em seguida, passamos ao estágio de erosão e rio. Pequenos oceanos são drenados, o programa encontra as bordas das encostas das montanhas a partir das quais pode executar rios de teste. Além disso, ela tem uma câmera em um deles para que o jogador possa acompanhar o processo. Muitos rios falsos fluem desses pontos, quebrando canais, se não conseguem encontrar um caminho para o mar. Às vezes, alturas muito altas são achatadas para que o mapa inteiro não se transforme em desfiladeiros. Idealmente, seria necessário usar tipos de substâncias minerais para isso, mas até agora não as estamos usando. Lagos são cultivados em vários pontos nos rios.

As alturas são novamente suavizadas das montanhas até o mar, e para picos e vulcões são feitos ajustes locais. Após a conclusão da criação das alturas, o programa faz ajustes na quantidade de precipitação com base nas sombras da chuva e nas regiões montanhosas. Com base na altura e precipitação, bem como no efeito restritivo das florestas, as temperaturas são redefinidas, após o que o programa usa os novos valores para finalmente definir o nível da vegetação. Os valores de salinidade são definidos para o oceano e seus azulejos vizinhos.
Tendo decidido tudo isso, agora podemos encontrar os limites das áreas finais dos biomas para dar-lhes nomes e personalidade. Aqui também adicionamos camadas geológicas e subterrâneas, embora, como mencionado acima, as informações geológicas devam ter sido adicionadas anteriormente. Em seguida, o processo final de verificação para conformidade com os parâmetros é realizado para garantir que não fiquemos muito desviados do que o jogador deseja. Depois de concluído, o programa gera as populações iniciais do mundo animal para cada região e define as variáveis climáticas.
A história em si começa a partir deste momento. Então civilizações e cavernas são localizadas. É bastante difícil explicar o que acontece a seguir, mas a idéia principal é que um grande jogo estratégico seja simulado com zero jogadores com regras de movimentos bastante arbitrárias e IA fraca (mas com milhares de agentes), com base na história escrita. A geração procedural de histórias usando o log de simulação é uma abordagem totalmente funcional, mas também tem suas desvantagens. Como é uma grande quantidade de trabalho, é necessário executar o pós-processamento e o estudo para encontrar bons pontos que você deseja enfatizar e, se a dinâmica e os mecanismos não forem suficientes, o resultado poderá ser entediante.
O que eu mais gosto no DF é que o jogo não contém nenhum sistema explícito de pontos de vida, tudo relacionado à força e dano do personagem faz parte de um modelo complexo de partes do corpo. Quais são as vantagens de tal sistema? Se alguém decide criar algo semelhante, que obstáculos eles podem esperar?Esse modelo cria momentos de plotagem mais detalhados, consequências a longo prazo e fornece maior conectividade ao sistema. É fácil ir longe demais, e realmente fomos longe demais em alguns lugares, pelo menos no estágio atual - algumas propriedades dos materiais não são usadas em nenhum outro lugar. Além disso, existem maneiras de mitigar o sistema, exemplos dos quais podem ser vistos em jogos em que, por exemplo, existe um conjunto comum de velocidade do obturador / energia / pontos de vida, mas feridas específicas surgem como resultado de acertos críticos ou como consequências de atingir valores zero ou próximos a zero no pool. A escolha correta do sistema depende do jogo. Nós nos esforçamos para usar os números o mínimo possível, porque os números geralmente não se encaixam bem nas histórias.
Como é o loop do jogo principal?Tomemos, por exemplo, o modo gnomo. Começa verificando anúncios e lendo salvamentos automáticos etc. A maior parte do restante do ciclo não ocorre em todas as medidas. Por exemplo, após cada cem relógios, o programa verifica as tarefas atribuídas e os "modos estranhos". Os exércitos se movem pelo mapa do mundo. Após cada cem relógios, o programa processa as tarefas atribuídas aos anões. Esse é um tipo de leilão invisível usado para gerenciar diferentes prioridades conflitantes. A cada dez tiques, as estações mudam, o que afeta o clima e o mapa (localmente e ao redor do mundo), além de verificar o desenvolvimento dos elementos da trama (diplomatas, cercos etc.) e verificar se o forte ainda está vivo.
Em seguida, o programa assume o que é feito em cada medida. O movimento dos líquidos e outras informações dos blocos do mapa são alterados (no entanto, existem várias otimizações para que cada bloco não seja necessariamente verificado em cada movimento; além disso, existem sinalizadores que permitem ignorar áreas inteiras do mapa, se nada acontecer.) O movimento dos predadores é atualizado e processado outros "eventos" do mapa, por exemplo, incêndios ativos.
Se a bandeira estiver marcada, os gnomos feridos / com sede / famintos que não podem cuidar de si mesmos receberão uma atualização. Os gnomos mortos “pensam” em seus rituais funerários, para que essas tarefas possam ser atribuídas a outros. Os seres fechados em células e cadeias atualizam periodicamente seus pensamentos e situações.
Então, se as criaturas cruzarem as bordas do mapa, elas serão removidas.
A cada cinquenta medidas, as informações de todas as tabernas, templos, bibliotecas etc., dependendo de outras medidas, são atualizadas. Os suprimentos, também dependentes de outras medidas, funcionam da mesma forma. Da mesma forma, a criação de tarefas para armazenamento. Apesar de esse processo ser complementado por várias otimizações, ele ainda é bastante lento e, em um determinado momento, mais de 50 mil pedras podem causar problemas.
A cada mil medidas, os objetos marcados para exclusão do jogo são realmente excluídos e a memória alocada para eles é liberada. Isso acontece com mais freqüência com objetos, uma vez a cada cinquenta medidas, além de verificar o uso de edifícios (basicamente, são atualizações para poços e algumas outras sinalizações que precisam ser verificadas com frequência).
Em seguida, realizamos outra atualização que funciona em todas as medidas. Os projéteis disparados da arma são removidos. As ações (do treinamento de dança e artes marciais à narração de histórias) são atualizadas conforme necessário. Anões e outras criaturas tomam decisões e executam suas ações instantâneas (movendo-se para um bloco vizinho, trabalhando em uma oficina etc.) - a parte principal de sua IA (exceto para escolher tarefas) é realizada aqui.
Cada cem medidas estragam itens. Todas as medidas de crescimento da vegetação são executadas (embora existam muitas dependências e sinalizadores). Se necessário, o estado dos edifícios é atualizado em cada medida e os troles são movidos. Avanço nas rotas de transporte. A temperatura é atualizada (há muitos sinalizadores de otimização aqui, mas até agora esse processo ainda é bastante lento).
Finalmente, a câmera é atualizada seguindo a criatura que o jogador está assistindo.
O Dwarf Fortress usa um mapa de blocos baseado em grade para representar o mundo, uma maneira simples e eficiente de representá-lo. Percebi que existem muitas maneiras de desenhar ladrilhos, e isso depende do que a criatura faz ou como se sente, quantos elementos existem no ladrilho, se há algo acima dele, se o ladrilho está fluindo água ou está enterrado sob uma pedra. Quando o DF decide como exibir o bloco, o que ele faz? Como você otimizou esse processo?É apenas um símbolo (byte) com mais alguns bytes de cor, para que o sistema não seja caro e podemos substituir a solução selecionada antes de exibi-la na tela, e não tentar resolver tudo ao mesmo tempo e, para a maioria dos ladrilhos, apenas um símbolo de terra / parede ainda é suficiente. O programa é executado de baixo para cima, em certo sentido, usando a "altura" (as criaturas estão acima dos objetos, os objetos estão acima da terra), alterando a decisão de tempos em tempos. No entanto, apesar da presença de vários sinalizadores e matrizes auxiliares, muito mais pode ser feito. Há uma pequena variedade de unidades possíveis que podem ser exibidas em cada bloco, para que o programa possa implementar uma animação quadro a quadro que permite ver cada elemento no bloco, mesmo quando o jogo está em pausa.