Este é um guia extenso e detalhado de configuração ou depuração de IA de unidades em The Hand of Merlin, escrito por seu designer de jogos Mat.
Introdução
Neste guia, gostaria de orientá-lo na criação de uma IA, que pode fazer uma unidade inimiga usar suas habilidades por conta própria, contra seu bando de guerra.
Como a IA funciona em The Hand of Merlin?
Nossos programadores optaram por usar o paradigma Utility AI. Isso significa, em termos simples, que para cada habilidade que deixarmos nossa IA considerar, ela tentará classificar o valor de “utilidade” de sua conjuração em cada peça que puder conjurar e, em seguida, comparar todas as opções, escolhendo aquela com a maior valor de utilidade. É uma ótima maneira de considerar várias opções ao mesmo tempo.
Especificamente no nosso caso, cada “Classe de Unidade” tem seu próprio “Cérebro”, onde descreveremos as opções e as perguntas que a IA faz para cada bloco de destino.
Se isso ainda não ficou claro, não se preocupe, vamos passo a passo.
Cérebros Unitários
Em primeiro lugar, devemos criar um Cérebro. Uma ótima maneira de fazer isso é através do Criar Menu (CTRL+N)e, em seguida, selecionando Generic -> (merlin) parâmetros cerebrais de IA.
Alternativamente, se você já tem um arquivo Unit Class, você pode criar um novo Brain diretamente nesse arquivo e abri-lo separadamente.
De qualquer forma, o resultado é um arquivo Brain em branco, como este:
Certifique-se de salvar esse filhote (usamos a pasta Content\Merlin\AI\UnitBrains).
Observe que não há muita coisa acontecendo aqui, pois ainda temos que preencher as Considerações de Habilidade, mas já existe algo chamado Prioridade da unidade. Vou aproveitar esta oportunidade para explicar o que é Prioridade.
É, bem, nosso valor de “Utilidade” para cada ação. Durante um turno inimigo, já que nosso jogo usa Side Initiative, todas as ações possíveis de todas as unidades possíveis serão classificadas de acordo com a prioridade de sua prioridade e serão jogadas nessa ordem, desde que haja habilidades disponíveis. Como veremos em breve, as considerações de Habilidade são os levantadores de peso aqui, mas se você quiser que uma unidade jogue consistentemente primeiro ou por último, você pode querer jogar com o Prioridade da unidade, pois isso multiplicará a prioridade/utilidade de tudo o que esse cérebro específico calcula.
Para um exemplo de como isso funciona, Behemoth tem prioridade 3, e o Bruxo (Apoio bandido) tem 0.5. Isso geralmente faz com que o Behemoth jogue primeiro e o bruxo depois de todas as outras unidades.
Conjuntos de consideração
Agora, vamos olhar para o Conjuntos de consideração de habilidade. Aqui, você deve ter pelo menos uma para cada habilidade que a unidade possui, mas algumas habilidades (como Correr!) podem ter várias entradas.
Pense em cada conjunto de considerações como uma pergunta que sua IA pode fazer. No exemplo abaixo, “Se vou usar Atirar, como devo usá-lo e é mais importante do que outras habilidades?”
Cada consideração tem 4 propriedades:
- A O rótulo é apenas para uso interno. Ajuda a identificá-los de longe e será útil quando falarmos sobre depuração. É como um nome para esse conjunto.
- A Capacidade é onde você lista a habilidade em relação a isso. Se a habilidade não estiver habilitada por qualquer motivo (a unidade não a possui, está em cooldown ou precisa de mais AP do que a unidade possui atualmente), este conjunto não será acionado.
- Você tem um Prioridade para associar com a habilidade, que é modulada pela Prioridade da Unidade e o …
- Decision Maker, que é o cálculo real que a IA faz com essa capacidade para cada peça possível. Observe como ele realmente é um tipo de arquivo por conta própria, portanto, é uma peça modular.
Tomadores de decisão e pontuadores
Encontrado no Conteúdo/Merlin/IA/Comportamentos pasta, e sempre nomeado com um prefixo `Behavior_`, estes são os blocos de construção da IA. Tecnicamente, você pode misturar e combinar entre eles, mas eu recomendo criar seus próprios tomadores de decisão, especialmente se você tiver um padrão comportamental específico em mente.
Cada Decisor nada mais é do que uma combinação de Artilheiros, que pegam a prioridade da habilidade e a multiplicam por algum valor. Na imagem acima, você pode ver que o Behavior_OverwatchDefensivo tomador de decisão, associado à Mandrake's Preparar Tiro habilidade, tem 3 marcadores:
- Gate_NoOverwatchAlly, que define a prioridade para 0 se houver um aliado de Mandrake que já esteja preparando um tiro;
- Gate_CanHitRangedQualquer um, que definirá a prioridade para 0 se a unidade não conseguir encontrar um alvo para acertar (ou seja, nunca usará overwatch se não houver ninguém no alcance, provavelmente preferindo apenas caminhar)
- Pontuação_DefensiveRating, o que torna a prioridade menor se o tile atual estiver um pouco aberto demais, fazendo com que o Mandrake prefira usar o Prepare Shot apenas se estiver atrás da cobertura (falaremos mais sobre a classificação defensiva em um segundo, não se preocupe).
Observe como eles têm uma convenção de nomenclatura específica. Todos esses artilheiros, encontrados em Conteúdo/Merlin/AI/Considerações, tem um dos três sufixos: Portões pode definir uma prioridade para 0 ou 1, quase como um booleano. Contagem tendem a ser mais sutis, variando de 0 a 1, e Bônus só pode ter 1+ valores, tornando algo MAIS provável. No entanto, essas são apenas minhas convenções pessoais, e você pode se sentir à vontade para nomeá-las como preferir.
Para mergulhar um pouco mais fundo, vamos dar uma olhada em como Gate_NoOverwatch aliado obras:
Em primeiro lugar, é do tipo “Tem efeito de status”, que é uma espécie de categoria de pergunta. Listaremos todas as perguntas e suas propriedades básicas em um segundo. Então, temos que qualificar a pergunta. “Quem” tem efeito de status “qual”. O “Quem” aqui é o Unidades de Interesse. Posso configurá-lo para procurar todos os tipos de unidades, como aquelas dentro de uma área, aquelas com um índice de saúde específico, aquelas com relações específicas, etc.
Neste caso, estamos procurando por todos os aliados, então colocamos Todas as unidades no grupo de unidades, e aplicamos o filtro de relação, com o amigo filtro.
Então, qual efeito de status? Poderíamos usar uma categoria (positivo/negativo/marcador/oculto), mas para este caso, eu só queria saber quem tem o efeito de status `Overwatch.rsc`. E aí vai.
Assim, o Resposta a esta pergunta haverá um número de unidades que são minhas aliadas que também têm o efeito de status listado. Isso será plotado como o valor X na entrada do gráfico.
Para conferir este gráfico de uma forma mais visual, sugiro clicar no botão do gráfico, aqui
O que concede a você esse visual aqui:
Como dissemos, o eixo X é a “resposta” à pergunta da consideração. O eixo Y, no entanto, é o que decidirmos que deve multiplicar o Prioridade dado um valor X. No exemplo acima, se o X for 0 (não há aliados com o efeito de status de Overwatch), multiplicaremos a prioridade por 1. Se, no entanto, houver 1 ou mais aliados com o efeito de status, multiplicamos a prioridade por 0, cancelando toda a operação – Mandrake não usar Preparar Tiro.
Daí o nome – é um Portão para ver se há aliados com o Overwatch efeito!
Todos os Marcadores funcionam da mesma forma, fornecendo um X para você decidir qual deve ser o Y. Aqui está um rápido resumo de todos os tipos, para que você saiba o que procurar. A propósito, as perguntas que são “Sim/não” resultam em 1 para sim, 0 para não, como esperado.
Observe que Classificação ofensiva e Classificação defensiva ficam por último, pois são um pouco especiais.
Tipos de portão
- Contagem de unidades na área de elenco no alvo: “Se eu apontar uma habilidade para um bloco específico, quais unidades a área alvo dessa habilidade encontrará lá?” Ótimo para verificar a eficácia do AoE.
- Número de unidades interessantes: “Quantas unidades existem deste tipo?” Uma maneira mais genérica de pesquisar unidades. Talvez o seu comportamento seja diferente se a sua unidade for a última de pé?
- Chance de acerto: “qual a probabilidade de uma habilidade atingir um alvo específico?”. A maioria das unidades de longo alcance evitarão atirar contra alvos em cobertura!
- Custo AP para usar esta habilidade: “quanto custa esta habilidade se eu alvejar esta peça?” Útil se sua habilidade pode ser escalonada em AP, como Run.
- Distância mínima de caminhada do bloco de destino: “A partir do bloco de destino, qual é a distância mínima para uma unidade de interesse?” Isso é útil para habilidades de movimento, para manter outras unidades a uma distância razoável. Cockatrices usam isso para se aproximar de aliados, por exemplo.
- Distância mínima de caminhada até o bloco de destino: "A partir daqui estou, a que distância está o meu bloco de destino?" Isso funciona bem se sua unidade quiser minimizar/maximizar a distância de viagem. Redcaps adoram andar pelas unidades, e é isso que você usa para isso.
- Distância Aérea: Funciona exatamente como Walk Distance, mas não considera covers e outros bloqueadores de movimento. É uma linha reta e usa bem as diagonais. Melhor para testes de “proximidade”, como a preferência de Mandrake de atirar em unidades próximas.
- Alvo Único X Percentual/Valor: “Nesta peça alvo, se houver uma unidade, quanta Armadura/Saúde/Vida ela tem?” Aqui, Vida significa adicionar Saúde e Armadura. Esta é uma boa se seus inimigos preferem alvos feridos, ou se eles têm habilidades de destruição de armaduras, eles podem preferir inimigos com armaduras mais altas! Porcentagem coloca em uma proporção de 0-1, e Amount fornece o valor fixo.
- Tem Efeito de Status: “Minhas unidades de interesse têm um efeito de status?” Nós falamos sobre isso antes, mas funciona bem para comportamentos mais complexos se você usar efeitos de status ocultos!
- Contagem de pilha de efeito de status: “Quantas pilhas do efeito de status eles têm?” Nós não usamos este, mas funcionaria bem para alguns efeitos do tipo “raiva”, certo?
- O Caster pode ativar a habilidade?: “Posso usar essa outra habilidade?” Bom para verificar se sua habilidade está fora do tempo de recarga antes de fazer algo. Nosso bandido Ladino verifica se sua habilidade Shiv está limpa antes de fechar o Sprint, por exemplo.
- Turno Tipo de Caster: “Que tipo de curva é essa?” Espero que o X seja autoexplicativo aqui. Isso lhe dá um resultado diferente se este for o turno em que a unidade foi revelada, ou se for uma reação, como as concedidas pelo Redcap's Watchful.
- Consulta de quadro-negro: “Que informações existem sobre o uso de habilidades?” isso permite que você consulte quais habilidades foram usadas recentemente. Vai ajudá-lo a resolver combos e ações semelhantes!
- Pontos de Ação do Conjurador: “quantos Pontos de Ação eu tenho?” Se você preferir fazer algumas ações em uma contagem de pontos de ação específica, isso é para você!
- Classificação defensiva: “Quão seguro é o bloco de destino?” Isso é interessante. A IA tenta estimar o quão defendido um tile está considerando todos os inimigos e seus alcances. Ter essa consideração associada à sua habilidade de movimento torna os inimigos mais cuidadosos e favorece as coberturas, dependendo de como você define seu gráfico. E sim – a IA pode até ver a classe de cada inimigo e não se importa em se proteger contra guerreiros!
- Classificação ofensiva: “Quão bom tiro eu tenho em meus inimigos do bloco de alvo?” Isso permite que a unidade classifique quantos inimigos ela pode atingir do bloco de destino. X mais alto em ladrilhos onde vários inimigos podem ser atingidos sem cobertura - adicione isso para obter um melhor comportamento de flanco!
A combinação desses dois últimos pode fazer maravilhas pela “personalidade” da sua IA. Trabalhe um bom gráfico para equilibrar entre “jogo defensivo” e “jogo ofensivo!
Anote: se seu capacidade de movimento determinar que a peça atual é a melhor peça possível, a unidade apenas permanecerá no lugar e passará um turno.
depuração
Pequena nota de despedida, para ajudar no seu teste. Quando você está mexendo com novos inimigos em seus testes, há um Comando de console que podem fornecer algumas informações sobre o resultado final de suas consultas.
Para usá-lo, quando estiver executando uma simulação, pressione o botão til chave e tipo
hom_dbg_bEnableAIDebugging = 1
Isso fará com que, quando a IA começar a considerar seu primeiro turno, imprima na tela todas as ações com prioridade final > 0. Quando terminar, defina a mesma variável para 0.
Com isso, posso ver que ele poderia ter usado Ooze Run, Gaze, Corrupt e Far Run, mas Gaze não sairá por um deslizamento de terra, também notado pela linha amarela vermelha. Basta clicar com o botão direito para percorrer o processo de cada ação e você verá como sua configuração acabou funcionando!
Ai está! Vá em frente e divirta-se criando novos cérebros para suas unidades!
Isso é tudo o que estamos compartilhando hoje para isso A Mão de Merlin guia. Este guia foi originalmente criado e escrito por Mibs. Caso não consigamos atualizar este guia, você pode encontrar a atualização mais recente seguindo este link.