Como os robôs de jogo percebem o mundo do jogo e outras entidades?

52

Esta questão está em minha mente há um tempo ... principalmente porque vejo bots para todos os tipos de jogos como WoW e outros. Minha pergunta é; como os bots sabem o que está aparecendo na tela? Eu não jogo WoW, então meu exemplo pode estar errado, mas se, por exemplo, houver um monstro, como o bot sabe onde esse monstro está na tela e como ele sabe como interagir com ele?

Você pode aplicar isso a qualquer jogo ou é específico para cada jogo? Me desculpe se a pergunta não está clara ... e não estou perguntando como fazer um bot, mais perguntando como eles detectam coisas na tela, pois isso é fascinante para mim!

Desde já, obrigado :)

TheRapture87
fonte
14
Na maioria das vezes, esses bots se conectam à memória do jogo e leem diretamente a posição do elemento do jogo, em vez de tentar entender o que está na tela.
Alexandre Desbiens
2
Aceboy1993, você é um programador? Edite a pergunta e informe-nos de qualquer maneira. As respostas provavelmente precisam ser feitas de maneira um pouco diferente, dependendo disso.
Panzercrisis
3
Só para ficar claro; você está falando sobre a automação não integrada da jogabilidade, certo? Bots de cultivo de ouro, aimbots e tal? Ou você apenas quer dizer jogadores de IA?
Anko
Olá, sou programador. Sim, eu estou falando sobre bots-ouro agricultura e visam bots, mas eu também estou interessado em jogadores AI :)
TheRapture87
3
@ Aceboy1993 A cobertura de ambos tornaria essa questão muito ampla. Por favor, divida-os.
Mast

Respostas:

77

Existem muitos pontos em que um bot pode se injetar no jogo.

  • A tela é uma delas, mas de longe não é a mais útil. No entanto, eu já vi um aimbot muito cedo para o Counter Strike, que usava código de cores. Ele veio com modelos alternativos de personagens com texturas de uma cor (o jogo era bastante amigável para permitir isso) e então apenas detectou pixels dessas cores. Não é um método muito eficaz, no entanto. Já era bastante desajeitado na época e se torna cada vez menos viável porque os motores gráficos se tornam cada vez mais poderosos, o que significa cada vez mais detalhes para confundir qualquer algoritmo de reconhecimento óptico.

  • Outro ponto é ler a memória diretamente [1] . É possível ter um programa no seu computador lendo a memória de outro. Portanto, o desenvolvedor só precisa descobrir em qual endereço de memória o jogo está salvando as informações relevantes para o bot. Existem ferramentas que ajudam o desenvolvedor a encontrar o que deseja, criando uma imagem de memória e fornecendo várias ferramentas de pesquisa. Uma contramedida é usar a aleatorização do layout de endereço, mas um robô inteligente ainda poderá encontrar o que está procurando automaticamente.

  • É possível modificar o próprio executável do jogo. Para fazer isso, os desenvolvedores de bot precisam ser capazes de ler e programar no assembler, o que não é tão difícil com alguma prática. Eles então procuram o código que manipula as informações em que estão interessados ​​e os reescrevem para passar para o bot. Uma possível contramedida da perspectiva do desenvolvedor do jogo é usar um ofuscador para tornar o código do montador do jogo menos legível, mas geralmente não são bons para desempenho e existem ferramentas para muitos ofuscadores que invertem seu trabalho.

  • E depois há o código de rede. Em um jogo online, o servidor envia as propriedades e posições de todos os objetos no jogo via rede. O fluxo de dados da rede entre servidor e cliente pode ser interceptado e analisado. Uma ferramenta popular para fazer isso é o wireshark. Quando o desenvolvedor fez a engenharia reversa do código de rede, ele pode escrever um bot que intercepta o tráfego da rede, assim como o Wireshark e usa as informações para tomar sua decisão. Quando o desenvolvedor está mais motivado, ele pode até desenvolver um cliente de jogo completo do zero, que implementa o protocolo de rede e joga o jogo sem sequer ter nenhuma saída gráfica. Esses bots são muito populares entre os produtores de ouro, porque, sem a saída gráfica, o cliente geralmente usa muito mais recursos, o que significa que eles podem executá-los ao mesmo tempo em um pequeno servidor.


1: Como você mencionou o WoW, vale ressaltar que o programa de bots WoWGlider inicial e notório usava acesso direto à memória. A Blizzard tinha um subprograma chamado Warden, projetado para detectar e bloquear programas externos de acessar o estado interno do jogo do WoW. Como o programa bot contornou essa proteção e leu a memória sem permissão, o processo MDY / Blizzard de 2006 foi decidido em favor da Blizzard, alegando que o fabricante do bot estava incentivando e permitindo que seus usuários cometessem violações de direitos autorais e violassem o DMCA .

Philipp
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Josh
18

Bots são jogadores. Eles apenas leem as posições do jogador / monstro no servidor, como todos os outros jogadores, e usam esses valores combinados com um script de IA simples para executar ações no jogo, simulando toques no teclado e cliques do mouse programaticamente. Se os bots realmente tivessem um algoritmo para detectar qual monstro está na tela e interagir com ele, isso seria um software bastante impressionante que valeria milhões. Isso é basicamente IA para robôs.

dimitris93
fonte
2
É mais simples fazer algumas verificações de oclusão e transmissões de raios para verificar se o bot teria visto o monstro e, em seguida, usar o estado de animação para verificar o que o monstro está fazendo.
catraca aberração
Para fazer isso, você teria que fazer engenharia reversa do jogo, implementar a conversão de raios e também ler o estado de animação do monstro, o que exigiria a injeção de código e a modificação do .exe. Como isso é mais simples do que ler os pacotes de rede que você recebe do servidor (usando o wireshark como sugerido por Phillip) e simplesmente ter um script de AI para simular ações de teclado / mouse, com base nos pacotes de rede?
precisa
2
Eu estava assumindo um bot de "oponente de IA" em vez de um bot de cliente modificado.
catraca aberração
3
@ratchetfreak Oh agora faz sentido. A referência do WoW na questão realmente implica que os "bots" são basicamente fazendeiros de ouro, não oponentes de IA.
precisa
7

Phillip já deu uma ótima visão geral de como a maioria dos bots opera, mas eu só queria abordar as coisas um pouco mais detalhadamente, pois tenho um pouco de experiência pessoal desenvolvendo em ou para todos os tipos de bots que ele cobriu.

No Runescape, havia um grande projeto (RSBot) que copiava o conteúdo da memória do cliente Runescape para a memória local, onde era possível visualizar todo o estado do jogo sem o risco de o cliente pegar. Foi necessário um pouco de engenharia reversa para determinar onde procurar na memória, a fim de encontrar os ponteiros para os dados, mas uma vez que eles o fizeram, eles expuseram uma API para tirar proveito das informações. Ele saberia exatamente o que havia no mundo obtendo as coordenadas de um objeto e depois as transformando com a matriz de transformação da câmera para obter a posição na tela. As máscaras de acerto também eram legíveis, por isso era trivial determinar exatamente em qual faixa mover o mouse para obter o resultado desejado.

O bot forneceu um monte de informações de depuração, como anotações que informavam ao desenvolvedor quais coordenadas de lado a lado estão, qual ID esse objeto tem, qual ID pertence a um determinado item, etc. Essas informações podem ser usadas para fazer bots. O processo real de criação dos scripts de bot foi realmente bastante simples. A estrutura forneceu muitas funções utilitárias, como move_to(world_coordinates)ou mouse_move(x,y)que executariam as ações especificadas de uma maneira um tanto crível (mover o mouse ao longo de um spline aleatório, mover-se repetidamente pelo minimapa e pela tela e assim por diante)

Também no Runescape, você tem a opção de reduzir drasticamente a qualidade dos gráficos. Na verdade, era muito fácil criar certos tipos de bots filmando a tela e aplicando alguns conceitos básicos de visão por computador para construir um modelo do mundo. Eu criei um robô de maldição e um robô de fundição usando essa técnica, que funcionou muito bem. Basta pegar o quadro, aumentar a saturação o máximo possível e, em seguida, tentar extrair padrões dele para gerar um mapa de probabilidade para as zonas de clique.

No caso do bot de maldição, o alvo era um demônio menor, que é apenas uma enorme coisa vermelha, que é trivial de encontrar. No caso do robô de fundição, ele procuraria um pequeno trapézio laranja cercado de cinza, e esse seria o forno. Ele também tentaria encontrar uma forma grande em L, cinza claro, que seria a mesa do banco. Isso foi feito apenas com downscaling e heurísticas básicas. Ele também pode se orientar com a bússola acessível ao lado do minimapa, para orientar a câmera em uma posição mais confiável para encontrar os objetos alvo.

Em vários jogos da Nexon, os servidores confiam muito nos clientes. Eu abusei muito disso em Maplestory modificando mapas para remover perigos ou adicionar distorções, para que um bot não precise ser tão sofisticado. Eu também monitorava o tráfego de e para o servidor, a fim de construir um modelo do mundo que pudesse ser usado para encontrar e matar monstros rapidamente.

Depois que percebi que não jogava mais MMOs e apenas os automatizei, decidi parar de jogar completamente. Se eu não estivesse tão preocupado em me expor legalmente, provavelmente poderia ter matado vendendo bots MMO, mas realmente não queria ser processado. É por isso que passo meu tempo fazendo programação real hoje em dia!

Kaslai
fonte
Amém nesse último parágrafo. Eu descobri na programação 1) jogando WoW 2) fazendo bots WoW 3) começando a escrever meu próprio bot para WoW. O conhecimento de programação que adquiri em apenas 2 anos foi mais valioso do que qualquer outra coisa que aprendi enquanto estudava (bem, pelo menos na programação 'prática').
Sebastian Graf
2

A resposta de Phillip é ótima, mas apenas uma nota rápida sobre o padrão Model / View / Controller , ou MVC, para abreviar.

Sua tela faz parte da "visualização", que apresenta dados do "modelo", que é o estado real do jogo, se você preferir. Os bots e seu personagem todos 'existem' (em certo sentido) dentro do modelo. Imagine se você desconectasse sua tela - o jogo continuaria mesmo que a exibição desaparecesse.

Em um jogo em rede, o conceito de "modelo" é um pouco complicado, pois você realmente tem muitos modelos. Você tem o modelo no servidor e, em seguida, um modelo em cada cliente, que se atualiza em parte devido aos dados que recebe do servidor. Você pode pensar no "modelo" como abrangendo o modelo do servidor e o modelo do seu cliente, ou você pode pensar nele apenas como o modelo do seu próprio cliente. De qualquer maneira, é aqui que os bots vivem. Portanto, suas "percepções", que poderíamos usar como uma abreviação de entrada e estado de dados, são baseadas no estado do modelo naquele momento e na interação entre as diferentes entidades / objetos dentro desse modelo. Na prática, cada bot pode ter uma função chamada "refreshState", que é executada uma vez por quadro ou algo assim e faz com que ele seja atualizado '

Max Williams
fonte
0

Eles podem ler as cordas de um arquivo ou servidor, mas também com um sistema de detecção de colisão de raios. É comum usar raios que vão do bot (nesse caso) para fora dele. Se o raio colidir com alguma coisa, ele retornará algumas informações ao bot, como se o raio encontrado fosse um jogador, um bot, um animal ou uma parede simples. Isso ocorre porque, no caso do jogador e do bot, por exemplo, eles têm uma cápsula invisível que os envolve inteiramente com informações sobre seu tipo, por exemplo (humano, bot, ...). Com isso, eles podem evitar colidir com paredes e outros elemnts se estiverem seguindo você, por exemplo.

Você pode ver a parte Detecção de colisão desta página

Megasa3
fonte
Isso exigiria que você injetar código para o jogo real embora
dimitris93
Sim, claro. Está tudo programado, mas é útil para caminhos gratuitos ou casos como bots, seguindo você e assim por diante. Nos jogos 3D, a AFAIK é a maneira mais comum e estudamos pelo menos a que não é mmorp ... talvez wow tenha todas as informações no servidor, mas é diferente por ser uma grande mmorp.
Megasa3