Castlevania Bot

Que es esto


CastlevaniaBot es un complemento para el emulador NES Nintaco que se reproduce en Castlevania. Si lo ejecuta en la pantalla de inicio, el complemento recorrerá todo el juego de principio a fin. O puede ejecutarlo en cualquier parte del juego para que pase por parte de él.


En este artículo te diré cómo crear un bot capaz de pasar Castlevania, y cómo puedes crear algo similar para cualquier juego en NES.



Estructura basada en el conocimiento


Este proyecto no utilizó el aprendizaje automático. Más bien, el desarrollo puede llamarse "aprendizaje automático". Sé cómo pasar Castlevania. La dificultad estaba en escribir mi conocimiento en un programa de computadora. El resultado fue un sistema que simula el mismo proceso de toma de decisiones que llevo a cabo con el controlador en mis manos. Para crearlo, era necesario establecer claramente los detalles detallados de la física que controla el mordido mundo de Simon Belmont, y todas las tácticas necesarias para un cazador de vampiros experimentado.

CastlevaniaBot tiene acceso a un conjunto de estrategias para lidiar con una amplia gama de situaciones. La mayoría de ellos están diseñados para trabajar con un tipo específico de objetos de juego. Por ejemplo, hay una estrategia de control de esqueleto, otra para los peces, para romper velas, para juntar corazones, etc.

CastlevaniaBot monitorea constantemente el estado del juego y, si es necesario, cambia entre diferentes estrategias. En el proceso de toma de decisiones, se utiliza la función fitness, clasificando todos los objetos del juego en la pantalla. En la parte superior de la lista está el objetivo principal, y cuando cambia, el bot cambia su estrategia. Por ejemplo, CastlevaniaBot podría prepararse para golpear las velas cuando un murciélago vuela hacia el marco. Dependiendo de la distancia al bate, CastlevaniaBot puede reaccionar cambiando de una estrategia de vela a una estrategia de murciélago. Destruyendo el murciélago, continuará trabajando con velas.

Antes de decidir cambiar, CastlevaniaBot revisa su objetivo y estrategia actuales. Si no tiene éxito, puede estar atrapado en un ciclo interminable, alternando entre dos objetivos con igual o casi igual prioridad. Para evitar esto, cuando aparece un nuevo objetivo principal, que tiene una prioridad ligeramente mayor que el objetivo actual, CastlevaniaBot puede decidir continuar con la estrategia actual.

Algunas estrategias se lanzan automáticamente cuando caen en un área determinada. Por lo general, están destinados al procesamiento simultáneo de varios objetos del juego. Por ejemplo, en un corredor con un montón de cabezas de medusas voladoras, es mejor seguir adelante y no apuntar a cada cabeza individualmente.

Algunas estrategias pueden variar según el arma secundaria actual y la cantidad de corazones recolectados, en particular en las peleas de jefes. CastlevaniaBot está tratando de tomar la mejor decisión en función de las herramientas que tiene y la situación actual.



Planificando un mundo de 8 bits


Cuando trabajo en tales proyectos, busco principalmente simplificar la tarea. Me imaginé cómo sería Castlevania si no hubiera enemigos, velas o elementos para recoger en los niveles. Todo lo que se necesitaría en este caso es simplemente llegar desde el principio hasta el final del nivel. Me preguntaba: si puedo enseñarle al bot cómo hacer esto, ¿qué tan difícil será destruir a varios enemigos en el camino?

Para enseñarle al robot a moverse, necesitaba mapas de fondo en mosaico y una comprensión de cómo están organizados los niveles. El juego consta de seis niveles, cada uno de los cuales termina con un jefe.


Cada nivel se divide en 3 o 4 etapas. Los escenarios generalmente están separados por puertas de madera que se abren con un crujido y un golpe detrás de la espalda del jugador.


Las puertas son puntos de control (puntos de control). Si un jugador es asesinado, entonces regresa al comienzo de la etapa, pero solo si no ha terminado su vida. Si continúa el juego después de Game Over, entonces el jugador es enviado al comienzo del nivel.

El número de etapa indica el número total de puntos de control completados desde el inicio del juego. La última etapa es la número 18. Pero si matas a Drácula, entonces el juego comienza desde el principio en modo difícil, y el número de etapas continúa aumentando a 19 y más. Si pasas por el modo difícil, el tercer ciclo del juego no se vuelve más difícil, pero el número de etapas sigue aumentando.


Cada etapa consta de una o más barras de desplazamiento horizontal del fondo, lo que yo llamo "subpasos". Si sale de la pantalla a lo largo de las escaleras que conducen hacia arriba o hacia abajo, el juego se mueve de una sub-etapa a otra, y no se desplaza verticalmente.


El juego usa 3 bytes para rastrear el número del ciclo del juego, el número de etapa y el número de sub-etapa. El ciclo del juego en el modo normal (Modo normal) tiene un valor de 0; los valores de 1 y superiores indican el modo difícil. Independientemente del ciclo del juego, los pasos siempre tienen una numeración de 0 a 18. Y los subpasos siempre tienen un valor de 0 o 1, porque los pasos nunca contienen más de 2 franjas horizontales. CastlevaniaBot rastrea estos bytes para saber dónde está.

Para mi conveniencia, grabé la tira de fondo de cada sub-etapa en un archivo gráfico separado. Si necesitara encontrar las coordenadas exactas de un objeto, entonces podría resolverlas rápidamente usando un editor gráfico. Grabé los archivos usando la herramienta Map Maker integrada en Nintaco. Lo encendí y luego pasé por todo el juego. Algunas de las imágenes resultantes contenían varios subpasos conectados entre sí, que eran fáciles de separar.

Creador de mapas de Nintaco

Después de examinar las imágenes de fondo, me di cuenta de que los únicos mosaicos importantes son las plataformas y las escaleras. Todo lo demás puede considerarse espacio vacío. Las escaleras son de dos tipos: hacia adelante o hacia atrás (se pueden representar como los bordes izquierdo y derecho de un triángulo isósceles). A veces las escaleras terminan con una plataforma sobre la cual el jugador puede caminar.


Solo hay 5 tipos importantes de fichas, y en cada nivel tienen una apariencia diferente. Los copié y los pegué en archivos de imagen de 16 × 16 separados. Luego escribí un programa comparando cada mosaico en cada subpaso con el conjunto correspondiente de imágenes. Entonces obtuve los tipos de matriz de mosaicos para todos los subpasos.

Las matrices podrían extraerse directamente de la ROM, pero no pude encontrar la documentación sobre cómo y dónde se almacenan los datos. Como el espacio ROM es limitado, los datos de nivel generalmente se presentan en una forma comprimida que se asemeja a un formato de gráficos vectoriales. Cada juego usa su propio formato, por lo que no consideré necesario realizar una investigación, porque tenía Map Maker. Además, todavía necesitaba imágenes gráficas de los subpasos. Si no hubiera capturado las franjas de los fondos, tendría que escribir un programa que genere imágenes a partir de matrices.



Encontrar el camino


Después de crear las matrices, quería aplicar el algoritmo de búsqueda de ruta, a saber, el algoritmo de Floyd-Warshall , que proporciona la tabla de salida que contiene las rutas más cortas entre cada uno de los pares de vértices del gráfico dirigido con bordes ponderados. La idea era precalcular tablas y escribirlas en archivos, y luego cargarlas durante el juego. Con tablas en la memoria, el bot puede buscar y descubrir instantáneamente el camino más corto entre dos mosaicos de plataforma.

El gráfico consta de aristas y vértices. Si los mosaicos de la plataforma son vértices, los bordes son solo aquellas operaciones que Simon puede realizar para moverse de una plataforma a otra. Las operaciones realizadas dentro de un solo mosaico están prohibidas. Por ejemplo, en un plano de mosaicos, Simon solo puede mover un mosaico a la izquierda o un mosaico a la derecha.


Del mismo modo, si Simon está en las escaleras, puede mover una ficha en una de las dos direcciones posibles.


Estas son operaciones válidas. Pero acciones como moverse desde el punto medio del mosaico hasta el borde del mosaico son demasiado fraccionales, porque no corresponden a la transición de un vértice del gráfico a otro.

Además de caminar de izquierda a derecha, bajando y subiendo escaleras, Simon puede saltar a otra casilla. Y puede saltar hacia la izquierda o hacia la derecha, comenzando desde cualquiera de los 16 píxeles de la superficie del mosaico. Para reducir el número de bordes en el gráfico (y el tamaño de la tabla de búsqueda), consideré solo cinco posibles puntos de repulsión:


Añadiendo la operación "no hacer nada", obtuve 15 operaciones. Todos ellos son lo suficientemente simples como para que el bot pueda determinar fácilmente la secuencia de pulsaciones de botones necesarias para su ejecución durante la ejecución del juego.

Para construir un gráfico completo, creé una simulación muy simple de la física del mundo de Simon. En esta simulación, las 15 operaciones se realizan a partir de cada mosaico de la plataforma. El gráfico se construye simplemente observando dónde está Simon. Más específicamente, al especificar las coordenadas iniciales y la operación, la simulación proporciona las coordenadas finales en la salida. Si no hay coordenadas finales, por ejemplo, cuando Simon intenta meterse en una pared o en un agujero, el programa devuelve que la operación no es válida y que este borde no forma parte del gráfico.

Para crear esta simulación, se requirió un estudio exhaustivo de Simon Belmont. A diferencia de otros juegos de plataformas clásicos, donde el jugador puede acelerar de caminar a correr, Simon, cuando se mueve horizontalmente, siempre se mueve exactamente 1 píxel por cuadro. Esto es cierto para caminar, saltar, subir escaleras, e incluso al retroceder al atacar a los enemigos.

Limitar la velocidad horizontal simplifica enormemente el reconocimiento de barreras. El juego comprueba si hay una pared en un píxel delante del personaje y, si es necesario, detiene el movimiento. La prueba se realiza por debajo del nivel de la cabeza, lo que permite que la cabeza pase bajo techos bajos sin interferir con el movimiento horizontal.

El movimiento vertical es un poco más complicado. Si Simon sale del borde de la plataforma, en lugar de una aceleración gradual, cae instantáneamente a una velocidad de 8 píxeles por fotograma. Dado que cada mosaico tiene una altura de 16 píxeles (que es un múltiplo de 8), el reconocimiento del suelo se simplifica. Al mismo tiempo, el jugador mantiene una velocidad horizontal de 1 píxel por cuadro en la dirección obtenida inmediatamente antes de la caída.

El sprite de Simon tiene 16 píxeles de ancho y, sin embargo, puede desplazarse sobre el bloque un máximo de ± 4 píxeles desde su punto medio. Si te mueves un poco más, caerá debajo.


Curiosamente, si abandona la plataforma y cae exactamente 1 ficha a una velocidad de 1 píxel horizontal y 8 verticales por cuadro, no se parará en el bloque al aterrizar. Una de sus piernas permanecerá dentro de la pared a una profundidad de 2 píxeles.


Después de eso, podrá salir de la pared, pero no entrar en ella.

Simon no puede cambiar de dirección durante el salto. Después de presionar el botón A, hace un camino fijo a lo largo de la parábola.


En la parte superior, Simon se eleva 36 píxeles, lo que le permite saltar a plataformas de 2 fichas de altura. Y la parte superior de la "parábola" es sorprendentemente plana. Parece que se congela en el espacio durante 9 fotogramas completos, posiblemente para simplificar los golpes de látigo en el aire. Si Simon no tiene nada para aterrizar, entonces el movimiento de la parábola continúa hasta que regrese a su altura original. Después de eso, comienza a caer a una velocidad de 8 píxeles por fotograma, es decir, con la misma velocidad constante de caída desde la plataforma.

Cuando hay una plataforma directamente encima de la cabeza del personaje, no se permite saltar.


De lo contrario, él "salta" parcialmente en los azulejos de la plataforma.


Como se dijo anteriormente, si Simon toca más que la parte superior de su cabeza, deja de moverse horizontalmente. Esto es bastante molesto al final de la primera etapa del nivel 4, cuando el jugador está tratando de salir de la cueva.


Las escaleras le permiten moverse libremente verticalmente entre plataformas.


En un caso, Simon sube las escaleras y pasa a través de la plataforma. Estando en las escaleras, puede pasar libremente a través de la pared.


En las plataformas móviles de nivel 4, el jugador generalmente se agacha debajo de estalactitas bajas. Sin embargo, puedes levantarte y descansar contra ellos. En tal situación, el juego restringe el movimiento horizontal, arrastrando rápidamente a Simon a una trampa de agua.


Un simulador de física que genera gráficos orientados considera a Simon un rectángulo. El movimiento de este rectángulo está limitado por las reglas de movimiento descritas anteriormente. Para que el robot no salte de un lugar a otro como un conejo, se asignó a los bordes de los saltos del conteo un costo más alto que los bordes de caminar y moverse por las escaleras.

La tabla generada por el algoritmo de búsqueda de ruta contiene la distancia más corta para cada mosaico inicial y final (costo total de la ruta) y una descripción del primer paso de la ruta. Esta descripción incluye la primera operación que debe realizarse en esta ruta, y el mosaico en el que estará el personaje después de que se complete. Todo el camino se puede recrear mediante búsquedas repetidas en la tabla, cada una de las cuales da el siguiente paso en la dirección del mosaico final.

En algunos pasos secundarios, las columnas no están completamente conectadas. Por ejemplo, en el nivel 4, las plataformas son la única forma de cruzar el abismo. En tales pasos secundarios, la tabla contiene métodos para moverse por cada una de las islas, pero no entre ellas.


Algunos bloques destructibles contienen objetos ocultos. Y la destrucción de los bloques cambia este gráfico. Para evitar este problema, se aplicó un algoritmo para encontrar rutas con y sin bloques divididos a los subpasos. En tiempo de ejecución, CastlevaniaBot supervisa los estados de los bloques que se dividirán y utiliza la tabla de búsqueda adecuada.




Estado del juego


CastlevaniaBot se integra en Nintaco a través de su API . Registra la implementación de FrameListener para recibir un retorno en cada marco. Dado que el emulador funciona a aproximadamente 60 cuadros por segundo, este oyente debe ser devuelto a tiempo; los cálculos largos o el tiempo de inactividad ralentizarán o bloquearán el emulador. En un corto período de tiempo, CastlevaniaBot lee el estado del juego, determina su objetivo principal, cambia las estrategias si el objetivo ha cambiado y cumple con la estrategia actual.

CastlevaniaBot lee el estado actual de Simon Belmont directamente desde la RAM del procesador. Pero no puedo determinar cómo se representan otros objetos del juego en la memoria. Por lo tanto, CastlevaniaBot lee directamente de la memoria de los atributos de los objetos (Object Attribute Memory, OAM), un área que almacena una lista de sprites mostrados.


Esta técnica funciona y generalmente es aplicable a otros juegos, pero tiene muchos inconvenientes. El orden de los sprites en OAM cambia constantemente. Si hay varias instancias del mismo tipo de enemigo en la pantalla al mismo tiempo, entonces la única forma de rastrearlos es determinar su proximidad, comparar las últimas coordenadas del sprite con las coordenadas del cuadro anterior.


Algunos objetos del juego consisten en sprites repetitivos, como torres de huesos.


Las plataformas móviles consisten en un sprite que se repite 4 veces.


La clasificación de ambos casos requiere una lógica adicional, que es fácil de implementar. Las actualizaciones de armas secundarias y algunos tipos de armas secundarias usan los mismos sprites. Peor aún, en el nivel 5, los Caballeros toman prestados los sprites de arma secundaria de Simon.


Afortunadamente, con la excepción del agua bendita, CastlevaniaBot solo usa armas secundarias donde las actualizaciones generalmente no están disponibles, como en las peleas de jefes. Y el sprite de actualización de agua bendita es diferente del sprite utilizado al lanzarlo.


Algunos objetos del juego parpadean durante la creación, por ejemplo, bolas de cristal al final de las peleas de jefes, trenzas de la muerte y el cuerpo de Drácula. Los sprites intermitentes aparecen y desaparecen de OAM, por lo que se requiere lógica adicional para rastrear estos objetos.


También vale la pena señalar que debido a limitaciones de hardware, NES solo puede mostrar 8 sprites por línea de trama. Dado que la prioridad de los sprites depende en parte de sus índices en OAM, el orden en cada cuadro se mezcla aleatoriamente para evitar un cambio que hace que un sprite sea invisible constantemente. Varios sprites parpadean a su vez, cambiando gradualmente su prioridad. Este parpadeo no afecta la lectura de sprites de OAM. Los datos aún permanecen allí, pero el hardware emulado no los muestra. Esto difiere de la situación descrita anteriormente con parpadeo al crear sprites. Además, Nintaco tiene una opción que reduce significativamente la actualización del hardware.


Y finalmente, una pequeña parte del estado del juego se lee de las tablas de nombres de PPU, un área de memoria que contiene todos los datos de fondo. Esto incluye verificar bloques destructibles y rastrear las posiciones del "enamoramiento" en el nivel 2.




Máquinas de estado heurísticas


Las estrategias son máquinas de estado. CastlevaniaBot los define como una clase abstracta con métodos init y step . Se llama al método init cuando CastlevaniaBot cambia a la estrategia apropiada, permitiendo que la máquina de estado se reinicie. Y el método de step ejecuta la estrategia. Por ejemplo, el método de estrategia step para personas de peces verifica si un pez está dentro del rango de un látigo, y si es así, el bot golpea con un látigo. De lo contrario, verifica si es posible alcanzar la distancia de ataque con un salto, y si es así, el bot salta. Y finalmente, si el bot está demasiado cerca del enemigo, entonces se aleja de él. Con estas simples reglas, CastlevaniaBot derrota al pez humano.

Para simplificar las estrategias de escritura tanto como sea posible, creé una biblioteca de posibles acciones a realizar. Por ejemplo, en lugar de presionar y soltar el botón A para saltar, el bot simplemente llama al método de salto desde la biblioteca. Y antes de eso, le pregunta a la biblioteca si Simon está en la plataforma y puede saltar.

Acercarse y alejarse del objetivo son acciones estándar realizadas utilizando operaciones de la tabla creada por el algoritmo de búsqueda de ruta. Por ejemplo, la estrategia de vela utiliza el método de biblioteca routeAndFace , que no solo dirige a Simon a las coordenadas especificadas, sino que también lo gira hacia la izquierda o hacia la derecha después de presionarlas. Además, dependiendo de la altura de las velas, la estrategia realiza un salto o una sentadilla antes de golpear un látigo. Un objeto que ha caído de las velas se creará en el aire y caerá o caerá lentamente al suelo. Una estrategia de recogida dirige a Simon a la casilla más cercana directamente debajo de él antes de que el objeto toque el suelo.

Para alejarse de los enemigos, la biblioteca necesita saber cómo moverse hacia la izquierda o hacia la derecha sin caer en los pozos. En general, esto se logra buscando rutas a los bordes izquierdo o derecho de la sub-etapa. Pero en algunas áreas, el camino más corto hacia el borde izquierdo inicialmente requiere moverse hacia la derecha, y viceversa. Cuando aparecieron tales problemas, agregué lógica específicamente para las sub-etapas, dirigiendo a Simon a los bordes izquierdo y derecho de la plataforma actual.



Tutorial


En esta sección, describiré en detalle las estrategias utilizadas por CastlevaniaBot, comentando todo el tutorial.

El juego comienza en el patio frente al castillo. Los objetos en el marco están dispuestos para seleccionar el objetivo principal, que en este caso es una columna con una llama. La estrategia de columna le dice al bot que se acerque a la columna y use el látigo cuando esté al alcance.


Después de golpear el látigo y destruir la columna, se crea un elemento. La prioridad de todos los artículos es mayor que la de las columnas de llama. En consecuencia, CastlevaniaBot reacciona a esto usando una estrategia para recolectar el elemento que aparece antes de pasar a las siguientes columnas.

Al clasificar objetos, CastlevaniaBot siempre tiene en cuenta un objetivo a largo plazo: completar un nivel antes de que se agote el tiempo. Al crear una lista de objetivos potenciales, siempre se le agrega una puerta al siguiente nivel. A la puerta se le asigna una prioridad baja, pero después de la destrucción de todas las columnas y la colección de todos los objetos, se convierte en una prioridad. Con solo una excepción: CastlevaniaBot sabe cómo descubrir todos los tesoros escondidos y salta sobre la entrada del castillo para crear una bolsa de dinero parpadeante.


Después de entrar en el castillo CastlevaniaBot ve fantasmas y velas. Las velas y los artículos hechos a mano tienen prioridad hasta que los fantasmas se acercan.


A menudo parece que el látigo destruye a los enemigos sin tocarlos. Encontré una tabla rectangular de colisión en la ROM del juego, por lo que CastlevaniaBot sabe exactamente cuándo algo está dentro del alcance del látigo. Y dado que los rectángulos de colisión a menudo sobresalen un poco más allá de los límites de los sprites, el látigo puede golpear la "parte invisible".

En la mayoría de los casos, al destruir velas, CastlevaniaBot salta verticalmente, en lugar de avanzar. Esta es una táctica para evitar riesgos. Dado que está en el aire, es imposible cambiar la dirección del movimiento, una multitud de enemigos que se aproximan puede complicar un aterrizaje seguro o hacerlo imposible. Además, con un salto vertical, CastlevaniaBot permanece en el mismo bloque; no necesita verificar si el salto provocará una caída en la plataforma inferior o en el fondo del pozo.

Cuando no hay velas para destruir ni objetos para recolectar, CastlevaniaBot comienza a perseguir fantasmas. Pero la "Estrategia Pantera" le ordena quedarse quieto, esperando que el enemigo caiga dentro de los límites de un golpe de látigo.


Además del hecho de que las velas sirven como fuentes de corazones y otros objetos, guían al jugador a lo largo del escenario. Por ejemplo, en la imagen a continuación, las velas en la esquina superior derecha "invitan" al jugador a subir las escaleras. Sin embargo, para subir las escaleras, el jugador inicialmente debe ir a la izquierda, por lo que las velas desaparecen de la pantalla. Dado que las soluciones CastlevaniaBot se basan en la priorización de objetos visibles en la pantalla, esta situación puede conducir a un ciclo interminable en el que el bot selecciona alternativamente el camino más corto hacia las velas (a la izquierda) o el camino más corto hacia la puerta de salida (a la derecha).


Problemas similares pueden resolverse de varias maneras. Por ejemplo, CastlevaniaBot puede equiparse con objetos de almacenamiento, entendiendo que los objetos continúan existiendo, incluso si no son visibles. Pero para esto, de todos modos, desde el principio necesitan ser vistos. Si las velas estuvieran aún más a la derecha, luego de su detección, sería necesario retroceder aún más.

Con esto en mente, agregué incentivos que empujan a CastlevaniaBot a explorar áreas del escenario que normalmente ignoraría. Estos incentivos funcionan de manera similar a las puertas de salida, atrayendo a CastlevaniaBot a donde debe ir. Además, agregué reglas que lo hacen ignorar velas y objetos que están demasiado lejos (en términos de distancia recorrida, y no en línea recta).

Después de subir las escaleras y destruir las velas, se crea agua bendita, la más valiosa de todas las armas secundarias. CastlevaniaBot lo selecciona intercambiando una daga por él.


Al igual que con la bolsa de dinero al comienzo del juego, CastlevaniaBot conoce todos los bloques destructibles con objetos ocultos, y para destruir bloques con un látigo, utiliza una estrategia similar a la estrategia para las velas.


Con un mayor movimiento de CastlevaniaBot, notará que comienza a usar agua bendita para destruir fantasmas y velas. Esto puede parecer redundante, pero tiene un propósito importante. Castlevania recompensa a los jugadores por usar armas secundarias con doble y triple exposición. En otras palabras, CastlevaniaBot realiza actualizaciones de armas secundarias.


Después de presionar el botón B, hay un retraso de 16 cuadros antes de golpear un látigo. El látigo permanece largo durante 10 fotogramas adicionales, pero solo es válido en el primero de estos diez. CastlevaniaBot usa este hecho para mejorar la puntería. En particular, rastrea la velocidad de todos los objetos en el cuadro, suponiendo que el objetivo principal continuará moviéndose a lo largo de una ruta lineal. Luego presiona el botón B 16 cuadros antes de que el objetivo se encuentre con un látigo. El enemigo siempre puede cambiar de dirección durante estos 16 cuadros, pero por lo general esta simple heurística funciona.

Sin embargo, después de pasar por la puerta, CastlevaniaBot se encuentra con murciélagos rojos. Al igual que las cabezas de medusa, los murciélagos rojos vuelan a través de la pantalla, volando a través de una sinusoide a través de plataformas y escaleras. Para predecir dónde estará el bate rojo después de 16 cuadros, grabé el movimiento de uno de ellos en una tabla. Durante la ejecución del juego, CastlevaniaBot rastrea los murciélagos y espera los picos o mínimos de la trayectoria donde la velocidad vertical cambia su signo. Luego puede comparar las coordenadas con los valores en una tabla pre-creada. Esto permite que la estrategia adecuada golpee al bate rojo con un látigo, se doble o rebote sobre él.

Durante el paso (speedrana) de Castlevania, los jugadores realizan maniobras que hacen que el juego sea lo más determinista posible. Por ejemplo, descubrieron que si al final del nivel 1 destruir un bloque y recoger una mejora de arma en una determinada secuencia de tiempo, el jefe se comportará de acuerdo con el patrón deseado, lo que le permitirá derrotar rápidamente.

No importa cuán experimentadas sean las personas, no pueden domesticar completamente el generador de números aleatorios. Sin embargo, dado que CastlevaniaBot puede controlar las pulsaciones de los botones con precisión cuadro por cuadro, puede llevar el concepto de paso de velocidad a su límite, cada vez que pasa el juego de una manera absolutamente idéntica. Si lo hiciera, no sería mejor que pasar TAS . Por lo tanto, CastlevaniaBot agrega arbitrariamente errores y retrasos a sus acciones utilizando un generador externo de números aleatorios para evitar un juego determinista. Por ejemplo, cuando golpea con un látigo una vela ubicada en lo alto, agrega deliberadamente un retraso para un número aleatorio de fotogramas al salto y golpe. Estos pequeños cambios afectan significativamente el progreso del juego.

Aunque CastlevaniaBot busca evitar el determinismo, sin embargo, tomó prestado un concepto de la velocidad: el aumento de daños . En el 50% de los casos, CastlevaniaBot evita por completo el paso del calabozo de los peces humanos saltando de nuevo al murciélago rojo, que lo arroja a una plataforma inalcanzable.


En la otra mitad de los casos, CastlevaniaBot elige pelear con peces humanos. Sus bolas de fuego tienen alta prioridad y CastlevaniaBot los golpea con un látigo, esquiva o rebota dependiendo de la situación.


Debido a la imprevisibilidad de crear enemigos y sus bolas de fuego, la mayoría de los jugadores suelen jugar una parte con peces humanos. Pero CastlevaniaBot pasa tiempo con ellos, recoge todos los corazones e incluso un tesoro escondido en el extremo derecho. El bot sabe exactamente qué elementos están contenidos en cada vela, y dado que prefiere usar agua bendita, omite las velas en las que están ocultos los cronómetros. Sin embargo, si te quedas en esta parte y peleas con los peces, a veces inevitablemente puedes tomar un cronómetro.

Las etapas a menudo terminan con cruces que destruyen a todos los enemigos en la pantalla. En caso de que tenga curiosidad, diré que las cruces no pueden matar a los jefes al final de un nivel. De hecho, las cruces a veces se crean incluso durante las peleas de jefes. Por ejemplo, en la batalla con Medusa, a veces aparecen cruces al matar serpientes. Pero estas cruces solo pueden matar a otras serpientes.


Después de pasar por la puerta, CastlevaniaBot se encuentra con fantasmas nuevamente. En la captura de pantalla a continuación, quiere saltar a la plataforma inferior, pero los fantasmas le impiden moverse. Cuando una tabla creada por un algoritmo de búsqueda de ruta le dice a CastlevaniaBot que salte, examina el espacio alrededor de la plataforma objetivo. Si resulta que aterriza en enemigos, entonces el salto no se realiza. En este caso, este mecanismo hace que CastlevaniaBot espere a que los fantasmas liberen su lugar.


Esta regla de "buscar enemigos antes de saltar" ilustra uno de los principios de la estructura de CastlevaniaBot: debe regirse por reglas simples y lo más generalizadas posible. En algunas partes del juego, es necesario utilizar estrategias únicas que resuelvan problemas muy específicos. Pero en la mayor parte del juego, las acciones de bot son impulsadas por heurísticas reutilizables. No escribí un equipo que lo hiciera detenerse en ese punto en particular y esperar a que los fantasmas se salieran de su camino. Este comportamiento surgió como resultado de la heurística.

CastlevaniaBot completa el nivel matando al Murciélago Fantasma con triple agua bendita. Pero su estrategia de ataque está determinada por su arma secundaria. De hecho, si no tenía un arma secundaria, estaba listo para matar al jefe con un solo látigo. Un caso particularmente interesante es el asesinato de un Murciélago Fantasma con un hacha. De manera similar al caso con el murciélago rojo, grabé en la tabla el movimiento del hacha a lo largo de la parábola. Durante la ejecución del juego, CastlevaniaBot realiza un desplazamiento de la mesa al combinarlo con cada una de las baldosas. Esto le permite calcular el punto óptimo para matar al jefe con un hacha.


Justo antes de recoger la bola de cristal, CastlevaniaBot lanza el arma secundaria en diferentes direcciones, sabiendo que se congelará en el aire después de tocar la bola. Luego salta al azar repetidamente y golpea con un látigo, esperando congelarse en una pose extraña.


Al comienzo del nivel 2, CastlevaniaBot evita las primeras velas en las que se oculta el boomerang. La estrategia de trabajar con un caballero lancero es una campaña contra las estrategias de los fantasmas o los peces, pero este es el primer enemigo en matar que necesita dos golpes. El murciélago negro está durmiendo la siesta hasta que te acercas a él, después de lo cual despega y se mueve lo suficientemente lineal como para ser asesinado con un látigo usando la heurística simple mencionada anteriormente.


Habiendo destruido los ladrillos de la pared, en el 50% de los casos, CastlevaniaBot parece salir de la habitación sin levantar su corona. ¿Pero es así? De hecho, en tales casos, él levanta la corona, usando el error del juego. Dado que el extremo de la escalera superior coincide horizontalmente con la ubicación de la corona, el jugador, cuando pasa hacia arriba y detrás de la pantalla, está momentáneamente abajo. Si escuchas el sonido o miras las gafas, puedes ver que el bot realmente toma la corona.


En el nivel 2, los enemigos no atacan al jugador cuando está en una plataforma en movimiento. CastlevaniaBot solo tiene que esperar a que se acerque la plataforma, ingresar a la plataforma, esperar a que llegue al otro lado y luego bajarse. Hay una ligera variación para las plataformas que no tocan fichas por otro lado. En tales casos, CastlevaniaBot no desciende, sino que salta de la plataforma.


Una puerta conduce a un corredor lleno de cabezas voladoras, y CastlevaniaBot reacciona a esto avanzando. Como es el caso con las plataformas móviles, CastlevaniaBot sabe que esta estrategia debe aplicarse en función de su posición, en lugar de priorizar los objetos de juego en la pantalla. Sin embargo, tan pronto como todas las cabezas de las medusas pasan volando, vuelve a esta técnica para elegir la estrategia que se utilizará más.


Otra estrategia, dependiendo de la posición, se activa después de subir la siguiente escalera que conduce al área llena de cabezas de medusa. En el 50% de los casos, CastlevaniaBot salta intencionalmente sobre la cabeza de una medusa para obtener un aumento de daño, empujándola hacia la plataforma superior al lado de la puerta que conduce a la siguiente etapa. Estos son los dos únicos aumentos de daño que CastlevaniaBot conoce. A diferencia de los corredores de velocidad, no lo ejecuta para ahorrar tiempo, esta es solo otra contribución al no determinismo del pasaje.


Pasar por el flechazo es una estrategia interesante basada en la posición, repetida tres veces. CastlevaniaBot espera hasta que el "enamoramiento" más cercano a la izquierda alcance la posición deseada, después de lo cual lo atraviesa. Después de pasarlo, se detiene, gira, golpea las velas con un látigo, recoge el objeto creado y repite la operación con el "aplastamiento" posterior. Uno de los objetos podría ser agua bendita, por lo que siempre destruye estas velas.


Después del "aplastamiento", aparecen por primera vez fantasmas y torres de huesos. Los fantasmas son muy fáciles de apuntar, pero para matarlos necesitas algunos golpes. Es aún más fácil apuntar a las torres de huesos porque no se mueven. Se usa la misma estrategia para sus bolas de fuego que para las bolas de peces-humanos.


El nivel 2 generalmente termina con CastlevaniaBot matando instantáneamente a Medusa con un flujo interminable de agua bendita. Sin embargo, está listo para trabajar con cualquier otro tipo de arma secundaria.


En el nivel 3 aparecen los puentes. CastlevaniaBot reacciona a ellos esperando que salten a los límites del látigo. Si los saltadores saltan al jugador, CastlevaniaBot se mueve en la dirección opuesta y los golpea con un látigo antes de que toquen el suelo.


Luego aparecen esqueletos blancos. Tienen un patrón muy aleatorio. Además, tiran huesos. En el nivel 3, CastlevaniaBot intenta evitar ser golpeado. Pero descubrí que en los niveles posteriores, los huesos solo distraen, y será más eficiente simplemente ignorarlos. La estrategia de CastlevaniaBot para los esqueletos blancos es simplemente vencerlos.


CastlevaniaBot espera a que los cuervos vuelen. Luego, basándose en la altura del cuervo en relación con el jugador, calcula con precisión cuándo golpear con un látigo después del salto.


Después de pasar a la siguiente etapa, CastlevaniaBot golpea independientemente las velas de las que aparece el cronómetro y luego espera hasta que desaparezca. Un poco más adelante y detrás de la pantalla hay un cuervo. El bot destruye velas antes de una pelea de cuervos para reducir el riesgo de golpearlas accidentalmente y obtener armas secundarias no deseadas.


Justo en frente de la ubicación de las momias, CastlevaniaBot va a la izquierda en la plataforma para provocar la aparición de una bolsa de dinero oculta. Lo hace simplemente por interés, porque no puede levantarlo de ninguna manera.


A continuación, CastlevaniaBot golpea intencionalmente las velas de las que cae la daga. Como en el caso del cronómetro, hace esto para no levantarlo por casualidad durante las acciones posteriores.


Y finalmente, las momias son derrotadas por la lluvia del agua bendita.


CastlevaniaBot está listo para usar cualquier arma secundaria para luchar contra todos los jefes. De hecho, las estrategias para usar armas secundarias cambian completamente si, por alguna razón, se destruye un bloque que contiene un pedazo de carne de cerdo. Sin este bloque, es imposible subir a la plataforma superior, por lo que debes luchar en el nivel inferior.

En el nivel 4, las plataformas móviles están regresando. Y esta vez hay una posibilidad de que aparezcan murciélagos rojos en el camino. Para reducir la probabilidad de su ataque, espera que la llegada de la plataforma coincida con la destrucción del murciélago rojo. Dado que los ratones rojos aparecen a intervalos fijos, esto le da a CastlevaniaBot suficiente tiempo para cruzar el pozo de agua sin murciélagos. Él está listo para lidiar con murciélagos y aparecer peces al azar mientras está en la plataforma, pero esto hace que saltar hacia y desde la plataforma sea muy peligroso. La estrategia utilizada por CastlevaniaBot aumenta la probabilidad de su éxito.


La misma estrategia se repite en el medio del escenario. Esta vez, el salto a la plataforma en movimiento es mucho más largo, por lo que es fundamental destruir el bate rojo antes del salto.


Como se muestra en la captura de pantalla anterior, las velas siempre se encuentran a una distancia de 64 píxeles entre sí. Quizás esto es un artefacto del hecho de que los datos de nivel se presentan en ROM en un formato similar a los gráficos vectoriales, ahorrando espacio. Pero por alguna razón, los diseñadores decidieron alinear las velas no con los centros, sino con los bordes de las baldosas. En este caso, las velas están alineadas con ambos extremos de la plataforma. Por lo tanto, después de golpearlos, un objeto que aparece puede caer directamente en el abismo debajo de ellos.

Creo que en algún momento, los diseñadores se dieron cuenta de este problema. Pero para entonces, cambiar toda la serie de velas en todos los niveles terminados para alinearlas con los centros de las baldosas podría causar otros problemas. En cambio, decidieron cambiar aleatoriamente las velas un píxel a la derecha o izquierda de donde fueron creadas. Por lo tanto, después de golpear las velas en el lado derecho de la captura de pantalla, hay un 50% de posibilidades de que el agua bendita contenida en ellas caiga en la plataforma. En la mitad restante de los casos, cae al agua.

CastlevaniaBot generalmente evita por completo estas velas porque conserva con éxito el agua bendita. Pero si lo necesita, entonces se levanta muy cerca de estas velas para garantizar la selección del agua bendita que ha caído de ellas.

A continuación, CastlevaniaBot se encuentra con un montón de puentes. En esta área, después de matar puentes, a menudo aparecen hachas. CastlevaniaBot los evita, porque el agua bendita es especialmente útil cuando se lucha contra el jefe.


Al pasar a la última etapa del nivel, CastlevaniaBot ignora por completo al dragón de hueso.


Pero se deshace de los siguientes dos con rápidos golpes de látigo.


El monstruo de Frankenstein e Igor son destruidos por una corriente constante de golpes con un látigo y agua bendita. Al igual que con otros jefes, CastlevaniaBot también puede manejar otras armas secundarias, o sin ellas. Sin embargo, las posibilidades de supervivencia sin agua bendita disminuyen.


En el nivel 5, CastlevaniaBot nuevamente trata con esqueletos blancos. Pero esta vez, usa variaciones de estrategia que rara vez se ven en el nivel 3. Dependiendo de dónde aparezcan, CastlevaniaBot arroja agua bendita y luego retrocede para quemar los esqueletos en llamas. Cerca de las escaleras, pasa debajo de los esqueletos para dirigirlos a donde deberían estar.


En el nivel 5, aparecen por primera vez esqueletos rojos renacidos. CastlevaniaBot rastrea el momento del último golpe en ellos, para saber cuándo es seguro atravesar los huesos rojos.


La primera sala de la etapa 14 está completamente procesada por una gran estrategia. CastlevaniaBot primero mata al saltador. Luego espera a que el caballero inferior arroje el hacha, golpea el hacha con un látigo y sube lentamente las escaleras inferiores. Esto empuja al caballero inferior detrás de la pantalla, lo que lleva a su desaparición. Luego espera hasta que el área superior esté libre de hachas, golpea las velas y recoge los objetos que aparecieron. Luego se acerca a la base de las escaleras que conducen al caballero superior. Cuando el caballero superior arroja el hacha en alto, CastlevaniaBot corre tras él. Esto empuja al caballero superior hacia la izquierda y casi completamente desde la pantalla, pero no lo destruye. CastlevaniaBot se dobla debajo del hacha que regresa, y posiblemente debajo del segundo hacha abandonada, y finalmente se acerca a las escaleras hacia la siguiente sub-etapa. ¡Hurra!


Después de pasar varias escaleras, CastlevaniaBot nuevamente se encuentra con un caballero con un hacha. Él usa agua bendita para aturdirlo, y luego lo termina con un látigo. Si no hay agua bendita, continúa golpeando con un látigo, persiguiendo al caballero hasta que muere.


Subiendo las escaleras del nivel 5, CastlevaniaBot a menudo tiene que esperar a que el esqueleto rojo se aleje de la parte superior o inferior de las escaleras. Hacia el final del nivel, la torre de hueso hace que esta tarea sea aún más difícil. Dependiendo de cómo los esqueletos decidan moverse, CastlevaniaBot baja y sube las escaleras hasta que pueda pasar.


Para procesar grupos de esqueletos rojos, se requiere lógica adicional para que el bot no caiga en un bucle sin fin. Si CastlevaniaBot los golpeará por separado con un látigo, de modo que el primer golpe tenga tiempo de revivir, entonces caerá en un ciclo donde continuará destruyendo esqueletos que resucitan sin cesar. Para evitar esto, CastlevaniaBot no golpeará con un látigo de un esqueleto rojo parado junto a una pila de huesos rojos. Esta regla permite que los huesos rojos vuelvan a nacer junto al esqueleto rojo aún vivo, lo que hace posible golpearlos a ambos al mismo tiempo. Sin un intervalo entre su destrucción, no se creará un ciclo.


Para evitar las cabezas de medusa en el largo corredor que conduce a la Muerte, el robot nunca se detiene, aturdiendo a los caballeros que generalmente aparecen en el camino. Aprovecha el hecho de que el jugador puede atravesar enemigos aturdidos por el agua bendita sin recibir daño.


Si no hay agua bendita, justo enfrente del corredor CastlevaniaBot puede tomar un boomerang. Con un conjunto exitoso de circunstancias, lo usa para destruir a los caballeros, así como para obtener mejoras de armas.


CastlevaniaBot aturde a la muerte con agua bendita antes de que empiece a hacer trenzas, matándola rápidamente. También puede vencer a la Muerte con un triple boomerang, pero esto generalmente requiere varios intentos.


La estrategia principal de CastlevaniaBot pasando el puente al comienzo del nivel 6 es continuar moviéndose. Golpea un látigo de enormes murciélagos desde arriba para aturdirlos, y luego rebota sobre los enormes murciélagos que aparecen desde abajo. Además, de vez en cuando necesita esquivar las bolas de fuego lanzadas por los murciélagos o golpearlas con un látigo.


No se garantiza el paso por el puente. Todo depende de cuán amigables serán los enormes murciélagos.

En el siguiente subpaso, CastlevaniaBot usa el cronógrafo del puente dos o más veces para atravesar águilas y puentes. Sin cronógrafo, intenta abrirse camino con un látigo.


Cuando CastlevaniaBot llega a la torre de Drácula, puede subir y bajar las escaleras varias veces para crear velas nuevamente, lo que le permite recoger al menos 20 corazones.


Las velas más a la derecha en las cámaras de Drácula dan agua bendita, que es necesaria para luchar contra la segunda forma de Drácula.

Para derrotar a la primera forma de Drácula se requieren 16 golpes en la cabeza. CastlevaniaBot se acerca a Drácula varias veces, espera a que dispare con bolas de fuego y luego salta sobre las bolas y golpea la cabeza de Drácula con un látigo.


La segunda forma de Drácula, llamada Cookie Monster, es aturdida por el agua bendita por el bot y varias veces golpea la cabeza con un látigo. De vez en cuando Cookie Monster salta hacia el jugador, mientras CastlevaniaBot lo esquiva. Cookie Monster también arroja bolas de fuego, que generalmente pueden destruirse con agua bendita y un látigo. A veces puedes obtener una mejora de arma. Y el agua bendita doble atrapa al Monstruo de las Galletas en un ciclo de aturdimiento constante que conduce a una victoria rápida.


CastlevaniaBot no puede pasar por el modo difícil, que comienza después de los créditos finales. Sin embargo, después de reiniciar el juego en el patio del castillo, restablece el byte del ciclo del juego a cero y lo cambia al modo Normal. Esto permite a CastlevaniaBot jugar sin cesar.




Archivos


CastlevaniaBot_2018-12-09.zip

El archivo .zipcontiene:

  • src - árbol fuente.
  • CastlevaniaBot.jar — .
  • lgpl-2.1.txt — .



Lanzamiento



  • Nintaco — NES.
  • Castlevania (U) (PRG1) [!].nes — ROM .


  1. Nintaco Castlevania (U) (PRG1) [!].nes .
  2. CastlevaniaBot.jar .zip .
  3. Run Program, Tools | Run Program...
  4. JAR , Find JAR....
  5. Load JAR, .
  6. Run.

Copyright © 2018 meatfighter.com

. / LGPLv2.1.

Source: https://habr.com/ru/post/es432784/


All Articles