(back to project page)
In Missile Command you are attacked with a wave of missiles and smart bombs. When you finish a wave, you collect bonus points, and your launcher silos are repaired and re-armed. Bonus cities are deployed. As you complete each wave, the attacks become faster and more numerous, and the colors change.
The incoming ordnance changes for each wave up to wave 19. Waves 20 and beyond use the values from wave 19. ICBM speeds increase until they hit their maximum at wave 15.
|Wave||# ICBMs||ICBM frames||# Smart bombs|
"# ICBMs" and "# Smart bombs" are the number of each that will be fired at the player before the wave ends (unless the wave ends early because three cities have been destroyed). If a missile is a MIRV that splits off 2 additional heads, all 3 count toward the total. Some advanced players will wait as long as possible before shooting down an ICBM in the hope of hitting it right as it splits, conserving ABMs.
Revision 2 used lower ICBM counts for waves 17-19, shown above in brackets. Adding one or two ICBMs may not seem like a lot, but remember that the player only has 30 ABMs, so the margin for error on a wave with 22 ICBMs and 7 smart bombs is very small. (See $6090.)
"ICBM frames" is the number of frames that the game waits between moving the ICBMs. A value of zero means it updates the missiles on every frame (~60x/second). Internally this is stored as an 8.8 fixed-point value that is added to a counter. The game can't actually delay for a fraction of a frame, but it can average it out. For example, if the delay were 1.5, the game would delay for 1 frame, then 2 frames, then 1, then 2, and so on.
Missile movements use 8.8 fixed-point math. The game computes the distance from the start point to the target, and advances the missile one unit per frame. The distance is approximate, and is capped at 255, so it's possible for a missile to move more than one pixel per frame.
Smart bomb movement changes slightly in wave 9. The evasion code sets flags indicating the directions of nearby explosions. At wave 9+, if any nearby collisions are detected, the code always sets a flag indicating an explosion directly above. This prevents the smart bomb from moving upward evasively.
Bombers and satellites appear as often as possible, so one frequently appears at the same time as a wave of missiles. The height at which they fly is chosen at random, but in early waves it's nudged higher to give the player more time to deal with any missiles they fire.
Fliers always move at the same speed: one pixel every 3 frames for bombers, one pixel every 2 frames for satellites. After being destroyed or allowed to leave the screen, there is a brief "cooldown" period, during which they will not appear. A separate value controls how many frames must elapse before a missile can be fired by the flier. The firing cooldown is reset when a missile is fired, and begins counting down immediately. All periods are specified in frames (~60Hz).
|Wave||Height range||Cooldown||Fire rate|
|1||no fliers allowed||-||-|
(The flier creation code is at $60ff.)
Bear in mind that the bottom of the screen is line 0, and the top is line 230. The timing values in the table indicate the minimum delay between events. Whether or not a flier fires a missile is affected by the system limits on simultaneous missiles/bombs and the per-wave cap, so it's entirely possible for a flier to sail across the screen without firing anything. Fliers are also able to fire multiple missiles at once.
The colors used are changed every other wave. There are 10 sets of colors, so waves 1, 21, and 41 will look the same.
As noted on the video memory page, most of the screen uses two bits per pixel, allowing only 4 colors. One color is used for the background, two for things like missile trails and scores, and one rotates quickly to create the flashing effect for missile heads and explosions. The bottom 32 lines of the screen support three bits per pixel, allowing for additional colors for the background terrain and the city graphics.
|1 / 2||Black||Yellow||Red||Cyan||Blue||Blue|
|3 / 4||Black||Yellow||Green||Cyan||Blue||Blue|
|5 / 6||Black||Blue||Red||Yellow||Green||Green|
|7 / 8||Black||Red||Yellow||Yellow||Blue||Blue|
|9 / 10||Blue||Yellow||Red||Magenta||Black||Black|
|11 / 12||Cyan||Yellow||Red||Black||Blue||Blue|
|13 / 14||Magenta||Green||Black||Black||Yellow||Yellow|
|15 / 16||Yellow||Green||Black||White||Red||Red|
|17 / 18||White||Red||Magenta||Yellow||Green||Green|
|19 / 20||Red||Yellow||Black||Green||Blue||Blue|
(See $694e for data tables.)
|1 / 2||1x|
|3 / 4||2x|
|5 / 6||3x|
|7 / 8||4x|
|9 / 10||5x|
|[255 / 256]||[256x]|
The rev 2 software has a glitch that causes waves 255 and 256 to multiply their scores by 256. See the code at $5b9e.
The revision 2 ROM increments the wave number steadily, resulting in some odd behavior at the point where the counter rolls over. The revision 3 ROM resets to wave 20 when the game reaches wave 40, which maintains the color change pattern and max difficulty without the weirdness.
See the Revision 2 vs. Revision 3 page for more details.
The "DEFEND CITIES" text only appears for waves 1-3.
Copyright 2021 by Andy McFadden