O que é uma máquina de estado finito da IA ​​do inimigo Berserker convincente para um Roguelike

7

Estou procurando uma maneira de criar um inimigo Berserker convincente em um Roguelike que venho criando há algum tempo. Você pode assumir um jogo como o NetHack para isso ao considerar que tipos de ações podem ser executadas e mensagens de texto que podem ser alertadas.

Peço isso por duas razões:

  1. Estou tentando resolver esse problema há mais de um ano e falhei. Exemplos a seguir.
  2. Vejo uma falta geral de exemplos nesta SE que mostram como é o mapeamento dos estados de uma entidade. Seria útil para a comunidade ter esse exemplo.

O que eu preciso:

Quando digo Berserker, refiro-me a um inimigo que pode entrar em uma fúria cega e atacar outras entidades com as quais está em conflito com a violência e a sede de sangue. Não basta mudar para atacar alvos aleatoriamente, como é feito em muitos RPGs. Para esse fim, fique à vontade para assumir a adição de quaisquer efeitos ou buffs de status que desejar. Apenas certifique-se de detalhar as informações pertinentes para esses estados.

Uma entidade furiosa precisa expressar sua raiva de uma maneira que não seja simplesmente uma mudança de status com alguns aumentos de força. Esta é uma solução muito superficial para o problema. A entidade não acaba se sentindo um Berserker.

O que eu tentei:

Eu tentei três idéias diferentes ao longo do ano passado. E nenhum deles satisfaz. Uma solução para o problema pode ser totalmente nova ou uma 'correção' para um deles. Estou incluindo-os principalmente para que os sucos fluam.

  1. A primeira coisa que tentei foi um simples estado de Berserk que aumentou a força da entidade, selecionou seu alvo aleatoriamente (da lista de inimigos), fazendo-o gritar obscenidades, etc. Uma vez nesse estado, o inimigo permaneceria nele até a morte.
  2. A próxima coisa que tentei foi realmente uma modificação do exposto acima. O inimigo se sentia muito achatado, e não havia como acalmá-lo ou derrubá-lo de sua raiva que parecia irrealista. Eu adicionei a capacidade de acalmar (com um feitiço e outros efeitos) e também uma condição que retornaria o inimigo a um estado normal, do qual ele poderia fazer a transição para outros, como fugir. Isso criou mais profundidade, mas fez o estado Berserker parecer ainda mais superficial e menos destrutivo.
  3. A partir daqui, raspei tudo e tentei algo mais emergente. Essencialmente, um lustre que o inimigo poderia lançar sobre si mesmo com base em um estado de transição. Uma vez lançado, isso mudaria o comportamento dos inimigos (para mirar) e aumentaria o dano deles enquanto lançava insultos ao inimigo aleatoriamente. Então, ele poderia entrar em qualquer outro estado e ficar furioso. Para que ele possa fugir, mas ainda provocar. Ele pode curar, mas ainda fica enfurecido e causa muitos danos. Isso é melhor, mas a questão subjacente ainda permanece. Ele realmente não parece irritado, apenas chateado. Principalmente porque você normalmente encontra o inimigo sozinho, e não com outros inimigos de quem o berserker não gosta, então o aspecto da randomização é menosprezado.

De que outra forma posso fazer o cara parecer Berserked, e não apenas chateado / com a boca suja?


Sei que essa é uma pergunta de lista limítrofe. Por isso, imponho esses requisitos: deve ser uma resposta completa muito detalhada que mostre todos os estados e condições para a transição. E deve ser mais do que um palpite. Você deve testar isso do seu jeito, ou então deve ser óbvio por que essa é a provável 'melhor' solução para transmitir a ideia do status de Berserk.

Também não vou me ofender se isso estiver fechado. Eu percebi que dança na borda.

DampeS8N
fonte

Respostas:

7

Psicologia Berserker

  • Ele está chateado / agressivo. (Portanto, ele precisa de uma razão e um alvo para ficar chateado.)
  • Quando ele está chateado, ele fica mais perigoso (além disso, se ele não está mais chateado, ele volta ao normal.)

Trigger - A razão pela qual ele enlouquece

  • Ele é insultado
  • Ele se machuca (ou, mais interessante, ele se machuca uma certa quantidade crítica)

Efeito

  • Ele fica mais forte
  • Ele fica mais rápido
  • Ele ganha mais saúde
  • Ele começa a gritar insultos
  • Ele começa a seguir a pessoa que causou o dano

Defesa do Jogador

  • Jogador pode matar o furioso
  • Dano ambiental mata o furioso (leva-o para uma armadilha)
  • O jogador pode diminuir a velocidade do furioso
  • Outro NPC / Jogador / Inimigo machuca o berserk crítico -> berserk segue agora o novo alvo
  • Com o tempo, o furioso se acalma (se ele não for atingido novamente)

Como isso funcionaria

O jogador encontra o inimigo. a) O jogador causa um pequeno dano várias vezes (o inimigo revida, mas não fica furioso), b) O jogador causa um grande dano, o inimigo perde muita saúde, mas fica furioso. O jogador agora deve fugir. Enquanto foge, ele pode: a) causar mais danos; b) desacelerar o furioso. Se a) o inimigo permanece furioso ou morre. Se b) o inimigo se acalmar (diminuí-lo, não causa dano crítico). Quando ele se acalmar, você poderá atacá-lo novamente de forma crítica. Talvez ele morra agora :-)

Nota: Se você não concordar com a minha afirmação, de que o furioso ataca o alvo que o machucou, você pode mudar isso para que o furioso atinja o personagem mais próximo . Isso seria interessante se ele fosse atacado à distância. (Para um lutador de espadas, seria o mesmo.)

Fabian
fonte
4
Algumas idéias mais possíveis: 1. Faça o berserker atacar seu alvo e qualquer pessoa entre ele e o alvo . Ainda melhor se você puder fazer com que outros inimigos percebam isso e se afastem do caminho. 2. Ataques perdidos, ou ver outros do seu lado mortos, também podem servir como gatilhos. Então, dois bárbaros o atacam: você mata um, e o outro enlouquece. 3. Perca a boca suja. Um único grito quando o modo furioso é acionado provavelmente está OK, mas depois disso eu imaginaria que ele se concentrasse demais em atacar para se preocupar em falar. Talvez adicione um grito de ataque simples (por exemplo, "Die!") Quando ele atingir uma distância corpo a corpo.
Ilmari Karonen
@IlmariKaronen Gosto dessas notas. Especialmente o número 1. Parece que alguém de um grande grupo perde sua porcaria e todo mundo corre para se esconder. Que gritos estão ficando furiosos comigo. A resposta em si aqui é um começo muito bom, mas não tenho certeza de que ela se sinta sozinha e adoraria ver algumas notas sobre os outros estados para os quais você faria a transição. Muito do que faz uma boa IA parecer viva é como as entidades fazem a transição e o que fazem. Simplesmente, passar da virada para a luta normalmente é um pouco chocante.
DampeS8N
Eu acho que o mais importante é que você precisa de uma animação que suporte o estado de berserk do personagem (ele fica com a cabeça vermelha, fica maior, etc.). O feedback visual é muito mais importante que o comportamento da IA ​​na transmissão do estado emocional de um personagem.
Fabian
Os estados da IA ​​seriam: Calm -> GettingAngry (uma animação && causa algum dano a todos os objetos próximos) -> Attack / Chase -> BeingExhausted (ele é especialmente vulnerável) -> Calm
Fabian
@Fabian Isso dependeria da integridade visual dos roguelike. Nesse caso, estamos falando de glifos de texto. Então, o melhor que pude fazer é um personagem vermelho / piscando. É por isso que esse problema é difícil, porque eu realmente não tenho nada além de um comportamento para induzir o jogador sobre o que está acontecendo. Posso rotulá-los na inspeção como furiosos, mas que significado isso trará? Ações falam mais alto.
DampeS8N
7

Suponho que a resposta dependa exatamente do que você considera um "berserker".

Os Berserkers históricos eram tropas de choque que concentravam sua atenção em envolver e matar seus oponentes com pouco respeito a qualquer outra coisa, incluindo sua própria segurança ou a dos outros do seu lado. Fontes diferentes discordam de quão indiscriminadas elas foram na matança: algumas as descrevem como matando voluntariamente qualquer pessoa e todos ao seu redor, enquanto outras apenas as descrevem como guerreiros destemidos. Aqui está uma citação do meio da estrada da saga Ynglinga , via Wikipedia:

"Os homens de (Odin) avançaram sem armadura, eram tão loucos quanto cachorros ou lobos, mordiam seus escudos e eram fortes como ursos ou bois selvagens, e matavam pessoas em um golpe, mas nem fogo nem ferro lhes diziam. chamado Berserkergang . "

Então, minha concepção de berserker seria algo assim:

  • Completamente destemido , provavelmente alheio à dor. Dispostos a enfrentar inimigos de qualquer nível.
  • Altamente focado na luta, com exclusão de qualquer outra coisa acontecendo ao seu redor.
  • Não é completamente indiscriminado em matar, mas provavelmente está disposto a atacar amistosos (talvez sem perceber) se eles atrapalharem. Também pode atacar amistosos se não houver inimigos por perto, mas ainda assim preferir alvos inimigos, se houver algum.
  • Desdém das táticas sutis ou cautelosas: atacar o inimigo e cortá-lo em pedaços é o nome do jogo aqui. Prefere o combate mêlée, mas pode usar armas de longo alcance suficientemente poderosas (como armas, de preferência no modo automático e disparadas enquanto corre em direção ao inimigo), se disponível.
  • Anormalmente forte e resistente - talvez não no nível do Super-homem, mas eles definitivamente deveriam receber alguns bônus de ataque e defesa, e talvez um ligeiro aumento de velocidade.

Então, como eu traduziria essas características no comportamento da IA ​​do jogo? Bem, aqui estão algumas idéias:

  • Isso deve ser um acéfalo, mas um berserker nunca deve fugir , mesmo que ele esteja com um único ponto de vida e sangrando. Apenas desative esse código. O mesmo vale para qualquer outra tática "defensiva".

  • Priorize as opções táticas nesta ordem: 1. Ataque. 2. Avance para o alvo. 3. Tudo o resto. Em particular, os furiosos não devem parar para pegar itens se houver inimigos à vista, mesmo que os itens sejam, digamos, melhores armas do que atualmente. (No entanto, mudar de mãos nuas para uma arma mêlée já segura pode ser razoavelmente priorizado, mesmo após o ataque.)

  • Se atacar e perseguir o alvo podem ser opções táticas válidas ao mesmo tempo, considere dar a seus berserkers a capacidade de fazer as duas coisas ao mesmo tempo (um ataque "de passagem"), mesmo que suas criaturas normalmente não consigam isso (possivelmente com uma penalidade de precisão para compensar). Dessa forma, seus berserkers não precisarão diminuir sua carga para receber ataques de oportunidade.

  • Seleção de alvos: sugiro apenas escolher o inimigo visível mais próximo (independentemente do nível) e fazer com que o berserker o persiga, pelo menos a menos que outro inimigo se aproxime significativamente (digamos, metade da distância do alvo atual). Continue perseguindo o alvo, mesmo se você perder temporariamente a linha de visão, desde que o alvo não fique muito longe. Isso deve dar uma sensação de obstinação. Quando o alvo estiver no alcance de mêlée, ataque-o.

  • Desbravamento: Se houver amistosos entre o berserker e seu alvo, considere deixá-lo atacá-los e abrir caminho. Depende de você o quão ansioso você o fará - pelo menos ele deve fazê-lo se não houver outro caminho para o alvo, mas você pode até pensar em fazê-lo ignorar os amistosos inteiramente na busca de caminhos.

  • O que foi dito acima provavelmente funciona melhor se você também fizer com que os amigos (não-berserker) tentem fugir do quadrado em que o berserker será o próximo a entrar (e talvez o próximo quadrado ou dois no caminho dele). Claro, se houver muita gente, eles podem não conseguir fugir a tempo ...

  • Se não houver alvos inimigos por perto, considere deixar o berserker atacar amigos próximos (adjacentes ou talvez um ou dois quadrados de distância). Obviamente, os amistosos deveriam tentar fugir. Em qualquer turno em que o berserker não tenha um alvo inimigo e não faça um ataque, faça-o se mover aleatoriamente e dê a ele uma chance aleatória por turno de se acalmar e voltar ao estado normal.

  • Escolha das armas: Como observei acima, os verdadeiros berserkers eram grandes no combate ao mêlée. Não use armas de longo alcance, a menos que sejam particularmente comuns e poderosas no seu jogo (por exemplo, armas em um ambiente moderno). Se você deixar seus berserkers usarem armas de longo alcance ou de efeito de área, deixe-os dispará-los enquanto persegue o alvo (veja os ataques de passagem acima). Obviamente, os danos colaterais devem ser ignorados (pelo berserker - fazer com que outros inimigos se desviem para ficar fora da linha entre você e um berserker com uma arma seria um toque muito bom).

  • E, é claro, o berserker deve ter buffs apropriados de ataque, defesa e velocidade. Eles provavelmente também devem estar imunes a qualquer efeito de fadiga ou medo. Se cego ou confuso, peça que eles façam ataques aleatórios na esperança de acertar alguma coisa.

Você notou que deseja que o berserking seja um estado que às vezes pode ser inserido por inimigos normais (com uma propensão a isso). Assim, você precisará decidir o que o acionará. IRL, gatilhos tradicionalmente descritos incluem combate, esforço pesado e estresse. Alguns gatilhos em potencial para um jogo podem incluir:

  • vendo inimigos,
  • atacante,
  • sendo atacado,
  • sendo gravemente ferido,
  • vendo outros em combate,
  • vendo outras pessoas serem mortas, ou
  • vendo traços de combate (manchas de sangue, cadáveres).

Nenhum desses provavelmente deve ser um gatilho automático da IMO; pelo contrário, deve haver uma chance aleatória para cada um desses eventos acionar o estado de furioso, com as probabilidades talvez variando com base na propensão individual e na gravidade do evento. Além disso, combinações de vários gatilhos podem tornar a berserking mais provável: por exemplo, a presença de um inimigo visível pode ser uma pré-condição para qualquer um dos outros eventos disparar a berserking, enquanto pontos de vida baixos podem aumentar as chances dos outros gatilhos.

Além disso, você pode considerar a possibilidade de introduzir um "medidor de raiva" em vez de apenas um simples estado de furto. Por exemplo, um furioso recém-desencadeado pode começar com, digamos, raiva = 1, com atacar e ser atacado aumentando o medidor, e não vendo nenhum inimigo diminuindo-o. Em baixa raiva, um furioso seria simplesmente destemido e polido, mas geralmente evitaria atacar amistosos, enquanto uma raiva aumentada aumentaria os polêmicos, mas também tornaria cada vez menos os ataques do furioso. Quando o medidor de raiva cai para zero, o furioso se acalma e volta ao normal.

Quanto aos gritos obscenos, na maioria das vezes eu me livrava deles: vejo um berserker muito focado em atacar para se incomodar com qualquer provocação boba. Suponho que você possa fazer ele gritar alguma coisa quando o estado de berserk for acionado, e talvez rugir ou fazer um simples grito de guerra ao se aproximar do alcance dos mêlée, mas isso me parece suficiente.


Edit: Depois de reler o que escrevi acima, acho que a essência do que estou tentando dizer é o seguinte: não se concentre muito na IA do berserker. No final, é provável que seja muito simples, provavelmente muito mais simples do que a IA normal do inimigo. Em vez disso, concentre-se em como os outros inimigos se comportarão quando virem um furioso por perto - é aí que a dinâmica realmente interessante surgirá.

Ilmari Karonen
fonte
11
Re-seleção de alvos, uma vez que ele começa a perseguir alguém, ele pode ter um campo de visão muito estreito, então ele passa por outros inimigos sem nem mesmo vê-los.
Peter Taylor