A comienzos de 1985 llegó a mis manos una revista A.N.A.L.O.G. que traía un juego de Kyle Peacock para digtar: Bopotron!
Se trataba de un juego muy simple en que se controlaba un robot que debía desplazarse por la pantalla con ayuda de plataformas móviles, sin golpearse la cabeza ni caer de mucha altura, para traspasar su energía a unidades descargadas, por lo que además debía recargarse en fuentes de poder ubicadas en otros lugares de la pantalla. Era un puzzle contra el tiempo, e incluía sólo 5 niveles:





Usando el botón del joystick se podía avanzar a mayor velocidad, pero con un consumo mayor de energía.
Pero eso no era todo. La misma revista traía otro programa del mismo autor: Bopotron Construction Set. Este programa permitía crear nuevos niveles para Bopotron! a partir de datos y coordenadas que se ingresaban en pantalla.
Obviamente no me bastó digitar y jugar Bopotron! por una tarde... se me hacían jugo las manos por crear nuevos niveles. Digité el otro programa y a probarlo: fueron varias tardes de verano creando o ajustando niveles. En total, hice 5 niveles más:





Ahora vamos a lo técnico...
Bopotron! estaba programado en BASIC, pero con varias rutinas en assembler. Tanto el código binario como las coordenadas de los elementos en pantalla para dibujar los distintos niveles se almacenaban como secuencias de números decimales en sentencias DATA.
Lo que hacía el programa para crear niveles era generar líneas de DATA numeradas apropiadamente para indicar los elementos que conformaban el nivel indicado. Eso se grababa en disco o cinta como si fuese hecho usando el comando LIST, por lo tanto, después de eso había que cargar el juego con LOAD y agregarle el nuevo nivel usando ENTER. También había que cambiar una variable al comenzo del programa para indicar el máximo de niveles disponibles. Finalmente podías grabar con SAVE el juego modificado para no perderlo. Otra variable al comienzo permitía indicar en qué nivel partir, así se podía probar el nuevo nivel sin pasar por todos los anteriores.
El campo de juego lo conformaba una pantalla de texto, pero en modo ANTIC 4 y con set de caracteres redefinidos para todo tipo de elemento visible, pero estático, como los suelos, las baterías y escaleras. Si nos saltamos las rutinas de inicialización para los caracteres gráficos, el nivel 1 se ve así:

Las componentes móviles fueron implementados con Players/Missiles... estos eran el robot y las plataformas. Se usaba el motor de colisiones del hardware para detectar cuando Bopotron! estaba en el aire y debía caer o cuando era atropellado por una plataforma.
Recuerdo que dibujé los escenarios propios para nuevos niveles en hoja de cuadernillo de matemáticas como guía, porque en hoja de cuaderno universitario no cabía la pantalla completa. La parte interesante era el trazado del recorrido de las plataformas móviles, y había que aprovecharlas para hacer más complicado el juego.
Las plataformas eran manejadas por una rutina en assembler definida como VBI. Sólo había que entregarle las coordenadas de inicio, término y velocidad para cada tramo a recorrer por cada plataforma.
Cuando debía hacer ajustes a los parámetros del nivel de turno, lo hacía modificando directamente sobre las líneas de DATA en el juego, y luego probaba otra vez. Por lo tanto, la porción de codigo BASIC asociado al nivel de turno cambiaba respecto de lo generado inicialmente. Como la idea era guardar cada nivel en forma independiente, hice una rutina que se anexaba a al juego, también usando ENTER, para listar el nivel que se indique. El objetivo era enviar los niveles por correo al autor del juego, pues así lo solicitó él en la revista donde se publicó. Ojo que el correo era postal, no correo electrónico... ¡Estábamos en 1985 y recién comenzaba el furor por el Fax!
En ese proceso también se me ocurrió hacer algunos cambios al juego. Fueron cosas simples, como traducir los mensajes a español y cambiar la inicialización de las rutinas en assembler desde líneas de DATA por strings con todos los caracteres ATASCII para llegar y usar, con lo que se aceleraba notablemente la partida del juego, y además se ahorraba memoria ¡para más niveles!
Otra cosa que me aburría durante el juego era tener que esperar que el robot recargara energía desde las fuentes de poder a la misma velocidad que se descargaba cuando se traspasaba a las unidades descargadas... ¡paf! Ahora la carga era instantánea.
¿Técnico nivel avanzado o muy curioso?
Las rutinas en assembler no son cargadas en posiciones fijas de memoria, sino que en variables tipo string, por lo que el código claramente es relocalizable en memoria. Eso incluye DLI, VBI y la gráfica del robot. Sin embargo, las variables sí están fijas en la página 6 ($0600).
El set de caracteres modificado para la gráfica de los elementos en pantalla es cargado en la memoria libre, justo bajo la memoria que utiliza la pantalla en modo GRAPHICS 0. El cambio del modo 0 a ANTIC 4 se hace modificando directamente la lista de despliegue (DL) original, cambiando al modo de caracteres de 4 colores en 4 pixeles de ancho e indicando cuando aplicar la interrupción (DLI), la cual cambia al vuelo el set de caracteres de normal a color justo debajo del puntaje.
Lo interesante en el desarrollo de este juego, es que la parte en BASIC sólo dibuja los niveles en pantalla, administra la puntuación y el tiempo, e inicializa y coordina las rutinas en assembler. El movimiento del robot (players) y plataformas (missiles) es administrado en assembler durante DLI, es decir, se ubican en la pantalla durante el refresco de un nuevo frame, utilizando las propiedades de colisiones de P/M para detectar como y por donde se puede desplazar el robot o si ha chocado y pierde una vida. Esos estados son almacenados en la página 6 de la memoria y es donde el programa en BASIC controla en un loop para saber qué está pasando.
¿Fue mucha cháchara?
Pueden ver y jugar Bopotron! descargando bopotron.atr. Ese disco tiene DOS 2.5 sin pichicatas ni AUTORUN.SYS, e incluye los siguientes archivos:
- BOPOTRON.BAS: Bopotron! original de la revista con 5 niveles. Correr con RUN "D:BOPOTRON.BAS" en BASIC.
- BOPOTRON: Versión como la digité yo, pero con 9 niveles. Correr con RUN "D:BOPOTRON" en BASIC.
- BOPOMOD: Versión modificada final, con 10 niveles. Correr con RUN "D:BOPOMOD" en BASIC.
- BOPOFAB.NIV: Versión modificada del Construction Set para fabricar niveles. Correr con RUN "D:BOPOFAB.NIV" en BASIC.
- BOPOLST.NIV: Rutina para extraer e imprimir o guardar los niveles en forma independiente. Se carga sobre cualquier versión del juego con ENTER "D:BOPOLST.NIV" en BASIC, con lo que se agrega la linea 0 y de la 9000 en adelante. Usando RUN pasa directamente a la rutina.

Advertencia: Si usan emulador, recomiendo jugar con un joystick real. La dinámica del juego y los tiempos ajustados para cumplir la misión exigen más coordinación y habilidad que la que pueden obtener simplemente usando, por ejemplo, el teclado numérico del PC.
Pueden revisar la línea 160 y ver qué parámetros pueden cambiar, y cuál es su efecto en el juego.