Asteroids: el reto de los asteroides que siempre se expanden (solución)

No podemos rematar la faena sin resolver el gran misterio. ¿Por qué cada vez había más asteroides expandidos y menos sin expandir?

La respuesta no estaba en la rutina “actualizaAsteroidesActivos”, como podría parecer, sino que estaba en la rutina “configuraAvanzada” de la librería “LibSprites.asm”. La versión original de esta rutina era así:

Asteroids - Rutina configuración avanzada

Si estudiamos la parte de la rutina dedicada a la expansión (líneas 148 – 164) veremos que la rutina es capaz de pasar de una situación inicial en que el sprite no está expandido, a otra situación final en que sí lo está. Esto se consigue haciendo “ora XXPAND” y “sta XXPAND”, para la expansión horizontal, y “ora YXPAND” y “sta YXPAND”, para la expansión horizontal.

Pero la rutina no es capaz de deshacer esa situación. Es decir, la rutina no es capaz de “desexpandir” un sprite que previamente ya está expandido.

Es decir, la rutina se diseñó para, partiendo de la situación inicial o de arranque del C64 en que ningún sprite está expandido, expandir los sprites que se desee. Pero no se diseñó para hacer también el camino contrario.

Por ello, según avanzaba el juego, algunos asteroides se expandían y otros no. Los expandidos nunca se “desexpandían”. Y los no expandidos, por el mero paso del tiempo y los juegos de probabilidades, antes o después acababan expandidos, sin poder salir de ahí. Al final, todos expandidos.

Sin embargo, a partir de la versión 19 del proyecto, esta rutina se mejora y pasa a ser así (sólo parte dedicada a la expansión):

Asteroids - Rutina configuración avanzada mejorada

Es decir, cuando “caExpansionH” vale 0:

  • Con “lda tablaSpr,x” se obtiene un byte con todos los bits a 0 menos el correspondiente al sprite, que estará a 1.
  • Con “eor #%11111111” se cambian todos los bits de ese byte. Es decir, quedan a 1 todos los bits, menos el correspondiente al sprite, que queda a 0.
  • Con “and XXPAND”y “sta XXPAND” lo que se consigue es desactivar la expansión horizontal del sprite en cuestión.

Y lo mismo para la expansión vertical cuando “caExpansionV” vale 0.

Espero que esto aclare el misterio. A mí me tuvo loco mucho tiempo 🙂 .

2 comentarios en «Asteroids: el reto de los asteroides que siempre se expanden (solución)»

  1. Pues menos mal que se solución el tema de increíble asteroide menguante!
    Leer los avances de semana en semana, luego me encontraba con tantos avances que digerirlos era tarea difícil.
    Y eso que los apuntes los dejas muy claros y las explicaciones muy concisas. Pero o se está al hilo… o acabas perdido. 🙂
    Siempre hay una variable tonta por ahí perdida que no se resetea al salir de una rutina o cosas de esas que acaban a uno volviéndole tarumba. 😉

    Me gusta

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s