I have fond memories of the Mexico City's subway system (in Spanish, Metro) Some stations and terminals have been remodeled over the years, and even the transport buses have been changed several times. The typical transport in the 90s was a microbus (or small bus) painted in grey with sides in green, and pretty comfortable seats.
I was traveling on a modern two-floor bus running on Av. Reforma, and thinking about the old times, and how the microbuses are going to be retired for good (for the nth time) this year 2026, along with a complete rebuild of the Cuatro Caminos subway terminal. And I had an idea! What about aliens in the subway? Our hero riding a bus thru the terminal shooting big-head aliens from Mars. This idea made me chuckle, for sure a good sign of success, because any idea that makes you chuckle must be good! This was around February 13.
Hands at work
I found the MSXdev'25 contest was running with about a month to close. More serendipity, a few days ago I just had implemented MSX2 support in my CVBasic compiler. So the idea was now perfectly enclosed: an MSX2 game, using a nice color palette, with smooth-pixel scrolling, three-color sprites, well-animated sprites, and imaginative backgrounds from a lost era.
But before doing this, I needed a core to test my idea. I made a movable block around a small space, and eight-direction shooting, along other blocks (enemies) "flying" above, thrusted towards the player, and patrolling the bottom of the screen. Once this was ready in the afternoon of Feb/14, I was satisfied with the gameplay feeling.
The preliminary game engine.
Let's do the title screen
Because the time constraints, and although I'm capable of drawing, there are people doing it far better than myself. I went into a shopping spree in itch.io, and I got the artwork for the player and aliens for the stage 1. I've a set of rules for doing games, and one of these is: NEVER start by the title screen.
But I guess that rules are made to be broken, so I took my Bandai's SHFiguarts and I started putting it in the pose I wanted for the title screen, I made some pictures, used Paint .net for removing the background, posterized it, and colorized it, adding along the agent face from the assets I bought.
The toolkit for posing.
A very common thing in games for MSX computers is the use of the innatural color palette. But with MSX2, the developer can choose the 16 colors from a palette of 512 colors (3 bits for red, 3 bits for green, and 3 bits for blue). This time the hero could have brown hair, and military green pants, and the title letters could cycle colors like fire.
The pose for the title screen.
Stage 1
Encouraged by the title screen, I drew the scrolling background for the stage 1, later the microbus, and it started looking really nice once the palette was adjusted for the city's blue-grey tones. I didn't want to limit the game to MSX2+ (notice the plus sign), so I designed the levels for SCREEN 4 like one of my beloved games Space Manbow from Konami, and I made it to scroll using only tiles.
Tile scrolling limits the complexity of the background, but in return it allows for very fast scrolling. This can be noticed in the stage 1, the placard doesn't read Cuatro Caminos instead it reads Toreo, as this is a local slang for the same metro station.
I set myself an objective: Every player/monster displayed on the screen should have 3 colors (two defined ones and black) by using the OR feature of the V9938 sprite mode 2 (I got the required information from The OR Color) I reserved the colors 6 and 9 for the player (OR'ed this is 15), colors 13 and 14 for the enemies (OR'ed this is also 15) The color 15 is set to black using the palette, so both the player and enemies share the black color. The color 1 is always white, and the color 2 is reserved for the bullets.
The sprite mode 2 available in MSX2 allows for a different color in each sprite line, however, these are 16 bytes to be updated for each sprite (up to 32 sprites). To avoid all these updates, I decided for a static color set, and separated the sprites in blocks. One block contained the player, another the bullets, another the enemies, and the final one a special sprite. Every block has its own color definitions but static along the stage being played, because the scrolling already uses a lot of bandwidth to update the screen. The MSX2 platform has the advantage of having faster VRAM access at 23 cycles per byte, while the old video processor was limited to 28 cycles per byte.
The game's stage 1 using sprite mode 2.
I had to adapt the sprites I bought from itch.io because these were developed for a 640x480 pixels resolution, I had to scale them down using ASEsprite (buy this!) removed the extra colors, and I made some manual retouching. Once the player and the enemies appeared on the screen, the game suddenly come to life.
One advantage of using the CVBasic compiler is that you don't need to worry about where the variables and arrays are kept, also the high-level constructs allow fast coding of loops to process enemies or bullets, and if code needs to be moved it isn't necessary to keep track of internal details.
The music is composed of songs intended for Princess Quest 2 and composed in 2021 by my brother Adán. However, Princess Quest 2 never materialized, so the songs stay saved away in my hard disk.
Completing the game
I kept drawing stages the following days, and the programmable palette allowed me to draw freely without worrying about too bright colors or non-existent colors. As I was drawing a subway, one of my proud moments was adding a moving subway in the orange color used in Mexico.
Once the stages were ready, it was time to start thinking in the bosses. I already had one, but I searched again in itch.io for two more bosses. For a fast deployment, I opted for selecting frames of the bosses, fitting into the available tiles, and then I decided the attack patterns.
With the game completed, I started polishing it, adding stage titles, adjusting enemies' appearance times, stage lengths, bosses' attacks patterns, and correcting any minor bug detected. Also, I tested on my Sony HB-F1XDJ MSX2+ computer to make sure the game works with real hardware.
I was about to send the first version to the contest, when I decided I needed a Japanese title above the letters. I did the translation with Google Translate as 地下鉄戦争 Chikatetsu sensō, and put it over the title letters. I needed help checking whether this was correct, and I reminded I followed the legend Toshiaki Sakoda (who worked at Compile around 1988 to 1996), I wrote him, and he was kind enough to help me confirm it was correct. Thanks for your time Sakoda-san!
Of course, after sending the first version you discover... things. For example, a Continue key is required so first-time players can complete the game, also I noticed there's just enough sprite space to add a doctor to recover your energy. Along a report that the second button didn't work, this one was a little tricky because I didn't had a MSX joystick with two buttons.
I took a Sega Master System controller, removed the cable (the 2nd button pin for MSX doesn't exist in the Sega cable), and I put a cable from a Chinese controller that used the 9 pins to emulate controllers for different consoles. Later, I discovered I had a Joymega adapter that I got as a gift from my good friend Jason Schelhorn, and it adapts a Sega Genesis controller to MSX. I didn't found any bug, but I optimized the CVBasic's joystick reading code.
Sega Master System controller adapted for MSX and Joymega adapter.
Along this, I decided to bring in the FM synthesis code from my game Mecha-9 (2014) to CVBasic, allowing for any CVBasic program to have FM music, and choosing instruments for each song as required. The FM music requires some extra processor cycles for playing it as the access to the FM chip is done by calling the synthesis ROM through the MSX BIOS, so I had to optimize the CVBasic code generation to get free cycles.
The FM music certainly put punch in the soundtrack. I sent this update to the MSXdev'25 as v1.1, and because of the Murphy's Law, a few hours later, Takamichi posted that the second button always worked, but the player couldn't jump and shoot at the same time. Oh well, that was the bug.
A small bug
I found I only had to copy and paste the jumping code before the firing code, but this also broke the player animation code, because shooting in any direction didn't changed the player frame.
While looking at this, I considered writing an incredibly complicated state machine, but I found a simple solution for the animation problem, and I discovered that a lot of the animation frames weren't used. The player ended looking even better, and while I was on that, I added details to the background buildings in stage 1. This was update v1.2.
Epilogue
At the end, Metro Wars was developed in only 27 days, including five stages, six different enemies, three bosses, and eleven background songs; the tools used were CVBasic, gasm80, Paint .net, ASESprite, and a fast-hack utility to process the sprite frames and create the 3-color sprite definitions. I remember my first game for the MSXdev'10 was Zombie Near, and it was developed in 21 days almost without tools, except for the assembler and GW-BASIC used to code a sprite editor and music tool.