O que é isso
O CastlevaniaBot é um plug-in para
o emulador NES Nintaco que é reproduzido no Castlevania. Se você executá-lo na tela inicial, o plug-in passará por todo o jogo do início ao fim. Ou você pode executá-lo em qualquer lugar do jogo para que ele passe por parte dele.
Neste artigo, mostrarei como criar um bot capaz de passar pelo Castlevania e como criar algo semelhante para qualquer jogo no NES.
Estrutura baseada no conhecimento
Este projeto não utilizou aprendizado de máquina. Em vez disso, o desenvolvimento pode ser chamado de "aprendizado de máquina". Eu sei como passar Castlevania. A dificuldade estava em escrever meus conhecimentos em um programa de computador. O resultado foi um sistema que simula o mesmo processo de tomada de decisão que eu levo com o controlador em minhas mãos. Para criá-lo, foi necessário declarar claramente os detalhes detalhados da física que controla o pequeno mundo de Simon Belmont, e todas as táticas necessárias para um caçador de vampiros experiente.
O CastlevaniaBot tem acesso a um conjunto de estratégias para lidar com uma ampla variedade de situações. A maioria deles é projetada para trabalhar com um tipo específico de objetos de jogo. Por exemplo, existe uma estratégia de controle do esqueleto, outra para os peixes, para quebrar velas, para reunir corações e assim por diante.
O CastlevaniaBot monitora constantemente o estado do jogo e, se necessário, alterna entre diferentes estratégias. No processo de tomada de decisão, a função fitness é usada, classificando todos os objetos do jogo na tela. No topo da lista está o objetivo principal e, quando muda, o bot muda sua estratégia. Por exemplo, o CastlevaniaBot pode se preparar para acertar as velas quando um morcego voa para o quadro. Dependendo da distância do bastão, o CastlevaniaBot pode reagir mudando de uma estratégia de vela para uma estratégia de bastão. Destruindo o bastão, ele continuará a trabalhar com velas.
Antes de decidir mudar, o CastlevaniaBot analisa seu objetivo e estratégia atuais. Se ele não conseguir, pode ficar preso em um ciclo interminável, alternando entre dois objetivos com prioridade igual ou quase igual. Para evitar isso, quando um novo objetivo principal aparecer, que é apenas ligeiramente mais alto em prioridade do objetivo atual, o CastlevaniaBot pode decidir continuar a estratégia atual.
Algumas estratégias são iniciadas automaticamente quando caem em uma determinada área. Geralmente eles são destinados ao processamento simultâneo de vários objetos do jogo. Por exemplo, em um corredor com várias cabeças de medusa voadoras, é melhor seguir em frente e não mirar cada cabeça individualmente.
Algumas estratégias podem variar, dependendo da arma secundária atual e do número de copas coletadas, principalmente nas lutas contra chefes. O CastlevaniaBot está tentando tomar a melhor decisão com base nas ferramentas que possui e na situação atual.
Planejando um mundo de 8 bits
Ao trabalhar em tais projetos, busco principalmente simplificar a tarefa. Imaginei como Castlevania seria se não houvesse inimigos, velas ou itens para coletar nos níveis. Tudo o que seria necessário nesse caso é simplesmente chegar do início ao fim do nível. Eu me perguntava - se eu posso ensinar o bot a fazer isso, quão difícil será destruir vários inimigos ao longo do caminho?
Para ensinar o bot a se mover, eu precisava de mapas de segundo plano e uma compreensão de como os níveis são organizados. O jogo consiste em seis níveis, cada um dos quais termina com um chefe.
Cada nível é dividido em 3 ou 4 etapas. Os palcos são geralmente separados por portas de madeira que se abrem com um rangido e batem atrás das costas do jogador.
Portas são pontos de controle (pontos de verificação). Se um jogador é morto, ele volta ao início do estágio, mas somente se ele não tiver terminado a vida. Se você continuar o jogo após o término do jogo, o jogador será enviado para o início do nível.
O número do estágio indica o número total de pontos de verificação concluídos desde o início do jogo. O último estágio é o número 18. Mas se você matar Drácula, o jogo começa desde o início no Modo Difícil, e o número de estágios continua aumentando para 19 e mais além. Se você passar pelo Modo Difícil, o terceiro ciclo do jogo não se torna mais difícil, mas o número de estágios continua a aumentar.
Cada estágio consiste em uma ou mais barras de rolagem horizontais do plano de fundo, que eu chamo de "subpasso". Se você sair da tela pelas escadas que levam para cima ou para baixo, o jogo se move de um subestágio para outro e não rola verticalmente.
O jogo usa 3 bytes para rastrear o número do ciclo do jogo, o número do estágio e o número do subestágio. O ciclo do jogo no modo normal (Modo Normal) tem um valor de 0; os valores 1 e acima indicam o Modo difícil. Independentemente do ciclo do jogo, as etapas sempre têm uma numeração de 0 a 18. E as sub-etapas sempre têm um valor de 0 ou 1, porque as etapas nunca contêm mais de 2 barras horizontais. O CastlevaniaBot rastreia esses bytes para saber onde está.
Para minha conveniência, gravei a faixa de fundo de cada subestágio em um arquivo gráfico separado. Se eu precisasse descobrir as coordenadas exatas de um objeto, poderia rapidamente descobri-las usando um editor gráfico. Gravei os arquivos usando a ferramenta Map Maker incorporada ao Nintaco. Liguei e depois passei por todo o jogo. Algumas das imagens resultantes continham vários sub-passos conectados entre si, que foram fáceis de separar.
Depois de examinar as imagens de fundo, percebi que os únicos blocos importantes são plataformas e escadas. Tudo o resto pode ser considerado espaço vazio. As escadas são de dois tipos: à frente ou para trás (elas podem ser representadas como as arestas esquerda e direita de um triângulo isósceles). Às vezes, a escada termina com uma plataforma na qual o jogador pode andar.
Existem apenas 5 tipos importantes de peças, e em cada nível eles têm uma aparência diferente. Copiei e colei em arquivos de imagem 16 × 16 separados. Depois, escrevi um programa comparando cada bloco em cada subpasso com o conjunto de imagens correspondente. Então, eu tenho os tipos de matriz de blocos para todas as sub-etapas.
As matrizes podem ser extraídas diretamente da ROM, mas não consegui encontrar a documentação sobre como e onde os dados são armazenados. Como o espaço da ROM é limitado, os dados de nível geralmente são apresentados em um formato compactado semelhante ao formato de gráficos vetoriais. Cada jogo usa seu próprio formato, então não achei necessário realizar pesquisas porque tinha o Map Maker. Além disso, eu ainda precisava de imagens gráficas das sub-etapas. Se eu não tivesse capturado as faixas de fundo, teria que escrever um programa que gere imagens a partir de matrizes.
Localização de caminho
Após criar as matrizes, quis aplicar o algoritmo de busca de caminhos, a saber,
o algoritmo de Floyd-Warshall , que fornece uma tabela de saída contendo os caminhos mais curtos entre cada um dos pares de vértices do gráfico direcionado com arestas ponderadas. A idéia era pré-computar tabelas e gravá-las em arquivos e carregá-las durante o jogo. Com tabelas na memória, o bot pode pesquisar e descobrir instantaneamente o caminho mais curto entre dois blocos de plataforma.
O gráfico consiste em arestas e vértices. Se os blocos da plataforma são vértices, as arestas são apenas as operações que o Simon pode executar para passar de uma plataforma para outra. As operações executadas em apenas um bloco são proibidas. Por exemplo, em um plano a partir de blocos, o Simon pode mover apenas um bloco para a esquerda ou um bloco para a direita.
Da mesma forma, se Simon estiver na escada, ele poderá mover um ladrilho em uma das duas direções possíveis.
Estas são operações válidas. Mas ações como mover do ponto médio do bloco para a borda do bloco são muito fracionárias, porque não correspondem à transição de um vértice do gráfico para outro.
Além de andar para a esquerda e direita, descer e subir escadas, Simon pode pular para outro ladrilho. E ele pode pular para a esquerda ou direita, começando em qualquer um dos 16 pixels da superfície do ladrilho. Para reduzir o número de arestas no gráfico (e o tamanho da tabela de consulta), considerei apenas cinco pontos de repulsão possíveis:
Adicionando a operação "não fazer nada", obtive 15 operações. Todos eles são simples o suficiente para que o bot possa determinar facilmente a sequência de pressionamentos de botão necessária para sua execução durante a execução do jogo.
Para construir um gráfico completo, criei uma simulação muito simples da física do mundo de Simon. Nesta simulação, todas as 15 operações são executadas a partir de cada bloco da plataforma. O gráfico é construído simplesmente observando onde está Simon. Mais especificamente, ao especificar as coordenadas iniciais e a operação, a simulação fornece as coordenadas finais na saída. Se não houver coordenadas finais, por exemplo, quando Simon tentar entrar em uma parede ou em um buraco, o programa retornará que a operação é inválida e essa borda não faz parte do gráfico.
Para criar essa simulação, foi necessário um estudo completo de Simon Belmont. Ao contrário de outros jogos de plataforma clássicos, nos quais o jogador pode acelerar de andar para correr, Simon, ao se mover horizontalmente, sempre move exatamente 1 pixel por quadro. Isso é válido para caminhar, pular, subir escadas e até mesmo para recuar quando atacar inimigos.
Limitar a velocidade horizontal simplifica bastante o reconhecimento de barreiras. O jogo verifica se há uma parede em um pixel na frente do personagem e, se necessário, interrompe o movimento. O teste é realizado abaixo do nível da cabeça, o que permite que ela passe sob tetos baixos sem interferir no movimento horizontal.
O movimento vertical é um pouco mais complicado. Se Simon sai da borda da plataforma, em vez de uma aceleração gradual, ele cai instantaneamente a uma velocidade de 8 pixels por quadro. Como cada bloco possui uma altura de 16 pixels (múltiplo de 8), o reconhecimento do solo é simplificado. Ao mesmo tempo, o jogador mantém uma velocidade horizontal de 1 pixel por quadro na direção obtida imediatamente antes da queda.
O sprite de Simon tem 16 pixels de largura e, no entanto, pode pairar sobre o bloco em um máximo de ± 4 pixels a partir do ponto médio. Se você se mover um pouco mais, ele cairá abaixo.
É interessante que, se ele sair da plataforma e cair exatamente 1 peça a uma velocidade de 1 horizontal e 8 pixels verticais por quadro, ele não ficará exatamente no bloco ao pousar. Uma de suas pernas permanecerá dentro da parede a uma profundidade de 2 pixels.
Depois disso, ele poderá sair do muro, mas não entrar nele.
Simon não pode mudar de direção durante o salto. Depois de pressionar o botão A, ele faz um caminho fixo ao longo da parábola.
No topo, Simon sobe 36 pixels, o que lhe permite pular em plataformas com 2 ladrilhos de altura. E o topo da "parábola" é surpreendentemente plano. Parece que congela no espaço por 9 quadros completos, possivelmente para simplificar os golpes de chicote no ar. Se Simon não tem nada para pousar, o movimento da parábola continua até que ele retorne à sua altura original. Depois disso, começa a cair a uma velocidade de 8 pixels por quadro, ou seja, com a mesma velocidade constante de queda da plataforma.
Quando há uma plataforma diretamente acima da cabeça do personagem, não é permitido pular.
Caso contrário, ele "salta" parcialmente nos ladrilhos da plataforma.
Como afirmado anteriormente, se Simon toca mais do que o topo da cabeça, ele para de se mover horizontalmente. Isso é bastante irritante no final da primeira etapa do nível 4, quando o jogador está tentando sair da caverna.
As escadas permitem que você se mova livremente verticalmente entre plataformas.
Em um caso, Simon sobe as escadas, passando pelo ladrilho da plataforma. Estar na escada, ele pode passar livremente pela parede.
Nas plataformas móveis de nível 4, o jogador geralmente se agacha sob estalactites baixas. No entanto, você pode se levantar e descansar contra eles. Em tal situação, o jogo restringe o movimento horizontal, arrastando Simon rapidamente para uma armadilha de água.
Um simulador de física que gera gráficos orientados considera Simon um retângulo. O movimento desse retângulo é limitado pelas regras de movimento descritas acima. Para que o bot não pule de um lugar para outro como um coelho, as bordas dos saltos do conde receberam um custo mais alto do que as bordas de caminhar e se mover ao longo das escadas.
A tabela gerada pelo algoritmo de pesquisa de caminho contém a menor distância para cada bloco inicial e final (custo total do caminho) e uma descrição da primeira etapa do caminho. Esta descrição inclui a primeira operação que deve ser executada nesse caminho e o bloco no qual o personagem estará depois de concluído. O caminho inteiro pode ser recriado por pesquisa repetida na tabela, cada uma das quais fornece o próximo passo na direção do bloco final.
Em algumas sub-etapas, as colunas não estão totalmente conectadas. Por exemplo, no nível 4, as plataformas são a única maneira de atravessar o abismo. Nessas sub-etapas, a tabela contém métodos para se deslocar em cada uma das ilhas, mas não entre elas.
Alguns blocos destrutíveis contêm objetos ocultos. E a destruição dos blocos altera esse gráfico. Para contornar esse problema, um algoritmo para encontrar caminhos com e sem blocos divididos foi aplicado às sub-etapas. No tempo de execução, o CastlevaniaBot monitora os estados dos blocos a serem divididos e usa a tabela de pesquisa apropriada.
Estado do jogo
O CastlevaniaBot se integra ao Nintaco por meio de
sua API . Ele registra a implementação do
FrameListener
para receber um retorno em cada quadro. Como o emulador é executado a cerca de 60 quadros por segundo, esse ouvinte precisa ser retornado no prazo; cálculos longos ou tempo de inatividade diminuirão a velocidade ou bloquearão o emulador. Em um curto período de tempo, o CastlevaniaBot lê o estado do jogo, determina seu objetivo principal, muda de estratégia se o objetivo mudou e cumpre a estratégia atual.
O CastlevaniaBot lê o estado atual de Simon Belmont diretamente da RAM do processador. Mas não consigo determinar como outros objetos do jogo são representados na memória. Portanto, o CastlevaniaBot lê diretamente da memória os atributos dos objetos (Memória de Atributos do Objeto, OAM) - uma área que armazena uma lista de sprites exibidos.
Essa técnica funciona e geralmente é aplicável a outros jogos, mas tem muitas desvantagens. A ordem dos sprites no OAM está mudando constantemente. Se houver várias instâncias do mesmo tipo de inimigo na tela ao mesmo tempo, a única maneira de rastreá-los é determinar sua proximidade, comparar as últimas coordenadas do sprite com as coordenadas do quadro anterior.
Alguns objetos do jogo consistem em sprites repetidos, como torres de ossos.
As plataformas móveis consistem em um sprite repetindo 4 vezes.
A classificação desses dois casos requer lógica adicional, fácil de implementar. As atualizações secundárias de armas e alguns tipos de armas secundárias usam os mesmos sprites. Pior, no nível 5, os Cavaleiros pegam emprestado os sprites de armas secundárias de Simon.
Felizmente, com exceção da água benta, o CastlevaniaBot usa apenas armas secundárias onde as atualizações geralmente não estão disponíveis, como nas lutas contra chefes. E o sprite de atualização da água benta é diferente do sprite usado ao lançá-lo.
Alguns objetos do jogo piscam durante a criação, por exemplo, bolas de cristal no final das lutas contra chefes, tranças da morte e corpo de Drácula. Sprites intermitentes aparecem e desaparecem do OAM, portanto, é necessária lógica adicional para rastrear esses objetos.
Também é importante notar que, devido a limitações de hardware, o NES pode exibir apenas 8 sprites por linha raster. Como a prioridade dos sprites depende parcialmente de seus índices no OAM, a ordem em cada quadro é aleatoriamente misturada para evitar uma mudança que torna um sprite invisível constantemente. Vários sprites piscam por sua vez, gradualmente mudando sua prioridade. Esse piscar não afeta a leitura de sprites do OAM. Os dados ainda permanecem lá, mas o hardware emulado não os exibe. Isso difere da situação descrita acima ao piscar ao criar sprites. Além disso, o Nintaco tem uma opção que reduz significativamente a intermitência do hardware.
E, finalmente, uma pequena parte do estado do jogo é lida nas tabelas de nomes da PPU - uma área de memória contendo todos os dados de segundo plano. Isso inclui a verificação de blocos destrutíveis e o rastreamento das posições da “queda” no nível 2.
Máquinas de Estado Heurísticas
Estratégias são máquinas de estado. CastlevaniaBot define-os como uma classe abstrata com métodos
init
e
step
. O método
init
é chamado quando o CastlevaniaBot muda para a estratégia apropriada, permitindo que a máquina de estado seja redefinida. E o método
step
executa a estratégia. Por exemplo, o método de estratégia por
step
para as pessoas que pescam verifica se um peixe está dentro do alcance de um chicote e, nesse caso, o bot bate com um chicote. Caso contrário, verifica se é possível alcançar a distância do ataque com um salto e, se for, o bot salta. E finalmente, se o bot estiver muito perto do inimigo, ele se afasta dele. Com essas regras simples, CastlevaniaBot derrota o peixe humano.
Para tornar as estratégias de escrita o mais fácil possível, criei uma biblioteca de possíveis ações a serem executadas. Por exemplo, em vez de pressionar e soltar o botão A para pular, o bot simplesmente chama o método de pulo da biblioteca. E antes disso, ele pergunta à biblioteca se Simon está na plataforma e pode pular.
Aproximar-se e afastar-se do alvo são ações padrão executadas usando operações da tabela criada pelo algoritmo de busca de caminho. Por exemplo, a estratégia de vela usa o método de biblioteca
routeAndFace
, que não apenas direciona o Simon para quaisquer coordenadas especificadas, mas também o rotaciona para a esquerda ou direita após pressioná-las. Além disso, dependendo da altura das velas, a estratégia executa um salto ou agachamento antes de acertar um chicote. Um objeto que caiu de velas será criado no ar e cairá ou cairá lentamente no chão. Uma estratégia de coleta direciona Simon para o bloco mais próximo diretamente abaixo dele antes que o item toque o chão.
Para se afastar dos inimigos, a biblioteca precisa saber como se mover para a esquerda ou para a direita sem cair nas covas. Em geral, isso é feito procurando caminhos para as bordas esquerda ou direita do subestágio. Mas em algumas áreas, o caminho mais curto para a borda esquerda requer inicialmente o deslocamento para a direita e vice-versa. Quando esses problemas surgiram, eu adicionei lógica especificamente para os subestágios, direcionando Simon para as bordas esquerda e direita da plataforma atual.
Passo a passo
Nesta seção, descreverei em detalhes as estratégias usadas pelo CastlevaniaBot, comentando toda a explicação passo a passo.
O jogo começa no pátio em frente ao castelo. Os objetos no quadro são organizados para selecionar o alvo principal, que neste caso é uma coluna com chamas. A estratégia da coluna diz ao bot para se aproximar da coluna e usar o chicote quando estiver ao seu alcance.
Após pressionar o chicote e destruir a coluna, um item é criado. A prioridade de todos os itens é maior que a das colunas de chamas. Consequentemente, o CastlevaniaBot reage a isso usando uma estratégia para coletar o item que aparece antes de passar para as próximas colunas.
Ao classificar objetos, o CastlevaniaBot sempre leva em consideração uma meta de longo prazo - concluir um nível antes que o tempo acabe. Ao criar uma lista de objetivos em potencial, uma porta para o próximo nível é sempre adicionada a ele. A porta recebe uma baixa prioridade, mas após a destruição de todas as colunas e a coleção de todos os objetos, ela se torna uma prioridade. Com apenas uma exceção: CastlevaniaBot sabe descobrir todos os tesouros escondidos e pula sobre a entrada do castelo para criar um saco de dinheiro piscando.
Depois de entrar no castelo CastlevaniaBot vê fantasmas e velas. Velas e itens criados têm precedência até os fantasmas se aproximarem.
Parece que o chicote destrói os inimigos sem tocá-los. Encontrei uma tabela retangular de colisão na ROM do jogo, então o CastlevaniaBot sabe exatamente quando algo está dentro do escopo do chicote. E como os retângulos de colisão geralmente se projetam um pouco além dos limites dos sprites, o chicote pode atingir a "parte invisível".
Na maioria dos casos, ao destruir velas, o CastlevaniaBot salta verticalmente, em vez de avançar. Esta é uma tática de prevenção de riscos. Como está no ar, é impossível mudar a direção do movimento, uma multidão de inimigos se aproximando pode complicar um pouso seguro ou impossibilitá-lo. Além disso, com um salto vertical, o CastlevaniaBot permanece no mesmo bloco; ele não precisa verificar se o salto levará a uma queda na plataforma inferior ou no fundo do poço.
Quando não há velas a serem destruídas ou objetos a serem coletados, o CastlevaniaBot começa a perseguir fantasmas. Mas a "Estratégia Pantera" ordena que ele fique parado, esperando o inimigo cair dentro dos limites de um ataque de chicote.
Além do fato de as velas servirem como fontes de corações e outros objetos, elas guiam o jogador ao longo do caminho pelo palco. Por exemplo, na imagem abaixo, as velas no canto superior direito “convidam” o jogador a subir as escadas. No entanto, para subir as escadas, o jogador inicialmente precisa ir para a esquerda, e é por isso que as velas desaparecem da tela. Como as soluções CastlevaniaBot são baseadas na priorização de objetos visíveis na tela, essa situação pode levar a um ciclo interminável, onde o bot seleciona alternadamente o caminho mais curto para as velas (à esquerda) ou o caminho mais curto para a porta de saída (à direita).

Problemas semelhantes podem ser resolvidos de várias maneiras. Por exemplo, o CastlevaniaBot pode ser equipado com o armazenamento de objetos, entendendo que os objetos continuam a existir, mesmo que não sejam visíveis. Mas para isso, mesmo assim, desde o começo eles precisam ser vistos. Se as velas estivessem ainda mais à direita, depois da detecção, seria necessário voltar ainda mais.
Com isso em mente, adicionei incentivos que pressionam o CastlevaniaBot a explorar áreas do palco que ele normalmente ignoraria. Esses incentivos funcionam de maneira semelhante às portas de saída, levando o CastlevaniaBot para onde ele precisa ir. Além disso, adicionei regras que o fazem ignorar velas e objetos muito distantes (em termos de distância percorrida, e não em linha reta).
Depois de subir as escadas e destruir as velas, a água benta é criada - a mais valiosa de todas as armas secundárias. CastlevaniaBot o seleciona trocando uma adaga por ele.
Assim como a sacola de dinheiro no início do jogo, o CastlevaniaBot conhece todos os blocos destrutíveis com objetos ocultos e, para destruir blocos com um chicote, usa uma estratégia semelhante à estratégia para velas.
Com mais movimentos do CastlevaniaBot, você notará que ele começa a usar água benta para destruir fantasmas e velas. Isso pode parecer redundante, mas serve a um propósito importante. Castlevania recompensa os jogadores pelo uso de armas secundárias com exposição dupla e tripla. Em outras palavras, CastlevaniaBot
mói atualizações secundárias de armas.
Depois de pressionar o botão B, há um atraso de 16 quadros antes de tocar um chicote. O chicote permanece longo por mais 10 quadros, mas é válido apenas no primeiro desses dez. O CastlevaniaBot usa esse fato para melhorar a mira. Em particular, ele rastreia a velocidade de todos os objetos no quadro, assumindo que o alvo principal continue a se mover ao longo de um caminho linear. Em seguida, ele pressiona o botão B 16 frames antes que o alvo precise encontrar um chicote. O inimigo sempre pode mudar de direção durante esses 16 quadros, mas geralmente essa simples heurística funciona.
No entanto, depois de passar pela porta, CastlevaniaBot encontra morcegos vermelhos. Como as cabeças das águas-vivas, os morcegos vermelhos voam pela tela, voando através de um sinusóide através de plataformas e escadas. Para prever onde o bastão vermelho estará depois de 16 quadros, gravei o movimento de um deles em uma tabela. Durante a execução do jogo, o CastlevaniaBot rastreia morcegos e aguarda picos ou baixos da trajetória em que a velocidade vertical muda de sinal. Em seguida, ele pode comparar as coordenadas com os valores em uma tabela pré-criada. Isso permite que a estratégia apropriada bata no bastão vermelho com um chicote, incline-se ou salte sobre ele.
Durante a passagem (speedrana) do Castlevania, os jogadores realizam manobras que tornam o jogo o mais determinístico possível. Por exemplo, eles descobriram que, no final do nível 1, para destruir um bloco e pegar uma atualização de arma em uma determinada sequência de tempo, o chefe se comportará de acordo com o padrão desejado, permitindo que ele derrote rapidamente.
Por mais experientes que sejam, elas não podem domesticar completamente o gerador de números aleatórios. No entanto, como o CastlevaniaBot pode controlar o pressionamento de botões com precisão quadro a quadro, ele pode levar o conceito de passagem de velocidade ao seu limite, cada vez que passa no jogo de uma maneira absolutamente idêntica. Se o fizesse, não seria melhor do que passar no
TAS . Portanto, o CastlevaniaBot adiciona arbitrariamente erros e atrasos às suas ações usando um gerador externo de números aleatórios para evitar jogabilidade determinística. Por exemplo, quando ele bate com um chicote uma vela localizada no alto, ele deliberadamente adiciona um atraso para um número aleatório de quadros ao salto e batida. Essas pequenas mudanças afetam significativamente o progresso do jogo.
Embora CastlevaniaBot busque evitar o determinismo, ele emprestou um conceito do speedrunning: o
aumento de danos . Em 50% dos casos, CastlevaniaBot evita completamente a passagem da masmorra de peixe humano pulando de volta para o morcego vermelho, que o joga em uma plataforma inacessível.
Na outra metade dos casos, CastlevaniaBot decide lutar com peixes humanos. Suas bolas de fogo têm alta prioridade e CastlevaniaBot os acerta com um chicote, esquiva ou salta dependendo da situação.
Devido à imprevisibilidade de criar inimigos e suas bolas de fogo, a maioria dos jogadores costuma fazer parte de peixes humanos. Mas CastlevaniaBot gasta tempo com eles, coleta todos os corações e até um tesouro escondido na extremidade direita. O bot sabe exatamente quais itens estão contidos em cada vela e, como prefere usar água benta, pula as velas nas quais os cronômetros estão escondidos. No entanto, se você permanecer nesta parte e lutar com os peixes, às vezes poderá inevitavelmente pegar um cronômetro.
As etapas geralmente terminam com cruzes destruindo todos os inimigos na tela. Caso você esteja curioso, direi que cruzes não podem matar chefes no final de um nível. De fato, às vezes, cruzamentos são criados mesmo durante brigas de chefes. Por exemplo, na batalha com a Medusa, às vezes aparecem cruzes ao matar cobras. Mas essas cruzes só podem matar outras cobras.
Depois de passar pela porta, CastlevaniaBot encontra fantasmas novamente. Na captura de tela abaixo, ele quer pular para a plataforma inferior, mas fantasmas o impedem de se mover. Quando uma tabela criada por um algoritmo de busca de caminho diz ao CastlevaniaBot para saltar, ela examina o espaço em torno da plataforma de destino. Se acontecer que ele aterrissa nos inimigos, o salto não é realizado. Nesse caso, esse mecanismo faz o CastlevaniaBot esperar que os fantasmas liberem seu lugar.

Essa regra de "verificar inimigos antes de pular" ilustra um dos princípios da estrutura do CastlevaniaBot: deve ser governada por regras simples, o mais generalizadas possível. Em algumas partes do jogo, é necessário usar estratégias únicas que resolvam problemas muito específicos. Mas na maior parte do jogo, as ações de bot são dirigidas por heurísticas reutilizáveis. Não escrevi um time que o fizesse parar naquele momento em particular e esperar os fantasmas sairem do caminho deles. Esse comportamento surgiu como resultado de heurísticas.
CastlevaniaBot completa o nível matando o Phantom Bat com água benta tripla. Mas sua estratégia de ataque é determinada por sua arma secundária. De fato, se ele não tinha uma arma secundária, estava pronto para matar o chefe com um único chicote. Um caso particularmente interessante é o assassinato de um Phantom Bat com um machado. Assim como no bastão vermelho, registrei na tabela o movimento do machado ao longo da parábola. Durante a execução do jogo, o CastlevaniaBot executa um deslocamento da tabela, combinando-o com cada um dos ladrilhos. Isso permite que você calcule o ponto ideal para matar o chefe com um machado.
Pouco antes de pegar a bola de cristal, CastlevaniaBot lança a arma secundária em direções diferentes, sabendo que ela congelará no ar depois de tocar na bola. Então ele pula aleatoriamente repetidamente e bate com um chicote, esperando congelar em uma pose estranha.
No início do nível 2, CastlevaniaBot evita as primeiras velas nas quais o bumerangue está escondido. A estratégia de trabalhar com um cavaleiro-lanceiro é uma campanha contra as estratégias de fantasmas ou pescadores, mas esse é o primeiro inimigo a matar que precisa de dois golpes. O morcego preto está cochilando até chegar perto dele, após o qual decola e se move linearmente o suficiente para ser morto com um chicote usando as heurísticas simples mencionadas acima.
Tendo destruído os tijolos da parede, em 50% dos casos, CastlevaniaBot parece sair da sala sem levantar a coroa. Mas é assim? De fato, nesses casos, ele pega a coroa, usando o bug do jogo. Como o final da escada superior coincide horizontalmente com a localização da coroa, o jogador, ao passar por cima e por trás da tela, fica momentaneamente abaixado. Se você ouvir o som ou olhar para os óculos, poderá ver que o bot realmente leva a coroa.
No nível 2, os inimigos não atacam o jogador quando ele está em uma plataforma móvel. O CastlevaniaBot só precisa esperar a plataforma se aproximar, entrar na plataforma, esperar que ela atinja o outro lado e, em seguida, desça dela. Por outro lado, existe uma ligeira variação para plataformas que não tocam em ladrilhos. Nesses casos, o CastlevaniaBot não desce, mas salta da plataforma.
Uma porta leva a um corredor cheio de cabeças voadoras, e CastlevaniaBot reage a isso avançando. Como é o caso das plataformas móveis, o CastlevaniaBot sabe que essa estratégia precisa ser aplicada com base em sua posição, em vez de priorizar os objetos de jogo na tela. No entanto, assim que todas as cabeças das águas-vivas voam, ele volta a essa técnica para escolher a estratégia que será usada mais adiante.
Outra estratégia, dependendo da posição, é acionada após subir a próxima escada que leva à área cheia de cabeças de água-viva. Em 50% dos casos, o CastlevaniaBot pula intencionalmente a cabeça de uma água-viva para obter um aumento de dano, empurrando-o para a plataforma superior ao lado da porta que leva à próxima etapa. Estes são os dois únicos danos que CastlevaniaBot conhece. Ao contrário dos rotores de velocidade, ele não o executa para economizar tempo, essa é apenas mais uma contribuição ao não-determinismo da passagem.
«» — , . CastlevaniaBot , «» , . , , , «». , .
«» . , . , . , -.
2 , CastlevaniaBot . .
3 . CastlevaniaBot , , . , CastlevaniaBot , .
. . , . 3 CastlevaniaBot . , , . CastlevaniaBot — .
CastlevaniaBot , . , .
CastlevaniaBot , , , . . , .
CastlevaniaBot , . , .
CastlevaniaBot , . , , .
, .
CastlevaniaBot . , , - , . , - .
4 . , . , , . , CastlevaniaBot , . -, , . CastlevaniaBot .
. , .
, 64 . , , ROM , . - , . . .
, - . , , . . 50%, . .
CastlevaniaBot , . , , .
CastlevaniaBot . . CastlevaniaBot , .
CastlevaniaBot .
.
. , CastlevaniaBot , . .
5 CastlevaniaBot . , 3. , , CastlevaniaBot , , . , , .
5 . CastlevaniaBot , , .
14 . CastlevaniaBot . , , . , . , , . , . , CastlevaniaBot . , . CastlevaniaBot , , . Viva!
, CastlevaniaBot . , , . , , , .
5, CastlevaniaBot , , . . , , CastlevaniaBot , .
, . CastlevaniaBot , , , , . , CastlevaniaBot , . , . .
, , , . , , .
, CastlevaniaBot . , .
CastlevaniaBot , , . , .
CastlevaniaBot 6 — . , , , . , , .
. , .
CastlevaniaBot , . .
CastlevaniaBot , , , 20 .
, .
16 . CastlevaniaBot , , , .
, Cookie Monster, . Cookie Monster , CastlevaniaBot . Cookie Monster , . . Cookie Monster , .
CastlevaniaBot Difficult Mode, . , Normal Mode. CastlevaniaBot .
CastlevaniaBot_2018-12-09.zip.zip
:
src
— .CastlevaniaBot.jar
— .lgpl-2.1.txt
— .
Lançamento
- Nintaco — NES.
Castlevania (U) (PRG1) [!].nes
— ROM .
- Nintaco
Castlevania (U) (PRG1) [!].nes
. CastlevaniaBot.jar
.zip
.- Run Program, Tools | Run Program...
- JAR , Find JAR....
- Load JAR, .
- Run.
Copyright © 2018 meatfighter.com
. / LGPLv2.1. |