Kabosu - Creando cosas

Logo de la página. Gato esférico con colores verdoso.

Bot Animal Crossing

Publicado: 2026-01-10

Etiquetas: Juegos, Mastodon, Python


Buenos días, tardes o noches:

En este artículo voy a contar un poco sobre un bot para Mastodon que publica frases del juego Animal Crossing de Switch. Lo hice hace un mes pero no lo había contado por aquí porque pensaba ampliarlo un poco pero después de investigar un poco he decidido dejarlo como está.

El juego

Lo primero que hice fue conseguir la ROM del juego. Lo bajé del eMule. En casa tenemos 3 veces el juego (dos en físico y una digital) así que realmente me bajé una "copia de seguridad".

Eran unos fichero con formato NSP. Uno era el juego y los otros DLCs según tengo entendido. El siguiente paso era extraer los ficheros de dentro para buscar los diálogos. No tenía ni idea de cuál era la estructura de las ROMs de Switch así que tuve que probar diversos programas para intentar extraer el contenido. Al final con el emulador Yuzu y unas claves lo conseguí.

Me sorprendió que en mi portátil de hace 10 años el emulador funcionaba y, aunque algo escaso de frames por segundo, el juego era funcional.

Los diálogos

Con el contenido de la ROM desencriptado tenía que encontrar y extraer los diálogos. Había un directorio llamado "Message" que contenía un montón de ficheros con nombres que empezaban por "Dialog", "Talk" y cosas así. Era prometedor. Mi problema era que no sabía interpretar esos ficheros que estaban en un extraño formato y tenían la extensión ".zs".

Encontré un repositorio con código Python llamado AC-Dataparse que, según su propia descripción tiene:

Scripts for datamining dialogue files from Animal Crossing: New Horizons

Usé eso para extraer el contenido de los ficheros .zs aunque tuve que modificar el código porque esos scripts solo trabajan con algunos textos como los nombres de los objetos y yo quería conversaciones. Hice que extrajese también los diálogos de los personajes, que se limitase solo al español y arreglé algunos errores que ocurrían al parsear esos nuevos ficheros.

Por lo que vi, los textos en Animal Crossing contienen unos caracteres especiales que luego se reemplazan por cosas como el nombre de la isla, nuestro nombre y cosas así. También encontré un código que creo que se usa para poder alterar el diálogo dependiendo del género. Por ejemplo para cambiar "amigo" por "amiga" si está hablando con una chica. El código original de AC-Dataparse no necesitaba de muchos de esos códigos y fallaba al encontrarlos.

Contenido para el bot

Mi idea era hacer un bot de Mastodon que, cada cierto tiempo, publicase un diálogo de algún personaje de Animal Crossing pero al extraer los textos me encontré que no hay frases para cada personaje sino que están divididos por tipos (normal, jock, cranky, sisterly, etc). Además los mensajes de gente de la aldea están cargados de código de control que tendría que procesar e inyectar los valores que tocase. Mucho trabajo.

Al final, ojeando los ficheros encontré los mensajes de Pascal una nutria que aparece en el mar y dice frases filosóficas o bromas a cambio de vieiras. Unos ejemplos:

Pascal tiene los diálogos perfecto para un pequeño bot.

El bot

Metí todas las frases en un fichero txt, una por línea. En un script de Python cargo todas con este código:

def readFile(path):
    results = []
    with open(path, 'r') as fin:
        for line in fin:
            line = line.strip()
            lines = line.split('\\n')
            line = '\n'.join(lines)
            results.append(line)
    return results
        
results = readFile('pascal.txt')

Luego dentro de un bucle infinito elijo una y uso la API de Mastodon para añadir el mensaje. Tras esto espero 11 horas antes de volver a publicar un mensaje para no saturar a la gente.

while True:

    toot = random.choice(results)
    toot = ':ac_pascal: ' + toot

    mastodon = Mastodon(
        access_token='secreto',
        api_base_url='https://tkz.one'
    )

    mastodon.toot(toot)
    time.sleep(11 * 60 * 60)

Y ya está. Ese es el bot entero. Ahora mismo se está ejecutando en mi ordenador en segundo plano así que solo publica mensajes si coincide que tengo el portátil encendido en ese momento. Debería trasladar el bot a mi servidor casero.

El ":ac_pascal:" que aparece en el script es un emoji que hay en la instancia de Mastodon que muestra la cara de Pascal. Los mensajes quedan así:

Cara de pascal como emoji seguida del texto: ¿Por qué son tan largas palabras como "emergencia" o "apocalipsis"? ¡Menos hablar y más correr!

Mejoras

Estuve buscando otros posibles diálogos para el bot pero todos serían costosos de añadir por los código que utilizan. Por ejemplo en Navidad quería poner mensajes de Copito el muñeco de nieve pero vi que en muchos de ellos pone el nombre de la isla. Debería poner algún valor ahí cada vez y no sabía que poner. Mi isla se llama Cinnamon porque el día que empecé a jugar a Animal Crossing habíamos comido en un restaurante con ese nombre.

Los peces y bichos eran la mejor opción. Cuando pescas/cazas uno sale una pequeña rima y no parece que haya código extraños que necesite procesar. Probé a publicar alguno pero me gustaba más el estilo de las frases de Pascal así que los quité.

Por tanto, el bot se va a quedar únicamente con las frases Pascal por el momento. Hay 287 y poniendo una cada 11 horas hay contenido para mucho tiempo.


Artículo anterior: Reto Open Source: Busybox