Investigando sobre el comportamiento de juegos retro mediante IA

Hola a todes:

Alguna otra vez he hablado sobre la parafilia que tengo respecto a los juegos incluidos en el recopilatorio Mega Games I de Mega Drive: Super Hang-On, World Cup Italia 90' y Columns. Juegos que quizá palidecen en calidad respecto a los del Mega Games 2 (Golden Axe, Streets of Rage y The Revenge of Shinobi) pero que nos dieron a muchos jugadores de la época grandes ratos de diversión.

Aprovechando las posibilidades que ofrecen las IAs actuales, he empezado a pasar a Claude.ai las roms de varios juegos y hacerle preguntas sobre su comportamiento.

Iré recopilando en este hilo sus desvaríos. Quien esté interesado en aportar, que vaya poniendo aquí también lo que le parezca interesante. Al fin y al cabo utilizo la versión gratuita y se me acaban los tokens enseguida. [+risas]

He empezado con el Columns.

Resumiendo, las Magic Jewels salen en el modo sólo una vez en el modo Novice sólo bajo una condición, en las otras dificultades sale más de una vez. También explica la progresión de niveles y dice que el juego no lee la situación del tablero para decidir los colores de la siguiente ficha, vamos, que no hace putadas a propósito.

En una pregunta adicional, contesta sobre el tempo de la música durante la partida.


COLUMNS - Dudas sobre el juego. Hola, te paso la rom del juego columns. Tengo varias dudas:

1. Bajo qué condiciones sale la magic jewel? ¿Puede salir más de una vez a lo largo de una partida del modo arcade?

2. ¿Cómo es la progresión de niveles del modo arcade en cuanto a velocidad?

3. ¿El juego analiza la situación de la partida y las fichas que hay en el tablero para decidir la siguiente ficha que sale o es completamente al azar? Es decir, ¿el juego sabe hacer putadillas para perjudicar al jugador?


Checking the uploaded file's contents.
Checking the uploaded file's contents.
Voy a echar un vistazo al archivo que has subido.

Ejecutó 31 comandos, leyó un archivo
Lo he sacado desensamblando la ROM (68000), no jugando, así que son lecturas del código sin probar en emulador. Dejo las direcciones por si quieres comprobarlo.

1. Magic jewel
En Arcade, al empezar eliges clase (Novice, Amateur o Pro, con cuenta atrás de 10 s; rutina en $6920). La condición depende de esa clase:

Novice: sale como máximo una vez por partida. Es un salvavidas por altura (rutina $7322). Se cumplen a la vez estas condiciones:
El nivel es 0–3. Si llegas al nivel 4 sin que haya salido, ya no sale nunca.
Al menos 2 de las 6 columnas llegan a la fila 5 contando desde arriba, es decir, la pila tiene unas 9 filas de las 13.
Entonces la siguiente ficha que se genera es la magic jewel. Un flag interno ($70(a1)) se activa y bloquea cualquier repetición.
Amateur y Pro: sí puede salir varias veces. Aquí la altura no cuenta. Sale cuando el contador de jewels eliminadas supera un umbral. El primer umbral es 100 jewels y el salto entre umbrales crece 50 cada vez. Los umbrales son 100, 250, 450, 700, 1000, 1350, 1750, 2200…
Esos valores salen de las constantes del código; el significado que les doy (contador de jewels, nivel) es deducido.

2. Velocidad por nivel
El nivel sube cuando las jewels eliminadas alcanzan un umbral. Los valores salen de la tabla de $617E, que depende de la opción DIFFICULTY (ARCADE):

Dificultad Jewels por nivel
Normal 35
Easy 40
Easiest 50
Hard 25
El primer umbral es fijo: 35 en Novice y 50 en Amateur/Pro. Amateur empieza en nivel 5 con 20.000 puntos, y Pro en nivel 10 con 50.000.

La caída funciona así (rutina $59AE, tablas en $7E80 y $7F50):

Cada ficha nace con una velocidad inicial según el nivel y acelera un poco cada frame, con tope de 1 fila por frame.
Interpreto la velocidad como 16 px por jewel y px/frame, lo cual es una deducción mía.
El índice de la tabla se satura en el nivel 25.
Velocidad inicial en filas por segundo aproximadas (tabla Amateur/Pro, a 60 Hz; en la versión europea a 50 Hz irá algo más lenta):

Niveles Velocidad inicial (px/frame) Frames por fila al nacer
0 0,25 64
1 0,5 32
2 0,75 21
3 1 16
4 2 8
5 3 5
6 a 10 1, 2, 3, 4, 5 16 a 3
11 a 20 2 a 11 8 a 1
21 a 25 12 a 16 1
La progresión no es monótona: la velocidad inicial baja al pasar a los niveles 6 y 11, donde también cambia la música. La aceleración por frame también se reinicia en esos puntos y en el 21.

Novice usa una tabla casi igual, pero los niveles 3, 4 y 5 son más lentos (0,75, 1 y 2 px/frame en vez de 1, 2 y 3).

3. ¿El juego te hace putadillas?
No. En Arcade, la ficha sale de un generador pseudoaleatorio ($5428, uno por jugador). Lo único que consulta es el modo de juego, así que no mira el tablero. Cada ficha son 3 tiradas independientes, no hay tirada de reajuste ni sesgo por el estado de la partida.

Dos matices:

Colores no uniformes: se coge un valor de 0 a 7 y los valores 6 y 7 se pliegan sobre 0 y 1. Resultado: dos de los seis colores salen el doble que los otros cuatro (25 % cada uno frente a 12,5 %), si los bits bajos del generador son equilibrados. Eso puede dar sensación de “siempre los mismos”.
Semilla determinista: la semilla global solo se avanza al empezar partida. No he visto que dependa del mando ni de ningún temporizador. Si es así, la secuencia de la primera partida tras encender o resetear sería siempre la misma. Esto no lo he verificado en emulador.
Lo que sí se parece a una ayuda del juego es la magic jewel de Novice, que aparece cuando vas mal de altura


¿Con qué condiciones cambia el tempo de la música?


Tracing a flag that toggles at specific levels
Voy a mirar el código que toca ese flag de sonido y, si se puede, el driver Z80 que lo lee.

Ejecutó 2 comandos
Con certeza solo he podido confirmar un mecanismo, el de los niveles. Hay un segundo mecanismo ligado a la altura de la pila, y de ese solo he podido leer el código del lado del 68000. Del driver de sonido (Z80) he visto trozos sueltos, así que parte de lo que sigue es inferencia.

1. Por nivel (confirmado)
Al subir de nivel, la rutina de $6102 compara el nivel con 6, 7, 11 y 12:

Al llegar al nivel 6 o al 11 escribe un 1 en la dirección del driver de sonido $A01C18.
Al llegar al nivel 7 o al 12 escribe un 0 en esa misma dirección.
Al empezar la partida se pone a 0 (rutina $523A).
En el código del Z80 hay un trozo que lee ese flag justo al cargar el valor de tempo de una pista. Si el flag es distinto de cero, coge un segundo byte alternativo en lugar del primero. Es decir, cada pista parece llevar dos tempos, uno normal y uno rápido, y el flag elige cuál se usa. Con eso mi lectura es que en los niveles 6 y 11 la música pasa a tempo rápido.

Lo que no sé es si el cambio dura. El flag vuelve a 0 un nivel después, y el driver solo lo mira cuando empieza una pista, así que el efecto real depende de cuándo vuelva a arrancar esa música. Sin emulador no lo puedo confirmar.

Corrijo además lo que dije antes: hablé de que “cambia la música” en esos niveles. Lo único que he visto escribirse es ese flag de tempo, no un cambio de tema.

2. Por altura de la pila (parcial)
Otra rutina ($7138) cuenta cuántas filas libres quedan arriba en el tablero y modifica dos valores del driver:

Filas libres por rango: con 3 filas libres o menos, activa un modo especial ($A01C08 = $80, periodo $40). Con 4 o más filas libres, desactiva ese modo y pone un periodo que va de $40 (4 filas libres) bajando hasta 4 (11 o más filas libres).
Qué hace el driver con ello: cada cierto número de frames, según ese periodo, incrementa un contador interno en 10 pistas.
No he podido determinar si eso acelera o frena la música, ni si es un efecto audible de “peligro” o algo distinto. Para saberlo habría que desensamblar el driver Z80 entero, o simplemente jugar y fijarse en si el tempo cambia al llenarse el tablero.

Las direcciones por si quieres mirarlas tú: $6102 (niveles), $6152 y $615C (escritura del flag), $7138 (altura de la pila), tabla en $7194, y el Z80 hacia $1267C.
MIS OGOS!

Dios santo benidto, totalmente ilegible [carcajad]
chuckyflame escribió:MIS OGOS!

Dios santo benidto, totalmente ilegible [carcajad]

Quito el color azul. [+risas]
kaironman escribió:
chuckyflame escribió:MIS OGOS!

Dios santo benidto, totalmente ilegible [carcajad]

Quito el color azul. [+risas]


Gracias compi jeje, aunque el verde fosforito sobre fondo veig no agrada tampoco a mi retina [carcajad]
3 respuestas