Tengo buenos recuerdos del sistema de metro de la Ciudad de México. Algunas estaciones y terminales se han remodelado a través de los años, e incluso los autobuses de transporte han cambiado varias veces. El transporte típico en la década de 1990 era un microbús pintado en gris con lados en verde y asientos muy cómodos.
Estaba viajanado en un bus moderni de dos pisos por la Av. Reforma y pensando en los viejos tiempos, y en como los microbuses van a ser retirados por fin (por enésima vez) este año 2026, junto con una reconstrucción completa de la terminal de metro Cuatro Caminos. ¡Y tuve una idea! ¿Qué tal alienígenas en el metro? Nuestro héroe sobre un veloz microbús disparando a monstruos cabezones de Marte. Esta idea me hizo sonreír, por seguro un buen signo de éxito, porque cualquier idea que te haga sonreír debe ser buena. Esto fue por el 13 de febrero.
Manos a la obra
Me di cuenta que el concurso MSXdev'25 estaba en marcha con apenas un mes para cerrar. Más casualidad, unos pocos días antes había implementado soporte para MSX2 en mi compilador CVBasic. Así que la idea estaba perfectamente englobada: un juego MSX2, usando una bonita paleta de color, con scroll suave de pixel, sprites de tres colores, sprites bien animados, y fondos imaginativos de una época perdida.
Pero antes de hacer esto, necesitaba un núcleo para probar mi idea. Hice un bloque movible en un pequeño espacio con disparos en ocho direcciones, juntos con otros bloques (los enemigos) "volando" encima, dirigidos hacia el jugador, y patrullando la parte baja de la pantalla. Una vez que estuvo listo en la tarde del 14 de febrero, quedé satisfecho con el "feeling" del juego.
El núcleo preliminar del juego.
Hagamos la pantalla de título
Debido a las limitaciones de tiempo, y aunque soy capaz de dibujar, hay personas que lo hacen mucho mejor que yo. Me metí a comprar en itch.io y obtuve el arte para el jugador y los alienígenas del nivel 1. Tengo un conjunto de reglas para hacer juegos, y una de esas es: NUNCA comiences por la pantalla de título.
Me imagino que las reglas están hechas para ser rotas, así que tomé mi SHFIguarts de Bandai y comencé a ponerla en la pose que quería para la pantalla de título, hice algunas fotos, usé Paint .net para eliminar el fondo, postericé y coloree, agregando también la cara del agente del arte que compré.
Los maniquies para posar.
Algo muy común en juegos para computadoras MSX es el uso de su paleta de color poco natural. Pero con MSX2, el desarrollador puede escoger los 16 colores de una paleta de 512 colores (3 bits para rojo, 3 bits para verde y 3 bits para azul). Esta vez el héroe puede tener cabello castaño, pantalones verde militar, y las letras del título puede ciclar colores como fuego.
La pose para la pantalla de título.
Nivel 1
Con ánimos al ver como iba la pantalla de título, dibujé el fondo que se desplaza para el nivel 1, después el microbús, y comenzó a verse realmente bien una vez que la paleta fue ajustada para los tonos azul-gris de la ciudad. No quise limitar el juego a MSX2+ (note el signo de suma), así que diseñé los niveles para SCREEN 4 como uno de los juegos que admiro Space Manbow de Konami, y lo hice desplazarse usando solo tiles.
Desplazar el fondo con tiles limita la complejidad, pero permite desplazamiento muy rápido. Esto se puede notar en el nivel 1, la placa de la estación no dice Cuatro Caminos sino Toreo, esta es la jerga local para la misma estación del metro.
Me puse un objetivo: Cada jugador/monstruo mostrado en la pantalla debía tener 3 colores (dos definidos y negro) usando la característica OR del modo de sprite 2 del V9938 (obtuve la información requerida de The OR Color) Y reservé los colores 6 y 9 para el jugador (hacer OR da 15), colores 13 y 14 para los enemigos (hacer OR da también 15). El color 15 se pone a negro usando la paleta, así que el jugador y los enemigos comparten el color negro. El color 1 siempre es blanco y el color 2 se reserva para las balas.
El modo de sprite 2 disponible en MSX2 permite un color diferente en cada línea de sprite, sin embargo, son 16 bytes que deben ser actualizados por cada sprite (hasta 32 sprites). Para evitar estas actualizaciones, decidí un conjunto de color estático, y separé los sprites en bloques. Un bloque contiene el jugador, otro las balas, otro los enemigos, y uno final un sprite esepcial. Cada bloque tiene sus propias definiciones de color pero estáticas mientras se juega el nivel, debido a que el desplazamiento de la pantalla ya usa mucho ancho de banda para actualizar la pantalla. La plataforma MSX2 tiene la ventaja de tener acceso de VRAM más rápido a 23 ciclos por byte, mientras que el procesador de video viejo esta limitado a 28 ciclos por byte.
El nivel 1 del juego usando el modo de sprite 2.
Tuve que adoptar los sprites que compré de itch.io porque estaban diseñados para una resolución de 640x480 pixeles, tuve que hacerlos más pequeños usando ASEsprite (¡compren!) eliminé los colores extras, e hice un poco de retoque manual. Una vez que el jugador y los enemigos aparecieron en la pantalla, el juego empezó a lucir.
Una ventaja de usar el compilador CVBasic es que no se requiere preocuparse de donde están las variables y arreglos, también las construcciones de alto nivel permite codificar bucles rápidos para procesar enemigos o balas, y si el código necesita moverse no es necesario estar viendo los detalles internos.
La música se compone de tonadas diseñadas para Princess Quest 2 y compuestas en 2021 por mi hermano Adán. Sin embargo, Princess Quest 2 nunca se materializó y la música estaba guardada en mi disco duro.
Terminando el juego
Seguí dibujando los niveles los días siguientes, y la paleta programable me permitió dibujar libremente sin preocuparme de colores muy brillantes o colores faltantes. Mientras dibujaba un metro, uno de mis orgullos fue agregar un metro que se mueve en el color naranja usado en México.
Una vez que los niveles estuvieron listos, era tiempo de pensar en los jefes finales. Ya tenía uno, pero busqué de nuevo en itch.io por dos jefes más. Para implementación rápida, seleccioné cuadros de los jefes, los compacté a los tiles disponibles, y después decidí los patrones de ataque.
Con el juego terminado, comencé a pulirlo, agregué títulos de nivel, ajusté los tiempos de aparición de los enemigos, tamaño de niveles, patrones de ataque de los jefes, y corregí cualquier bug menor detectado. También lo probé en mi computadora Sony HB-F1XDJ MSX2+ para asegurarme de que funciona en hardware real.
Estaba a punto de enviar la primera versión al concurso, cuando decidí que necesitaba un título en japonés sobre las letras. Hice la traducción con Google Translate como 地下鉄戦争 Chikatetsu sensō, y lo puse sobre las letras del título. Necesitaba ayuda para ver si esto era correcto, y recordé que seguía a la leyenda Toshiaki Sakoda (quien trabajó en Compile de 1988 a 1996), le escribí, y fue muy amable de ayudarme a confirmar que era correcto. ¡Muchas gracias Sakoda-san!
Por supuesto, después de enviar la primera versión se descubren... cosas. Por ejemplo, que se requiere una tecla de Continue para que los jugadores nuevos puedan terminar el juego, y también vi que había suficiente espacio de sprites para añadir una doctora que recupera tu energía. Tuve también un reporte de que el segundo botón no servía y esto era un poco difícil porque no tenía un joystick MSX con dos botones.
Tomé un control de Sega Master System, le quité el cable (el pin del segundo botón para MSX no existe en el cable Sega) y le puse un cable de un control chino que usa los 9 pines para emular controles para diferentes consolas. Después descubrí que tenía un adaptador Joymega que me regaló mi buen amigo Jason Schelhorn y adapta controles de Sega Genesis a MSX. No encontré ningún bug, pero optimicé el código de lectura de joystick de CVBasic.
Control de Sega Master System adaptado para MSX y un adaptador Joymega.
Junto con esto, decidí traer el código de sintesis FM de mi juego Mecha-9 (2014) a CVBasic, permitiendo que cualquier programa CVBasic pueda tener música FM y escoger los instrumentos para cada canción. La música FM requiere ciclos extras de procesador para tocar, ya que el acceso al chip FM se realiza llamando a la ROM de sintesis a través del BIOS MSX, así que tuve que optimizar la generación de código de CVBasic para obtener ciclos libres.
La música FM ciertamente le añade encanto al soundtrack. Envié esta actualización al MSXdev'25 como v1.1, y debido a la ley de Murphy, unas pocas horas después, Takamichi posteó que el segundo botón si funcionaba, pero el jugador no podía saltar y disparar al mismo tiempo. Oh bueno, ese era el bug.
Un pequeño bug
Descubrí que solo tenía que copiar y pegar el código de salto antes del código de disparo, pero esto rompía el código de animación del jugador, porque disparar en cualquier dirección no cambiaba el cuadro del jugador.
Mientras revisaba esto, consideré escribir una máquina de estados muy complicada, pero encontré una solución simple al problema de animación, y también vi que muchos cuadros de animación no se usaban. El jugador terminó viéndose mejor, y mientras estaba en esto, agregué detalles a los edificios en el fondo del nivel 1. Esta fue la actualización v1.2.
Epílogo
Al final, Metro Wars fue desarrollado en solo 27 días, incluyendo cinco niveles, seis enemigos diferentes, tres jefes finales, y once pistas de sonido; las herramientas usadas fueron CVBasic, gasm80, Paint .net, ASESprite, y una utilidad codificada muy rápido para procesar los cuadros de sprite y crear las definiciones de sprite de 3 colores. Recuerdo que mi primer juego para el MSXdev'10 fue Zombie Near, y fue desarrollado en 21 días casi sin herramientas, excepto por el ensamblador y GW-BASIC que se usó para codificar una herramienta de sprites y de música.